1. if, where
if:根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中
where:
- 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and或or去掉
- 当where标签中没有内容时,此时where标签没有任何效果
- 注意:where标签不能将其中内容后面多余的and或or去掉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <select id="selectEmployeeByCondition" resultType="employee"> select emp_id, emp_name, emp_salary from t_emp <where> <if test="empName != null and empName != ''"> or emp_name = #{empName} </if> <if test="empSalary > 2000"> or emp_salary > #{empSalary} </if>
</where> </select>
|
2. set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <update id="updateEmployeeDynamic"> update t_emp <set> <if test="empName != null"> emp_name = #{empName}, </if> <if test="empSalary < 3000"> emp_salary = #{empSalary}, </if> </set> where emp_id=#{empId}
</update>
|
3. trim
使用trim标签控制条件部分两端是否包含某些字符
- prefix属性:指定要动态添加的前缀
- suffix属性:指定要动态添加的后缀
- prefixOverrides属性:指定要动态去掉的前缀,使用”|”分隔有可能的多个值
- suffixOverrides属性:指定要动态去掉的后缀,使用”|”分隔有可能的多个值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <select id="selectEmployeeByConditionByTrim" resultType="com.atguigu.mybatis.entity.Employee"> select emp_id, emp_name, emp_age, emp_salary, emp_gender from t_emp <trim prefix="where" suffixOverrides="and|or"> <if test="empName != null"> emp_name=#{empName} and </if> <if test="empSalary > 3000"> emp_salary>#{empSalary} and </if> <if test="empAge <= 20"> emp_age=#{empAge} or </if> <if test="empGender=='male'"> emp_gender=#{empGender} </if> </trim> </select>
|
4. choose, when, otherwise
在多个分支条件中,仅执行一个。
- 从上到下依次执行条件判断
- 遇到的第一个满足条件的分支会被采纳
- 被采纳分支后面的分支都将不被考虑
- 如果所有的when分支都不满足,那么就执行otherwise分支
- when至少要有一个,otherwise最多只能有一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <select id="selectEmployeeByConditionByChoose" resultType="com.atguigu.mybatis.entity.Employee"> select emp_id, emp_name, emp_salary from t_emp where <choose> <when test="empName != null">emp_name=#{empName}</when> <when test="empSalary < 3000">emp_salary < 3000</when> <otherwise>1=1</otherwise> </choose>
</select>
|
5. foreach
collection属性:要遍历的集合
item属性:遍历集合的过程中能得到每一个具体对象,在item属性中设置一个名字,将来通过这个名字引用遍历出来的对象
separator属性:指定当foreach标签的标签体重复拼接字符串时,各个标签体字符串之间的分隔符
open属性:指定整个循环把字符串拼好后,字符串整体的前面要添加的字符串
close属性:指定整个循环把字符串拼好后,字符串整体的后面要添加的字符串
index属性:这里起一个名字,便于后面引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
<insert id="insertMoreByList"> insert into t_emp <foreach collection="emps" item="emp" separator="," open="values" index="myIndex"> (null, #{emp.empName}, #{emp.age}, #{emp.sex}, #{emp.email}, #{myIndex}) </foreach> </insert>
<delete id="deleteMoreByArray"> delete from t_emp where <foreach collection="eids" item="eid" separator="or"> eid = #{eid} </foreach>
</delete>
|
关于foreach标签的collection属性
如果没有给接口中List类型的参数使用@Param
注解指定一个具体的名字,那么在collection属性中默认可以使用collection或list来引用这个list集合。这一点可以通过异常信息看出来:
Parameter 'orderIds' not found. Available parameters are [arg0, collection, list]
数组类型可用的参数名为 [array, arg0]
批量更新时需要注意
上面批量插入的例子本质上是一条SQL语句,而实现批量更新则需要多条SQL语句拼起来,用分号分开。也就是一次性发送多条SQL语句让数据库执行。此时需要在数据库连接信息的URL地址中设置:
1
| dev.url=jdbc:mysql://localhost:3306/mybatis-db?allowMultiQueries=true
|
对应的foreach标签如下:
1 2 3 4 5 6
| <update id="updateEmployeeBatch"> <foreach collection="empList" item="emp" separator=";"> update t_emp set emp_name = #{emp.empName} where emp_id = #{emp.empId} </foreach> </update>
|
6. sql片段
提取重复的 SQL 片段
1 2 3 4
| <sql id="mySelectSql"> select emp_id, emp_name, emp_age, emp_salary, emp_gender from t_emp </sql>
|
引用已提取的SQL片段
1 2
| <include refid="mySelectSql"/>
|