mybatis核心就是对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
现有需求如下:需要查询用户,输入的是用户类,如果用户的性别类不为空,则将性别作为查询条件之一,如果用户的姓名不为空,则将用户姓名作为查询条件之一。如果用户两个属性都为空,则查询所有用户。
我们知道,在mapper中,我们的传入参数只有一个,多个参数只能通过包转类来实现,现在这种问题怎么解决呢?答案就是在xml文件中加入判断,使sql语句动态生成。刚才的需求所对应的mapper.xml文件代码如下:
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。
定义一个sql片段
引用一个sql片段
在我们的sql语句中,有时候会出现这种情况:
SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
SELECT * FROM USER WHERE id IN(1,10,16)
我们要用foreach来解决这个问题,代码如下:
1 <sql id="query_user_where"> 2 <if test="userCustom!=null"> 3 <if test="ids!=null"> 4 <!-- 使用 foreach遍历传入ids 5 collection:指定输入 对象中集合属性 6 item:每个遍历生成对象中 7 open:开始遍历时拼接的串 8 close:结束遍历时拼接的串 9 separator:遍历的两个对象中需要拼接的串 10 --> 11 <!-- 使用实现下边的sql拼接: 12 AND (id=1 OR id=10 OR id=16) 13 --> 14 <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> 15 <!-- 每个遍历需要拼接的串 --> 16 id=#{user_id} 17 </foreach> 18 19 <!-- 实现 “ and id IN(1,10,16)”拼接 --> 20 <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=","> 21 每个遍历需要拼接的串 22 #{user_id} 23 </foreach> --> 24 25 </if> 26 </if> 27 </sql>
原文:http://www.cnblogs.com/liyasong/p/6388184.html