【框架】mybatis--动态sql
动态sql是对sql语句的灵活操作,通过表达式进行判断,对sql进行灵活拼接,组装
动态sql if的使用
需求:用户信息综合查询和用户信息查询总数两个statement的定义使用动态sql灵活拼接
<where>可以自动去掉第一个拼接语句前的and
<if>判断对象是否为空
这样可以实现去掉任意一个条件都可以随意拼接。组装sql语句。
动态sql sql片段的使用
将重复的sql代码片段抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。
编写sql片段
<sql id="query_user">
<if test="userCustom!= null and userCustom!=''">
<if test="userCustom.sex != null and userCustom.sex!=''">
and user.sex=#{userCustom.sex}
</if>
<if test="userCustom.username != null and userCustom.username!=''">
and user.username like '%${userCustom.username}%'
</if>
</if>
</sql>
id是sql片段的唯一标识。
最好基于单表定义sql片段,征用sql片段重用性高。。
在sql片段中不包括where
在statement中引用sql片段
<where>
<include refid="query_user"></include>
</where>
动态sql foreach的使用
需求:在用户查询列表和查询总数的statement中增加多个id输入查询。
sql语句 两种方法:(以下面的sql语句为例)
SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
SELECT * FROM USER WHERE id IN(1,10,16)
1、在输入参数类型中添加List<Integer> ids传入多个id
2、修改sql片段 ,添加foreach片段
foreach在xml中的配置就是将sql语句拼接在xml中而已。
各个标签属性的含义:
collection;指定输入对象的集合属性,在UserQueryVo中定义的属性值是ids, 故填ids。
item:每个遍历生成的对象名称。
open:开始遍历时拼接的串。一般是 “AND(”。
close:结束遍历时拼接的串。一般是右括号
separator:遍历的两个对象中需要拼接的串。 在sql语句中ids用or拼接
另外一个sql的实现:
3、在测试类中添加测试条件即可
userCustom.setSex("female");
List<Integer> ids = new ArrayList<>();
ids.add(29);
ids.add(28);
userQueryVo.setIds(ids);
userQueryVo.setUserCustom(userCustom);