MyBatis 之 动态SQL技术
引言:
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。 如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
这里我们使用的表为t_emp 对应的实体类名为Emp 字段: emp_name, emp_id ,age ,gender 对应的属性名 : empName , empId , age ,gender
First : if 标签
if 标签只有一个test属性 只有test属性的表达式判定结果为true ,其中的内容才会被执行
代码语言:javascript复制<select id="getEmpByCondition" resultType="Emp">
select * from t_emp where
<if test="empName != null and empName != ''">
emp_name = #{empName}
</if>
<if test="gender != null and gender != ''">
and gender = #{gender}
</if>
</select>
复制代码
但是这样做的局限性非常大 , 如果我们第一个if 不满足的话 ,那么就会导致后面满足条件的语句前面多出来一个and ,这个问题又无法解决 ,那么就用到了下面的where标签
Second : where标签
使用where 标签作用:
- 如果标签中没有任何的条件满足 那么就不需要执行任何的功能 ;可以直接退出 , 如果满足 那么就执行里面的if 标签
- 可以将if中内容前面的没用的and去除 ( 内容后面的and 无法去除), 所以可以都添加 ;
- 如果 where 标签中有条件成立 , 他将会自动的添加where
<select id="getEmpByCondition" 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="gender != null and gender != ''">
and gender = #{gender}
</if>
</where>
</select>
复制代码
Third : trim 标签
trim标签中相关属性的作用
- prefix / suffix: 在内容前面 / 后面添加指定内容
- prefixOverrides /suffixOverrides 在内容前面 / 后面 去除某些指定内容
<select id="getEmpByCondition" resultType="Emp">
select * from t_emp
<trim prefix="where" prefixOverrides="and">
<if test="empName != null and empName != ''">
and emp_name = #{empName}
</if>
<if test="age != null and age != ''">
and age = #{age}
</if>
<if test="gender != null and gender != ''">
and gender = #{gender}
</if>
</trim>
</select>
复制代码
Fourth : choose - when - otherwise 标签
它和java中的switch语句十分相似 ,所以它只有一个when语句会被执行 ,如果都不满足 , 那么就会执行otherwise语句
代码语言:javascript复制<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="gender != null and gender != ''">
gender = #{gender}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
复制代码
Fifth : foreach 标签
属性:
- collection:设置要循环的数组或集合
- item:表示集合或数组中的每一个数据
- separator:设置循环体之间的分隔符
- open:设置foreach标签中的内容的开始符
- close:设置foreach标签中的内容的结束符
<!-- 批量添加员工信息 void insertMoreEmp(@Param ("emps") List<Emp> emps);-->
<insert id="insertMoreEmp">
insert into t_emp values
<foreach collection="emps" item="emp" separator=",">
(null ,#{emp.empName},#{emp.age},#{emp.gender},null)
</foreach>
</insert>
复制代码
<!-- 批量删除的功能 void deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">
delete from t_emp where emp_id in
<foreach collection="empIds" item="empId" separator="," open="(" close=")">
#{empId}
</foreach>
</delete>
复制代码
Sixth : SQL标签
sql 标签 可以记录一段公共sql片段,在使用的地方通过include标签进行引入
代码语言:javascript复制<sql id="Columns">
emp_id, emp_name,age ,gender
</sql>
select <include refid="Columns"></include> from t_emp
复制代码
写在最后
如果各位觉得有用,请点赞支持一下
如果我写的哪里有不足, 以及各位觉得哪里不明白的请评论区指出
诚挚欢迎各位交流学习,共同进步