案例:员工删除功能(既支持删除单条记录,又支持批量删除)
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>
问题分析:
在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>