动态sql
·什么是动态sql
mybatis的核心是对sql语句进行灵活的操作,通过表达式进行判断,对sql进行灵活拼接、组装。
·需求(动态sql,where 和 if 的使用)
1、用户信息的综合查询列表和用户信息的查询列表总数,这两个statement的定义,我们要使用动态sql。对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。
(1)mapper.xml
用户综合查询
用户信息总数查询
在添加了where 和if 标签之后,条件查询语句都变成动态拼接,在参数为空的情况下,查询为整表查询,在参数有值的情况下,查询为条件查询,实现了简单的动态的查询。
·需求(动态sql,sql片段)
将上面实现的动态sql判断代码抽取出来,组成一个sql片段。其他的statement中就可以引用sql片段
1、定义sql片段
2、引用sql片段
在mapper.xml中定义的statement中引用sql片段
·foreach
向sql传递数组或List,Mybatis使用foreach解析
1、需求:在用户查询列表和查询总数的statement中增加多个id输入查询
sql语句如下:
两种方法:
-select user_login.* from custom,user_login where C_Id= 1 or C_Id = 2 or ...
-select user_login.* from custom,user_login where C_Id in('1','2','...')
2、在输入参数类型中添加List<Integer> ids传入多个Id
3、修改mapper.xml
<sql id="query_user_where">
<if test="ids!=null">
<!-- 使用foreach遍历传入ids
collection:指定输入对象中集合属性
item:每个遍历生成对象
open:开始遍历时拼接的字符串
close:结束遍历时拼接的字符串
separator:每个遍历对象之间插入的字符串
-->
<!-- 实现拼接的字符串:And (id=1 or id =2 or ....) -->
<foreach collection="ids" item="id" open="and (" close=")" separator="or">
C_Id = #{id}
</foreach>
</if>
</sql>
另一种实现方式:
<!-- 实现拼接的字符串:and C_id in('1','2','6'...) -->
<foreach collection="ids" item = "id" open="and C_Id in(" close=")" separator=",">
#{id}
</foreach>
4、测试代码