根据特定条件动态拼装SQL的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点
根据标签中test属性所对应的表达式来决定标签中的内容,是否拼接到语句中
List<Emp> getEmpDYById(@Param("emp")Emp emp);
<select id="getEmpDYById" resultType="Emp"> select * from t_emp where 1=1 <if test="eid != null and eid !=''"> and eid = #{eid} </if> <if test="empName != null and empName !=''"> and emp_name = #{empName} </if> <if test="age != null and age !=''"> and age = #{age} </if> <if test="sex != null and sex !=''"> and sex = #{sex} </if> <if test="email != null and email !=''"> and eid = #{eid} </if> </select>
当where标签中有内容时会生成where关键字,并且将内容前多余的 and/or 自动去除,内容后的去除不了,当where标签中没有内容时,不会生成where关键字
<select id="getEmpDYById" resultType="Emp"> select * from t_emp <where> <if test="eid != null and eid !=''"> eid = #{eid} </if> <if test="empName != null and empName !=''"> emp_name = #{empName} </if> <if test="age != null and age !=''"> age = #{age} </if> <if test="sex != null and sex !=''"> sex = #{sex} </if> <if test="email != null and email !=''"> eid = #{eid} </if> </where> </select>
若标签中没有内容时,trim标签没有任何效果
若标签中有内容时候:
suffix:将trim标签中内容后面添加指定内容
prefix:将trim标签中内容前面添加指定内容
suffixOverrides:将trim标签中内容后面去除指定内容,如果有多个指定的内容用 | 隔开
prefixOverrides:将trim标签中内容前面去除指定内容,如果有多个指定的内容用 | 隔开
这里的意思就是 最后生成的sql语句,不管从哪个if语句开始,最前面要加上where,最后一个and/or一定要去除
<select id="getEmpDYById" resultType="Emp"> select * from t_emp <trim prefix="where" suffixOverrides="and|or"> <if test="eid != null and eid !=''"> eid = #{eid} and </if> <if test="empName != null and empName !=''"> emp_name = #{empName} or </if> <if test="age != null and age !=''"> age = #{age} and </if> <if test="sex != null and sex !=''"> sex = #{sex} and </if> <if test="email != null and email !=''"> eid = #{eid} and </if> </trim> </select>
<choose> <when test=""> ... </when> <when test=""> ... </when> <otherwise> ... </otherwise> </choose>
根据标签中test属性所对应的表达式来决定标签中的内容,是否拼接到语句中,when标签至少有一个,otherwise只能有一个
<select id="getEmpDYById" resultType="Emp"> select * from t_emp where 1=1 <choose> <when test="eid != null and eid !=''"> and eid = #{eid} </when> <when test="empName != null and empName !=''"> and emp_name = #{empName} </when> <when test="age != null and age !=''"> and age = #{age} </when> <when test="sex != null and sex !=''"> and sex = #{sex} </when> <when test="email != null and email !=''"> and eid = #{eid} </when> </choose> </select>
foreach用于循环一个数组
collection:需要循环的数组/集合
item:数组/集合中的项
separator:循环体之间分隔符
open:在foreach循环所有步骤之前以什么字符开始
close:在foreach循环所有步骤完后以什么字符结束
foreach前后自带一个空格
int deleteEmpByArray(@Param("eIds")Integer[] eIds)
<delete id="deleteEmpByArray"> delete from t_emp where eid in <foreach collection="eids" item="eid" separator="," open="(" close=")"> #{eid} </foreach> </delete>
int insertEmpByList(@Param("emps")List<Emp> emps)
<insert id="insertEmpByList"> insert into t_emp values <foreach collection="emps" item="emp" separator=","> (null, #{emp.empName}, #{emp.age}, #{emp.sex}, #{emp.email}) </foreach> </insert>
sqll标签:将常用的一个sql片段进行记录
id:设置你的sql片段的名字
include标签:将sql标签进行引用
refid:填入需要引用的sql标签片段的名字
<sql id="insert"> (null, #{emp.empName}, #{emp.age}, #{emp.sex}, #{emp.email}) </sql> <!--int insertEmpByList(@Param("emps")List<Emp> emps);--> <insert id="insertEmpByList"> insert into t_emp values <foreach collection="emps" item="emp" separator=","> <include refid="insert"> </foreach> </insert>