目录
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。
sql表字段如下:
用于不确定根据哪几个字段查询的情况下,则可判断如果有此字段的值则拼接,否则跳过。
if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中反之标签中的内容不会执行
最后执行的sql语句:
select * from emp where 1=1 and name like concat('%',?,'%') and gender = ? and ...
<!--List<Emp> getEmpListByCondition(Emp emp); //接口EmpMapper中定义的方法-->
<select id="getEmpListByCondition" resultType="com.softeem.bean.Emp">
select * from emp where 1=1
<if test="name != '' and name != null">
and name like concat('%',#{name},'%')
</if>
<!--不能跟''空字符串进行比较,因为时间是Date类型-->
<if test="joinDate != null">
<!--日期不能用`${}`字符串拼接,只能使用?占位符。-->
and join_date = #{joinDate}
</if>
<!--if是类中属性在判断-->
<if test="gender != '' and gender != null">
and gender = #{gender}
</if>
<if test="salary > 0 and salary != null">
and salary = #{salary}
</if>
</select>
跟单独使用if标签的区别就是加了where标签,可以不用在sql语句中写where 1=1,where标签中的if语句满足会自动在sql语句中加入where关键字
where和if一般结合使用:
a>若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
b>若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的
and去掉
注意:where标签不能去掉条件最后多余的and
<!-- List<Emp> getEmpListByConditionWhere(Emp emp); //接口EmpMapper中定义的方法 -->
<select id="getEmpListByConditionWhere" resultType="com.softeem.bean.Emp">
select * from emp
<where>
<if test="name != '' and name != null">
and name like concat('%',#{name},'%')
</if>
<!--不能跟''空字符串进行比较,因为时间是Date类型-->
<if test="joinDate != null">
<!--日期不能用`${}`字符串拼接,只能使用?占位符。-->
and join_date = #{joinDate}
</if>
<!--if是类中属性在判断-->
<if test="gender != '' and gender != null">
and gender = #{gender}
</if>
<if test="salary > 0 and salary != null">
and salary = #{salary}
</if>
</where>
</select>
trim用于去掉或添加标签中的内容常用属性:
prefix:在trim标签中的内容的前面添加某些内容
prefixOverrides:在trim标签中的内容的前面去掉某些内容
suffix:在trim标签中的内容的后面添加某些内容
suffixOverrides:在trim标签中的内容的后面去掉某些内容
比如,条件查询需要where关键字,那么就可以在trim标签中添加prefix="where"
<!-- List<Emp> getEmpListByMoreTrim(Emp emp); -->
<select id="getEmpListByMoreTrim" resultType="com.softeem.bean.Emp">
select * from emp
<!-- 在trim标签中的内容前加上where,后面删除and-->
<trim prefix="where" suffixOverrides="and">
<if test="name != '' and name != null">
and name like concat('%',#{name},'%')
</if>
<if test="gender != '' and gender != null">
and gender = #{gender}
</if>
</trim>
</select>
choose、when、otherwise相当于if...else if..else
只会拼接一个<when>标签内的内容
<!-- List<Emp> getEmpListByChoose(Emp emp); -->
<select id="getEmpListByChoose" resultType="com.softeem.bean.Emp">
select * from emp
<where>
<choose>
<when test="name != '' and name != null">
name like concat('%',#{name},'%')
</when>
<when test="gender != '' and gender != null">
gender = #{gender}
</when>
</choose>
</where>
</select>
foreach 标签通常用于对集合进行迭代,生成动态的SQL语句。
collection 属性指定要迭代的集合
item 属性指定在迭代过程中每个元素的别名
index 属性指定在迭代过程中的索引值
open 属性指定在迭代开始时插入的字符串
separator 属性指定在每个元素之间插入的字符串
close 属性指定在迭代结束时插入的字符串。
示例如下:
sql:insert into emp values (null, ?, ?, ?, ?, ?)
<!-- int insertMoreEmp(@Param("emps") List<Emp> emps); -->
<!-- foreach 生成插入语句-->
<insert id="insertMoreEmp">
insert into emp values
<foreach collection="emps" item="emp" separator=",">
<!--这边是属性!不是表中字段-->
(null,#{emp.name},#{emp.gender},#{emp.salary},#{emp.joinDate},#{emp.deptId})
</foreach>
</insert>
sql:delete from emp where ? or ? or?
<!-- int deleteMoreByArray(@Param("eids") int[] eids); -->
<!-- 删除 delete from emp where ? or ? or? -->
<delete id="deleteMoreByArray">
delete from emp where
<foreach collection="eids" item="eid" separator="or">
id = #{eid}
</foreach>
</delete>
sql:delete from emp where id in (?,?,?,...)
<!-- int deleteMoreByArray2(@Param("eids") int[] eids); -->
<!-- delete from emp where id in (?,?,?,...) -->
<delete id="deleteMoreByArray2">
delete from emp where id in
<foreach collection="eis" item="eid" open="(" separator="," close=")">
#{eid}
</foreach>
</delete>