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); 
        } 
    }

MyBatis动态SQL语句详解编程语言

 

二、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); 
        } 
    }

MyBatis动态SQL语句详解编程语言

 

三、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); 
        } 
    }

 MyBatis动态SQL语句详解编程语言

 

四、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); 
        } 
    }

结果都是一样的

MyBatis动态SQL语句详解编程语言

六、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); 
    } 
    

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/16980.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论