MyBatis动态SQL语句

本文详细介绍了MyBatis中if、choose、where、trim、forEach和set等条件语句的使用方法,并通过具体的SQL映射文件示例及JUnit测试用例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字

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

 

转载于:https://www.cnblogs.com/hq233/p/6752576.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值