MyBatis动态SQL语句
关键字
1.if 条件
2.choose , when 和 otherwise条件
3.where 条件
4.trim 条件
5.forEach循环
6.set 条件
一、if主要针对Map集合或者实体类
<select id="selectduo" parameterType="Map" resultType="student" > select * from student s where 1=1 <if test="sno!=null"> and s.sno=#{sno} </if> <if test="sname!=null"> and s.sname like #{sname} </if> </select>
JUnit测试用例,判断map集合里的值
@Test public void selectduo() { Map<String, Object> map=new HashMap<String, Object>(); map.put("sno", 107); map.put("sname", "%王%"); List<Student> st=sm.selectduo(map); for(Student tt:st){ System.out.println(tt); } }
二、choose , when 和 otherwise条件
<select id="selectduo" parameterType="Map" resultType="student" > select * from student s where 1=1 <choose> <when test="aaa=='zzz'"> and s.sno=#{sno} </when> <when test="aaa=='bbb'"> and s.sname like#{sname} </when> <!-- 都不符合时走这个 --> <otherwise> and 2=2 </otherwise> </choose> </select>
JUnit测试用例
@Test public void selectduo() { Map<String, Object> map=new HashMap<String, Object>(); map.put("aaa", "bbb"); map.put("sno", 107); map.put("sname", "%王%"); List<Student> st=sm.selectduo(map); for(Student tt:st){ System.out.println(tt); } }
三、where:自动加上where,如果where子句以and或者or开头,则自动删除第一个and或者or。所以我们不需要自己加where
<select id="selectduo" parameterType="Map" resultType="student" > select * from student s <where> <if test="sno!=null"> and s.sno=#{sno} </if> <if test="sname!=null"> and s.sname like #{sname} </if> </where> </select>
JUnit测试用例
@Test public void selectduo() { Map<String, Object> map=new HashMap<String, Object>(); map.put("sno", 107); map.put("sname", "%王%"); List<Student> st=sm.selectduo(map); for(Student tt:st){ System.out.println(tt); } }
四、trim 条件:trim条件和where条件类似但是功能更强大:不仅可以替换掉子句开头的and或者or,还提供了加前缀和后缀的功能。
<select id="selectduo" parameterType="Map" resultType="student" > select * from student s <!-- 把第一个and或者or替换成where,替换最后一个用suffix="" suffixOverrides="" --> <trim prefix="where" prefixOverrides="and|or" > <if test="sno!=null"> and s.sno=#{sno} </if> <if test="sname!=null"> and s.sname like #{sname} </if> </trim> </select>
JUnit测试用例
@Test public void selectduo() { Map<String, Object> map=new HashMap<String, Object>(); map.put("sno", 107); map.put("sname", "%王%"); List<Student> st=sm.selectduo(map); for(Student tt:st){ System.out.println(tt); } }
五、forEach循环
1.用list传值是
<select id="selectduo" parameterType="list" resultType="student" > select * from student s <where> s.sno in <!-- 自己定义的名称,传来是什么类型变量 ,后面三个属性拼接成(,,,) --> <foreach item="test" collection="list" open="(" separator="," close=")"> #{test} </foreach> </where> </select>
JUnit测试用例
@Test public void selectduo() { List<Integer> snos=new ArrayList<>(); snos.add(66); snos.add(110); snos.add(107); List<Student> st=sm.selectduo(snos); for(Student tt:st){ System.out.println(tt); } }
2.用map传值时
<select id="selectduo" parameterType="Map" resultType="student" > select * from student s <where> s.sno in <!-- 自己定义的名称,Map的key名字 ,后面三个属性拼接成(,,,) --> <foreach item="test" collection="snoslist" open="(" separator="," close=")"> #{test} </foreach> </where> </select>
JUnit测试用例
@Test public void selectduo() { List<Integer> snos=new ArrayList<>(); snos.add(66); snos.add(110); snos.add(107); Map<String , Object> map=new HashMap<String,Object>(); map.put("snoslist", snos); List<Student> st=sm.selectduo(map); for(Student tt:st){ System.out.println(tt); } }
结果都是一样的
六、set 条件
自动加上set,自动去除最后一个逗号
<update id="update" parameterType="student"> update student s <set> <if test="sname!=null">s.sname=#{sname},</if> <if test="ssex!=null">s.ssex=#{ssex},</if> <if test="sclass!=null">s.sclass=#{sclass}</if> <where> s.sno=#{sno} </where> </set> </update>
JUnit测试用例
@Test public void update() { Student st=new Student(66, "蒙蒙", "男", 95033,null); int m=sm.update(st); System.out.println(m); }