Javaweb之Mybatis的动态SQLforeach和include的详细解析

发布时间:2024年01月10日

3.3 动态SQL-foreach

案例:员工删除功能(既支持删除单条记录,又支持批量删除)

SQL语句:

delete from emp where id in (1,2,3);

Mapper接口:

@Mapper
public interface EmpMapper {
 ? ?//批量删除
 ? ?public void deleteByIds(List<Integer> ids);
}

XML映射文件:

  • 使用<foreach>遍历deleteByIds方法中传递的参数ids集合

<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" 
 ? ? ? ? open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 ? ? ? ?PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 ? ? ? ?"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
 ? ?<!--删除操作-->
 ? ?<delete id="deleteByIds">
 ? ? ?  delete from emp where id in
 ? ? ? ?<foreach collection="ids" item="id" separator="," open="(" close=")">
 ? ? ? ? ?  #{id}
 ? ? ? ?</foreach>
 ? ?</delete>
</mapper> 

3.4 动态SQL-sql&include

问题分析:

  • 在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码

我们可以对重复的代码片段进行抽取,将其通过<sql>标签封装到一个SQL片段,然后再通过<include>标签进行引用。

  • <sql>:定义可重用的SQL片段

  • <include>:通过属性refid,指定包含的SQL片段

SQL片段: 抽取重复的代码

<sql id="commonSelect">
    select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
</sql>

然后通过<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>
文章来源:https://blog.csdn.net/qq_69748833/article/details/135492199
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。