【MyBatisⅡ】动态 SQL

目录

🎒[1 if 标签](#1 if 标签)

🫖[2 trim 标签](#2 trim 标签)

👠[3 where 标签](#3 where 标签)

🦺[4 set 标签](#4 set 标签)

🎨[5 foreach 标签](#5 foreach 标签)


动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。

在 xml 里面写判断条件。

动态SQL 在数据库里的体现就是,phtot 这个字段在数据输入的时候,在没有默认值情况下,可以为空。

在 SQL 中,空和 NULL 是两个不同的概念。空什么也没有显示,而 NULL 显示了 NULL。

1 if 标签

java 复制代码
    /**
     * 动态 sql
     * if 标签
     * @param userInfo
     * @return
     */
    int add2(UserInfo userInfo);
java 复制代码
    <insert id="add2">
        insert into userinfo(username,password
        <if test="photo != null">
            ,photo
        </if>
        )values(#{username},#{password}
        <if test="photo != null">
            ,#{photo}
        </if>
        )
    </insert>
java 复制代码
    @Test
    void add2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("猪八戒");
        userInfo.setPassword("569875");
        userInfo.setPhoto("lion.png");
        int result = userMapper.add2(userInfo);
        System.out.println(result);
    }
java 复制代码
    @Test
    void add2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("如来佛祖");
        userInfo.setPassword("99999");

        int result = userMapper.add2(userInfo);
        System.out.println(result);
    }

2 trim 标签

多个字段可以为空的情况下,只要有一个字段不为空,就需要用到添加操作。动态拼接。

java 复制代码
    /**
     * trim 标签
     * @param userInfo
     * @return
     */
    int add3(UserInfo userInfo);
java 复制代码
    <insert id="add3">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                username,
            </if>
            <if test="password!=null">
                password,
            </if>
            <if test="photo!=null">
                photo
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                #{username},
            </if>
            <if test="password!=null">
                #{password},
            </if>
            <if test="photo!=null">
                #{photo}
            </if>
        </trim>
    </insert>
java 复制代码
    @Test
    void add3() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("观音菩萨");
        userInfo.setPassword("3785");

        int result = userMapper.add3(userInfo);
        System.out.println(result);
    }
java 复制代码
    @Test
    void add3() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("卓耿");
        userInfo.setPassword("sfgoz");
        userInfo.setPhoto("dragon.jpn");

        int result = userMapper.add3(userInfo);
        System.out.println(result);
    }

3 where 标签

根据传入参数,来决定 SQL 语句是否有 where 关键字。动态生成 where 语句。

对于 int 类型,不传的话,默认为 0 ,而不是 null。

where 标签除了动态生成 where 语句外,还可以自动的去掉语句前面的 and。所以 and 只能放在语句的前面,放在最后面会报错!

java 复制代码
    /**
     * where 标签
     * @param userInfo
     * @return
     */
    List<UserInfo> getListByWhere(UserInfo userInfo);
java 复制代码
    <select id="getListByWhere" resultType="com.example.demo.Model.UserInfo">
        select * from userinfo
        <where>
            <if test="id>0">
                id=#{id}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
            <if test="photo!=null">
                and photo=#{photo}
            </if>
        </where>
    </select>
java 复制代码
    @Test
    void getListByWhere() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        List<UserInfo> list = userMapper.getListByWhere(userInfo);
        System.out.println(list);
    }
java 复制代码
    @Test
    void getListByWhere() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("白骨精");
        List<UserInfo> list = userMapper.getListByWhere(userInfo);
        System.out.println(list);
    }

也可以使用 trim 标签完成上述 where 标签的功能,代码如下:

java 复制代码
   <select id="getListByWhere" resultType="com.example.demo.Model.UserInfo">
        select * from userinfo
        <trim prefix="where" prefixOverrides="pre">
            <if test="id>0">
                id=#{id}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
            <if test="photo!=null">
                and photo=#{photo}
            </if>
        </trim>
    </select>

4 set 标签

用于修改。

java 复制代码
    /**
     * set 标签
     * @param userInfo
     * @return
     */
    int update2(UserInfo userInfo);
java 复制代码
    <update id="update2">
        update userinfo
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="password!=null">
                password=#{password},
            </if>
            <if test="photo!=null">
                photo=#{photo}
            </if>
        </set>
        where id=#{id}
    </update>
java 复制代码
    @Test
    void update2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("小玫瑰");
        userInfo.setId(6);
        userInfo.setPassword("palsov");
        userInfo.setPhoto("rose.jpg");
        int result = userMapper.update2(userInfo);
        System.out.println(result);
    }
java 复制代码
    @Test
    void update2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("卡莉熙");
        userInfo.setId(4);
        userInfo.setPassword("msjf");

        int result = userMapper.update2(userInfo);
        System.out.println(result);
    }

可以看出,set 标签会自动去除末尾的逗号!

5 foreach 标签

多条 sql 数据删除的时候。批量删除。

java 复制代码
    /**
     * foreach 标签
     * @param ids
     * @return
     */
    int delByIds(List<Integer> ids);
java 复制代码
    <delete id="delByIds">
        delete from userinfo
        where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>
java 复制代码
    @Test
    void delByIds() {
        List<Integer> list = new ArrayList<Integer>(){{
            add(1);
            add(2);
            add(3);
        }};

        int ret = userMapper.delByIds(list);
        System.out.println(ret);
    }

相关推荐
敲敲了个代码3 小时前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
cike_y3 小时前
Mybatis之解析配置优化
java·开发语言·tomcat·mybatis·安全开发
WanderInk4 小时前
刷新后点赞全变 0?别急着怪 Redis,这八成是 Long 被 JavaScript 偷偷“改号”了(一次线上复盘)
后端
是一个Bug5 小时前
Java基础50道经典面试题(四)
java·windows·python
dly_blog5 小时前
Vue 响应式陷阱与解决方案(第19节)
前端·javascript·vue.js
Slow菜鸟5 小时前
Java基础架构设计(三)| 通用响应与异常处理(分布式应用通用方案)
java·开发语言
吴佳浩5 小时前
Python入门指南(七) - YOLO检测API进阶实战
人工智能·后端·python
消失的旧时光-19435 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
我是Superman丶5 小时前
《Spring WebFlux 实战:基于 SSE 实现多类型事件流(支持聊天消息、元数据与控制指令混合传输)》
java
console.log('npc')5 小时前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js