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);
    }
    
复制代码
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章