mybatis框架的动态sql技术是一种根据特定条件动态拼装sql语句的功能,存在的意义是为了解决拼接sql语句字符串时的痛点问题。动态sql本质上是映射文件中的一系列标签。
<font size= color=>
if 标签:多条件查询方式1
接口方法
/*
* 多条件查询
* */
List<Emp> getEmpByConditions(Emp emp);
映射文件
<!--List<Emp> getEmpByConditions(Emp emp);-->
<select id="getEmpByConditions" resultType="Emp">
select * from t_emp where 1=1
<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 email = #{email}
</if>
</select>
select * from t_emp where 1=1,该语句中的1=1为恒成立条件,通过恒成立条件可以更好的拼接后续的其余条件(如果后续条件都不成立就不会多出where关键字,或者后续只有某些条件成立不会多出and关键字)且不影响最终的查询结果
where标签:多条件查询方式2
where标签中有内容时,会自动生成where关键字,并且将内容前多余的and和or去掉;如果where标签中的内容都都不符合条件(where标签中没有内容),则不生成where关键字(where标签没有任何效果)。注意:where标签不能将其中内容后面多余的and和or去掉。
<select id="getEmpByConditions" resultType="Emp">
select * from t_emp
<where>
<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 email = #{email}
</if>
</where>
</select>
trim标签:多条件查询方式3
trim 标签中有四个属性prefix、suffix、 suffixOverrides、 prefixOverrides
- prefix | suffix:将trim标签中内容前面或后面添加指定内容
- suffixOverrides | prefixOverrides:将trim标签中内容前面或后面去掉指定内容
若标签中有内容时:根据标签中是属性设置在前面或后面进行添加或删除指定内容 ;若标签中没有内容时,trim标签也没有任何效果(和where一样)
<select id="getEmpByConditions" resultType="Emp">
select * from t_emp
<trim prefix="where" suffixOverrides="and|or">
<if test="empName != null and empName != ''">
emp_name = #{empName} and
</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 !=''">
email = #{email}
</if>
</trim>
</select>
choose、when、otherwise标签
choose、when、otherwise标签相当于java中的if…else if…else效果
choose是一个父标签,when标签和otherwise标签需要写在choose标签中
<!--List<Emp> getEmpByChoose(Emp emp);-->
<select id="getEmpByChoose" resultType="Emp">
select * from t_emp
<where>
<choose>
<when test="empName != null and empName != ''">
emp_name = #{empName}
</when>
<when test="age != null and age != ''">
age = #{age}
</when>
<when test="sex != null and sex != ''">
sex = #{sex}
</when>
<when test="email != null and email != ''">
email = #{email}
</when>
<otherwise>
did = 1
</otherwise>
</choose>
</where>
</select>
when标签至少要有一个,otherwise标签最多只能有一个;choose 标签按顺序判断其内部 when 标签中的判断条件是否成立,如果有一个成立,则执行相应的 SQL 语句,choose 执行结束;如果都不成立,则执行 otherwise 中的 SQL 语句
foreach标签
foreach是用来进行循环的,例如,批量删除与批量添加操作从浏览器端所获取的是一个集合,因此要通过对数组进行循环来实现功能。
foreach 标签主要有以下属性,说明如下(以使用IN关键字为例)。
collection:设置需要循环的数组或集合
item:表示集合中每一个元素进行迭代时的别名。
index:指定一个名字,表示在迭代过程中每次迭代到的位置。
open:表示该语句以什么开始(既然是 in 条件语句,所以必然以‘(’开始)。
separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
close:表示该语句以什么结束(既然是 in 条件语句,所以必然以‘)’结束)。
使用foreach标签进行批量删除:两种方式分别对应关键字IN和OR:
<!--int deleteMoreByArray(@Param("eids") Integer[] eids);-->
<!--foreach 标签主要有以下属性,说明如下。
item:表示集合中每一个元素进行迭代时的别名。
index:指定一个名字,表示在迭代过程中每次迭代到的位置。
open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。
-->
<!--批量删除方式1-->
<delete id="deleteMoreByArray">
delete from t_emp where eid in
<foreach collection="eids" item="eid" separator="," open="(" close=")">
#{eid}
</foreach>
</delete>
<!--批量删除方式2 int deleteMoreByArrayTwo(@Param("eids") Integer[] eids);-->
<delete id="deleteMoreByArrayTwo">
delete from t_emp where
<foreach collection="eids" item="eid" separator="or">
eid = #{eid}
</foreach>
</delete>
使用foreach进行批量添加:
<!--int insertMoreByList(@Param("emps") List<Emp> emps);-->
<insert id="insertMoreByList">
insert into t_emp values
<foreach collection="emps" item="emp" separator=",">
(null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)
</foreach>
</insert>
sql标签
使用sql标签可以定义sql片段,通过include标签引用sql片段,include标签中的refid属性对应应用sql片段的id