MyBatis--4(动态SQL相关知识)

1.动态SQL

  • 随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL
  • mybatis中的动态查询都是用多个标签构成

2.<if><where><set>

  1. <if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL
  • 例:
<if test="name != null">
   name like concat('%',#{name},'%')
</if>
  • 示例:
<select id="list" resultType="com.itheima.pojo.Emp">
        select *
        from emp where 
        <if test="name!=null">
            name like concat('%', #{name}, '%')
        </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
        <if test="begin!=null and end!=null">
            and entrydate between #{begin} and #{end}
        </if>
        order by update_time desc
    </select>
  • 但是上述代码有个缺点,就是不能动态生成where,andor等关键字,会造成语法错误
  1. <where>: where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的ANDOR
  • 改进:
   select *
        from emp
        <where>
            <!-- where的作用:1.动态的生成where  2.自动判断是否需要and , or等关键字 -->
        <if test="name!=null">
            name like concat('%', #{name}, '%')
        </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
        <if test="begin!=null and end!=null">
            and entrydate between #{begin} and #{end}
        </if>
        </where>
        order by update_time desc
    </select>
  1. <set>替换set关键字,并且去除多个赋值语句之间间隔的逗号(用在update语句中)。
  • 在xml文件中示例:
    <update id="update2">
        update emp
        <set>
            <if test="username!=null">username = #{username},</if>
            <if test="name!=null">name = #{name},</if>
            <if test="gender !=null">gender = #{gender },</if>
            <if test="image!=null">image = #{image},</if>
            <if test="job!=null">job = #{job},</if>
            <if test="entryDate!=null">entrydate = #{entryDate},</if>
            <if test="deptId!=null">dept_id = #{deptId},</if>
            <if test="updateTime!=null">update_time = #{updateTime}</if>
        </set>
           where id = #{id}
    </update>

3.<foreach>

  1. SQL语句
delete from emp where id in (1,2,3);
  1. 接口方法
//批量删除
public void deleteBylds(List<Integer> ids);
  1. XML映射文件
  <!--批量删除员工的操作 (18,19, 20)-->
    <!--
        collection :遍历的集合,与mapper中的集合名保持一致即可
        item:遍历出来的元素,名称任取
        separator:分隔符
        open:遍历开始前拼接的SQ工片段
        close:遍历结束局拼接的SQL片段
    -->
    <delete id="deleteByIds">
        delete from emp where id in
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

4.<sql>,<include>

  1. <sql><include>这两个标签解决了代码复用性的问题,类似于方法的定义与调用
  • 原select语句(对比)
<select id="list" resultType="com.itheima.pojo.Emp">
    select id,username, password,name, gender,image,job,entrydate,dept_id,create_time,update_time
    from emp
        <where>
            <if test="name!=null">
                name like concat('%', #{name}, '%')
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
            <if test="begin!=null and end!=null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
    order by update_time desc
</select>
  1. <sql>抽取大量且复用多的sql语句
 <sql id="commonSelect">
 <!-- id属性是取得唯一标识名 -->
        select id,username, password,name, gender,image,job,entrydate,dept_id,create_time,update_time
		from emp
    </sql>
  1. <include>使用复用代码
<select id="list" resultType="com.itheima.pojo.Emp">
    <include refid="commonSelect"/>
        <where>
            <if test="name!=null">
                name like concat('%', #{name}, '%')
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
            <if test="begin!=null and end!=null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
</select>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

曼诺尔雷迪亚兹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值