动态SQL
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。
One of the most powerful features of MyBatis has always been its Dynamic SQL capabilities. If you have any experience with JDBC or any similar framework, you understand how painful it is to conditionally concatenate strings of SQL together, making sure not to forget spaces or to omit a comma at the end of a list of columns. Dynamic SQL can be downright painful to deal with.
MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。
主要针对两种数据进行判断:1. null 2. "" 空字符串
1. if 标签
<select id="getEmpByConditionOne" resultType="Emp">
SELECT * FROM t_emp WHERE 1=1
<if test="empId != null and empId != ''">
AND emp_id = #{empId}
</if>
<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>
</select>
2. where + if 标签
where 标签动态生成关键字:
- 如果 where标签中有条件成立,则自动生成 where关键字,否则 where标签以及内容会跳过
- where标签会对条件成立的语句自动去除第一个 and关键字,因此 where内的所有语句前可以统一加 and
<!-- where 标签动态生成关键字:
1. 如果 where标签中有条件成立,则自动生成 where关键字,否则 where标签以及内容会跳过
2. where标签会对条件成立的语句自动去除第一个 and关键字,因此 where内的所有语句前都加 and -->
<select id="getEmpByConditionTwo" resultType="Emp">
SELECT * FROM t_emp
<where>
<if test="empId != null and empId != ''">
AND emp_id = #{empId}
</if>
<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>
3. trim + if 标签
trim 标签有四个属性分别是在所有内容前后进行操作:
prefix 添加前缀 prefixOverrides 去除前缀
suffix 添加后缀 suffixOverrides 去除后缀
<!-- trim 标签有四个属性分别是在所有内容前后进行操作
prefix 添加前缀 prefixOverrides 去除前缀
suffix 添加后缀 suffixOverrides 去除后缀
-->
<select id="getEmpByConditionThree" resultType="Emp">
SELECT * FROM t_emp
<trim prefix="where" suffixOverrides="and">
<if test="empId != null and empId != ''">
emp_id = #{empId} AND
</if>
<if test="empName != null and empName != ''">
emp_name = #{empName} AND
</if>
<if test="age != null and age != ''">
age = #{age} AND
</if>
<if test="gender != null and gender != ''">
gender = #{gender} AND
</if>
</trim>
</select>
4. choose when otherwise 组合标签
choose 中的多个 when 条件有一个成立就会跳出 choose,类似if(){}...else if(){}...else{}
choose 中至少有一个 when,至多有一个 otherwise
<!-- choose、when、otherwise
choose 中的多个 when 条件有一个成立就会跳出 choose 类似if(){}...else if(){}...else{}
choose 中至少有一个 when,至多有一个 otherwise
-->
<select id="getEmpByCondition" resultType="Emp">
SELECT * FROM t_emp
<where>
<choose>
<when test="empId != null and empId != ''">
emp_id = #{empId}
</when>
<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>
1=1
</otherwise>
</choose>
</where>
</select>
5. foreach 标签
foreach 标签,对集合或数组进行遍历
- 属性 collection 设置需要循环遍历的数组或集合对象
- 属性 item 数组或集合中的元素命名(别名) 类似for( item : collection )
- 属性 separator 每次遍历间的分隔符(会自动在两侧添加空格)
- 属性 open close 组合同时使用,设置遍历开始前的前缀和遍历结束后的后缀
批量插入时,values (a),(b),(c)
<!-- foreach 标签,对集合或数组进行遍历
属性 collection 设置需要循环遍历的数组或集合对象
属性 item 数组或集合中的元素命名(别名) 类似for(item : collection)
属性 separator 每次循环间的分隔符(会自动在两侧添加空格)
-->
<insert id="insertMoreEmp" useGeneratedKeys="true" keyProperty="empId">
INSERT INTO t_emp VALUES
<foreach collection="emps" item="emp" separator=",">
(null, #{emp.empName}, #{emp.age}, #{emp.gender}, null)
</foreach>
</insert>
批量删除方法一,WHERE key IN (a, b, c)
<!--方法一:IN 判断 emp_id 是否在需要删除的数组中
DELETE FROM t_emp WHERE emp_id IN (1,2,3);
属性 open close 同时使用,设置以开始遍历前的前缀和遍历结束后的后缀
-->
<delete id="deleteMoreEmpByIdOne">
DELETE FROM t_emp WHERE emp_id IN
<foreach collection="empIds" item="empId" separator="," open="(" close=")">
#{empId}
</foreach>
</delete>
批量删除方法二,WHERE key = a OR key = b OR key =c
<!-- 方法二:OR 连接数组内容,逐个判断
DELETE FROM t_emp WHERE emp_id=1 OR emp_id=2 OR emp_id=3;
-->
<delete id="deleteMoreEmpById">
DELETE FROM t_emp WHERE
<foreach collection="empIds" item="empId" separator="OR">
emp_id = #{empId}
</foreach>
</delete>
6. sql 标签
sql标签,记录重复的SQL片段,后续再使用只需调用 id
实际开发中,SELECT * 是不常使用的, * 在mysql中还是需要转换为每个字段名再进行查询
因此,将表中的所有字段用 sql标签封装,需要时直接调用,代替 SELECT *
在需要调用 sql片段的地方使用 include标签进行引用
<!-- sql标签,记录重复的SQL片段,后续再使用只需调用 id
实际开发中,SELECT * 是不常使用的, * 在mysql中还是需要转换为每个字段名再进行查询
因此,将表中的所有字段用 sql标签封装,需要时直接调用,代替 SELECT *
-->
<sql id="empColumns">
emp_id, emp_name, age, gender, dept_id
</sql>
<!-- 在需要调用 sql片段的地方使用 include标签进行引用 -->
<select id="getEmps" resultType="Emp">
SELECT <include refid="empColumns"></include> FROM t_emp
</select>
标签:标签,age,SQL,emp,gender,动态,id,Mybatis12
From: https://www.cnblogs.com/Ashen-/p/17120656.html