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

相关推荐
星辰离彬17 分钟前
Java 与 MySQL 性能优化:MySQL连接池参数优化与性能提升
java·服务器·数据库·后端·mysql·性能优化
半桔17 分钟前
【Linux手册】从接口到管理:Linux文件系统的核心操作指南
android·java·linux·开发语言·面试·系统架构
nightunderblackcat26 分钟前
新手向:实现ATM模拟系统
java·开发语言·spring boot·spring cloud·tomcat·maven·intellij-idea
江号软件分享30 分钟前
有效保障隐私,如何安全地擦除电脑上的敏感数据
前端
超级小忍30 分钟前
Spring Boot 与 Docker 的完美结合:容器化你的应用
spring boot·后端·docker
Bug退退退12331 分钟前
RabbitMQ 高级特性之延迟队列
java·spring·rabbitmq·java-rabbitmq
先睡35 分钟前
RabbitMQ
java
笑衬人心。36 分钟前
Java 17 新特性笔记
java·开发语言·笔记
web守墓人1 小时前
【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库
前端·javascript·html