Mybatis基础入门5:动态sql

什么是动态sql

动态sql技术是一种根据特定条件动态拼接SQl语句的功能,我们可以选择查询条件的数量,进而返回不同的结果。

<where> --- <if>标签

如果<if>标签内返回的内容是以AND 或OR 开头的,则它会被where剔除掉,简单理解就是where不会和and或是or相遇。

<select id="selectUsernameAndSex" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
        select * from user
        <where>
            <if test="username != null">
                username = #{username}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
        </where>
    </select>

@Test
    public void selectUsernameAndSex(){
        User user = new User();
//        user.setUsername("熊大");
//        user.setSex("女");
        List<User> users = mapper.selectUsernameAndSex(user);
        for(User user1 : users) System.out.println(user1.toString());
    }

<set> --- <if>标签

普通的sql修改语句要求即使修改一个字段也需要传入整个记录的字段数据,我们在实际使用时会非常繁琐且容易出错,使用set if标签支持仅传入单个字段值,非常方便。

<update id="updateBySet" parameterType="com.qcby.entity.User">
        update user
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="birthday != null">
                birthday = #{birthday},
            </if>
            <if test="sex != null">
                sex = #{sex},
            </if>
            <if test="address != null">
                address = #{address}
            </if>
        </set>
        where id = #{id}
    </update>
@Test
    public void updateBySet(){
        User user = new User();
        user.setUsername("修改后");
        user.setId(18);
        int count = mapper.updateBySet(user);
        session.commit();
        System.out.println(count);
    }

choose when otherwise标签 

choose是父标签,并没有实际意义,when和otherwise在其内部

when相当于if和else if

otherwise相当于else标签

这是我们要查询的表 

<select id="selectByChoose" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
        select * from user
        <where>
            <choose>
                <when test="id != null">
                    id = #{id}
                </when>
                <when test="username != null">
                    username = #{username}
                </when>
                <otherwise>
                    sex = #{sex}
                </otherwise>
            </choose>
        </where>
    </select>
@Test
    public void selectByChoose(){
        User user = new User();
        user.setId(18);
        user.setUsername("更新");
        user.setSex("女");
        List<User> users = mapper.selectByChoose(user);
        for (User user1 : users) {
            System.out.println(user1.toString());
        }
    }

当id不为空时,查询id为18的记录

 我们把给id赋值的语句注释掉再查询:

 我们将id和username赋值语句注释

 

 <trim>标签

trim是一个格式化标签,可以理解为万能标签,它可以替换where和set标签使用。

<trim prefix="where" prefixOverrides="and | or">

prefix="where":表示替换where标签,prefixOverrides ="and | or" :表示删除前缀and和or

<trim prefix="set" suffixOverrides=",">

替换set并删除后缀的逗号。

语法规则和之前展示的where标签与set标签的使用基本类似,这里不再赘述。

<foreach>标签

foreach标签用于批量删除和批量添加。对比java的foreach循环

我们先来用foreach操作数组进行批量删除,首先删除的sql语句是:

delete from 表名 where id in(1,2,3,4,5)

<delete id="deleteByArray">
        delete from user where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

collection:当前要循环的数组或者集合

item:我们指定要循环的数组的每一个元素

separator:每一个元素应该用什么来做分割,例子里是逗号

open:当前循环是以什么开始

close:当前循环是以什么结束

对集合进行操作:批量添加

<insert id="insertByList">
        insert into user (username,birthday,sex,address)values
        <foreach collection="users" item="user" separator=",">
            (#{user.username},#{user.birthday},#{user.sex},#{user.address})
        </foreach>
    </insert>

MyBatis基础入门1 - mac下MyBatis在idea的配置 

Mybatis基础入门2-----简单的增删改查 

MyBatis入门基础3 ---代理 

MyBatis基础入门4:#{}和${}传参的使用区别 

MyBatis基础入门6:关联映射 

MyBatis基础入门7:注解开发 

MyBatis基础入门8:缓存机制 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值