【MyBatisⅡ】动态 SQL

目录

🎒1 if 标签

🫖2 trim 标签

👠3 where 标签

🦺4 set 标签

🎨5 foreach 标签


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

在 xml 里面写判断条件。

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

 

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

1 if 标签

    /**
     * 动态 sql
     * if 标签
     * @param userInfo
     * @return
     */
    int add2(UserInfo userInfo);
    <insert id="add2">
        insert into userinfo(username,password
        <if test="photo != null">
            ,photo
        </if>
        )values(#{username},#{password}
        <if test="photo != null">
            ,#{photo}
        </if>
        )
    </insert>
    @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);
    }

 

    @Test
    void add2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("如来佛祖");
        userInfo.setPassword("99999");

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

2 trim 标签

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

    /**
     * trim 标签
     * @param userInfo
     * @return
     */
    int add3(UserInfo userInfo);
    <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>

 

    @Test
    void add3() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("观音菩萨");
        userInfo.setPassword("3785");

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

 

    @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 只能放在语句的前面,放在最后面会报错!

    /**
     * where 标签
     * @param userInfo
     * @return
     */
    List<UserInfo> getListByWhere(UserInfo userInfo);
    <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>
    @Test
    void getListByWhere() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        List<UserInfo> list = userMapper.getListByWhere(userInfo);
        System.out.println(list);
    }

    @Test
    void getListByWhere() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("白骨精");
        List<UserInfo> list = userMapper.getListByWhere(userInfo);
        System.out.println(list);
    }

 

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

   <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 标签

用于修改。

    /**
     * set 标签
     * @param userInfo
     * @return
     */
    int update2(UserInfo userInfo);

 

    <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>

 

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

    @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 数据删除的时候。批量删除。

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

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值