三、mybatis动态SQL

1 动态sql中的元素

序 号元素说明
1<if>判断语句,用于单条件判断
2<choose>(<when>、<otherwise>)相当于Java中的switch…case…default语句,用于多条件判断
3\ 简化SQL语句中where的条件判断
4<trim>可以灵活地去除多余的关键字
5<set>用于SQL语句的动态更新
6<foreach>循环语句,常用于in语句等列举条件中

2 if元素

完成案例,要求:

  • 根据名字与年龄查询,两项均可以为空。

    • 若用户仅仅输入了名字,则只根据名字查询

    • 若用户仅仅输入了年龄,则只根据年龄查询

    • 若用户同时输入了名字和年龄,则根据两者查询。

例如将名字为“含张”且年龄小于20的查出来,两项输入条件可以为空

注意:

在xml中写sql语句时,(<)小于号往往不会被解析转义,此时就需要用特定给方法解决

一:使用特殊字符转义
&gt;  >  大于号 (可以被解析)
&lt;  <  小于号 (重点)

二:使用<![CDATA[ ]]>符号
<![CDATA[ <= ]]>
 <select id="findByNameAndAge" resultType="com.yiwu.pojo.User">
        select *
        from users_info where 1=1
        <if test="uname != null and uname != ''">
            and uname like concat('%',#{uname},"%")
        </if>
        <if test="uage != null and uage != ''">
            and uage &lt; #{uage}
        </if>
</select>
//List<User>  findByNameAndAge(User user);
@Test
    public void test06(){
        User user = new User();
        user.setUname("张");
        user.setUage(20);
       List<User> byId2 = mapper.findByNameAndAge(user);
        System.out.println(byId2);
    }

3 <choose><when><otherwise>元素

类似于java中的switch,case,default,多个条件选择其中一个执行。

完成案例,要求:

  • 根据名字与年龄查询,两项均可以为空。

    • 若用户输入了名字,则只根据名字查询

    • 若用户名字为空,仅输入了年龄,则只根据年龄查询

    • 若用户名字和年龄均为空,则查询所有电话不为空的信息。

<select id="findByNameOrAge" resultType="com.yiwu.pojo.User">
        select *
        from users_info where
        <choose>
            <when test="uname != null and uname != ''">
                 uname like concat('%',#{uname},"%")
            </when>
            <when test="uage != null and uage != ''">
                 uage &lt; #{uage}
            </when>
            <otherwise>
                uphone is not null
            </otherwise>
        </choose>
</select>

测试方法

//List<User>  findByNameOrAge(User user); 
@Test
    public void test07(){
        User user = new User();
        //user.setUname("张");
        //user.setUage(20);
        List<User> byId2 = mapper.findByNameOrAge(user);
        System.out.println(byId2);
    }

4 <where> 元素

​ 在映射文件中,编写的SQL后面加入了“where 1=1”的条件的话,既保证了where后面的条件成立,又避免了where后面第一个词是and或者or之类的关键字。针对这种情况,可以使用MyBatis提供的<where>元素处理。

映射文件

<select id="findByNameAndAge2" resultType="com.yiwu.pojo.User">
        select *
        from users_info 
        <where>
            <if test="uname != null and uname != ''">
                and uname like concat('%',#{uname},'%')
            </if>
            <if test="uage != null and uage != ''">
                and uage &lt; #{uage}
            </if>
        </where>
    </select>

5<trim> 元素

属性说明
prefix指定给SQL语句增加的前缀
prefixOverrides指定SQL语句中要去掉的前缀字符串
suffix指定给SQL语句增加的后缀
suffixOverrides指定SQL语句中要去掉的后缀字符串
<select id="findByNameAndAge3" resultType="com.yiwu.pojo.User">
        select *
        from users_info
        <trim prefix="where" prefixOverrides="and">
            <if test="uname != null and uname != ''">
                and uname like concat('%',#{uname},'%')
            </if>
            <if test="uage != null and uage != ''">
                and uage &lt; #{uage}
            </if>
        </trim>
</select>

6 set更新

    <update id="updateUserById2">
        update users_info
            <set>
                <if test="uname != null and uname != ''">
                    uname = #{uname},
                </if>
                <if test="uage != null and uage != ''">
                    uage = #{uage},
                </if>
            </set>
            where uid = #{uid}
    </update>

使用trim

 <update id="updateUserById2">
        update users_info
            <trim prefix="set" suffixOverrides=",">
                <if test="uname != null and uname != ''">
                    uname = #{uname},
                </if>
                <if test="uage != null and uage != ''">
                    uage = #{uage},
                </if>
            </trim>
            where uid = #{uid}
    </update>

7 复杂的查询操作 foreach

属性说明
item表示集合中每一个元素进行迭代的别名,必选属性
index在List和数组中,index是序号,在Map中表示K值,可选属性
open开始的符号
separator各个元素的分隔符
close结束符号
collection参数类型,必选属性。参数为List属性为list;参数为数组,属性为array;参数为Map,属性为Map。

数组

<select id="findUserByIds" resultType="com.yiwu.pojo.User">
    select * from users_info where uid in
    <foreach collection="array" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</select>
//List<User> findUserByIds(int[] ids);
@Test
public void test10(){
    int[] a = {2,3,4,5,6};
    List<User> byId2 = mapper.findUserByIds(a);
    System.out.println(byId2);
}

mybatis基础教程【5小时36讲全套】

重录版-推荐(36讲,无法分享组,点击前往bilibili查看全集

12 动态Sql简介

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老去的90后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值