什么是动态sql
mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
标签介绍
1.if标记(if是动态sql中最最常用的标记)
动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。常用形式:
<select id="**" resultType="**" parameterType="**">
select * from table where 1=1
<if test="attr!=null">
and attrColumn>#{attr}
</if>
</select>
2.choose, when, otherwise标记
有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素。常用形式:
select * from table where 1=1
<choose>
<when test="attr1!=null">
and attrColumn like #{attr}
</when>
……
<otherwise>
and attr2 is not null
</otherwise>
</choose>
3.where标记
select * from table
<where>
<if test="attr1!=null">
attr1Column like #{attr1}
</if>
<if test="attr2!=null">
and attr2Column =#{attr2}
</if>
</where>
可以看到,使用where标记有两个好处:
- 不再需要在where后面加上1=1这个条件
- 会智能处理and
4.foreach标记
foreach标记是最为强大的一个标记,最基本的功能是用来实现对一个集合进行遍历查询,循环赋值。通常是在构建 IN 条件语句的时候使用。
foreach标记主要是使用一下一些属性标记来实现:
- item:迭代的内容
- collection:循环的集合或指定的类型
- separator:元素之间的分隔符
- open:开始符,可选属性
- close:闭合符,可选属性,一般与open联合使用
- index:list的序号,可选属性
使用foreach进行遍历查询的常用形式:
select * from table
<where>
id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</where>
需求
用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。
mapper.xml
测试代码
sql片段
1.需求
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。
2.定义sql片段
3.引用sql片段
在mapper.xml中定义的statement中引用sql片段:
foreach(了解)
向sql传递数组或List,mybatis使用foreach解析
1.需求
在用户查询列表和查询总数的statement中增加多个id输入查询。
sql语句如下:
两种方法:
- SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
- SELECT * FROM USER WHERE id IN(1,10,16)
2.在输入参数类型中添加List<Integer> ids传入多个id
3.修改mapper.xml
WHERE id=1 OR id=10 OR id=16
在查询条件中,查询条件定义成一个sql片段,需要修改sql片段。
4.测试代码
5.另外一个sql的实现