博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis学习笔记(六)动态sql
阅读量:3528 次
发布时间:2019-05-20

本文共 3741 字,大约阅读时间需要 12 分钟。

在一些情况下,如查询参数不确定时,需要用到动态sql

例子,根据动态输入的查询条件查询student.

一.if语句

1.StudentTMapper

package com.skymr.mybatis.mappers;import java.util.List;import java.util.Map;import com.skymr.mybatis.model.Student;public interface StudentTMapper {	public List
searchStudents(Map
map);}
map参数是查询条件

2.StudentTMappler.xml

3.测试

package com.skymr.mybatis.service;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.ibatis.session.SqlSession;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.skymr.mybatis.mappers.StudentTMapper;import com.skymr.mybatis.model.Student;import com.skymr.mybatis.util.MybatisUtil;public class StudentTest4 {	private Logger logger = LoggerFactory.getLogger(StudentTest4.class);		private SqlSession session;		@Before	public void beforeTest(){		session = MybatisUtil.openSession();	}	@After	public void afterTest(){		session.close();	}		@Test	public void testSearch(){		logger.info("测试查询学生");		StudentTMapper mapper = session.getMapper(StudentTMapper.class);		Map
map = new HashMap
(); map.put("name", "%aaa%"); map.put("age", 111); List
list = mapper.searchStudents(map); logger.info(list.toString()); } }

二.choose,when ,otherwise

Sometimes we don’t want all of the conditionals to apply, instead we want to choose only one caseamong many options. Similar to a switch statement in Java, MyBatis offers a choose element.Let’s use the example above, but now let’s search only on title if one is provided, then only by authorif one is provided. If neither is provided, let’s only return featured blogs (perhaps a strategically listselected by administrators, instead of returning a huge meaningless list of random blogs).
有些时候我们不想所有的条件都使用到,只想在所有条件中选择一个条件.与java的switch语种相似,Mybatis提供了一个元素.让我们做个例子.
上面的例子是引用Mybatis文档.

自己的例子:

三.trim, where, set元素

1.当没有条件时,有可能会生成这样的sql

SELECT * FROM BLOGWHERE

如果不在后边加入 1=1,则应该加上where标签

改成这样就可以避免以上情况.
2.还有这种情况

SELECT * FROM BLOGWHEREAND title like ‘someTitle’
需要去年多余的and /or

同样,update set语句也会出现多余的","的问题

update Author
username=#{username},
password=#{password},
email=#{email},
bio=#{bio}
where id=#{id}
也可以使用trim修改

update Author
username=#{username},
password=#{password},
email=#{email},
bio=#{bio}
where id=#{id}
四.foreach元素

这是一个非常有用的动态sql元素,用来遍历集合,常应用于IN语句中,例:

IN condition. For example:

foreach元素非常强大,它允许你指定一个集合,声明item和index变量,在元素内部使用.生成有"开始/结尾/分隔符"的字符串,这个元素非常智能,它不会不小心添加额外的分隔符.

记住,你可以把一个List实例或者一个数组当作参数传递到MyBatis.当你这样做了,MyBatis会自动放到一个Map里.List实例会以"list"作为Key值,数组实例会以"array"作为Key值.

foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名.
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.
open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符.
close表示以什么结束.

上面的例子生成的sql相当于

  SELECT *

  FROM POST P
  WHERE ID in (?,?,?)

转载地址:http://jnihj.baihongyu.com/

你可能感兴趣的文章
iOS 代码的Taste(品位)
查看>>
iOS开发代码规范
查看>>
iOS组件化实践(基于CocoaPods)
查看>>
【iOS学习】RxSwift从零入手 - 介绍
查看>>
数据结构之栈
查看>>
Elastic Stack简介
查看>>
关于deepin系统安装design compiler的问题解答
查看>>
Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
查看>>
记录一下最近的学习经历
查看>>
hadoop3.0+spark2.0两台云服务器集群环境配置。
查看>>
记第一次面试经历
查看>>
网站实现qq登录(springboot后台)
查看>>
简单的用户头像修改功能(springboot后台)
查看>>
springboot+mybatis实现分页
查看>>
leetcode332. 重新安排行程
查看>>
为什么局域网网段不同不能通信?
查看>>
itchat微信助手,kaggle 电影数据集分析,基于内容的电影推荐
查看>>
认识和使用JWT
查看>>
通过springboot框架,自己动手实现oauth2.0授权码模式认证
查看>>
条件表达式于运算符的点点滴滴的积累
查看>>