MyBatis探究-----动态SQL详解

时间:2022-10-06 20:35:09

1.if标签

接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);

XML中:where 1=1必不可少

<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
select * from t_employee where 1=1
<if test="empId!=null">
and empId=#{empId}
</if>
<if test="empName!=null &amp;&amp; empName.trim()!=&quot;&quot;">
and empName like #{empName}
</if>
<if test="empSex==0 or empSex==1">
and empSex=#{empSex}
</if>
<if test="empAge!=null">
and empAge=#{empAge}
</if>
</select>

2.where标签

接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);

XML中:

mybatis就会将where标签中拼装的sql,多出来的and或者or去掉,只会去掉第一个多出来的and或者or

<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
select * from t_employee
<where>
<if test="empId!=null">
empId=#{empId}
</if>
<if test="empName!=null &amp;&amp; empName.trim()!=&quot;&quot;">
and empName like concat('%',#{empName},'%')
</if>
<if test="empSex==0 or empSex==1">
and empSex=#{empSex}
</if>
<if test="empAge!=null">
and empAge=#{empAge}
</if>
</where>
</select>

3.set标签

接口中方法:public Integer updateEmp(Employee emp);

XML中:

<update id="updateEmp">
<!-- Set标签的使用 推荐 -->
<!-- update t_employee
<set>
<if test="empName!=null">
empName=#{empName},
</if>
<if test="empSex==0 or empSex==1">
empSex=#{empSex},
</if>
<if test="empAge!=null">
empAge=#{empAge}
</if>
</set>
where empId=#{empId} --> <!-- Trim:更新拼串 -->
update t_employee
<trim prefix="set" suffixOverrides=",">
<if test="empName!=null">
empName=#{empName},
</if>
<if test="empSex==0 or empSex==1">
empSex=#{empSex},
</if>
<if test="empAge!=null">
empAge=#{empAge}
</if>
</trim>
where empId=#{empId}
</update>

4.trim标签

接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);

XML中:

<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
select * from t_employee
<!-- 后面多出的and或者or where标签不能解决
prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
prefix给拼串后的整个字符串加一个前缀
prefixOverrides="":
前缀覆盖: 去掉整个字符串前面多余的字符
suffix="":后缀
suffix给拼串后的整个字符串加一个后缀
suffixOverrides=""
后缀覆盖:去掉整个字符串后面多余的字符 -->
<!-- 自定义字符串的截取规则 -->
<trim prefix="where" suffixOverrides="and">
<if test="empId!=null">
empId=#{empId} and
</if>
<if test="empName!=null &amp;&amp; empName!=&quot;&quot;">
empName like #{empName} and
</if>
<if test="empSex==0 or empSex==1">
and empSex=#{empSex}
</if>
<if test="empAge!=null">
and empAge=#{empAge}
</if>
</trim>
</select>

5.foreach标签

5.1 批量查询

接口中方法:public List<Employee> getEmpsByempIdList(@Param("empIdList")List<String> empIdList);

XML中:

<select id="getEmpsByempIdList" resultType="com.mybatis.entity.Employee">
select * from t_employee
<!-- collection:指定要遍历的集合
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
-->
<foreach collection="empIdList" item="empId" separator=","
open="where empId in(" close=")">
#{empId}
</foreach>
</select>

5.2 批量插入

接口中方法:public Integer addEmployees(@Param("emps")List<Employee> emps);

XML中:

<insert id="addEmployees">
<!-- 第一种方式:推荐 -->
insert into
t_employee(empId,empName,empSex,empAge)
values
<foreach collection="emps" item="emp" separator=",">
(#{emp.empId},#{emp.empName},#{emp.empSex},#{emp.empAge})
</foreach> <!-- 第二种方式:不推荐 需要数据库连接属性allowMultiQueries=true -->
<!--
<foreach collection="emps" item="emp" separator=";">
insert into t_employee(empId,empName,empSex,empAge)
values(#{emp.empId},#{emp.empName},#{emp.empSex},#{emp.empAge})
</foreach>
-->
</insert>

5.3 批量删除

接口中方法:public Integer deleteEmpsByempIdList(@Param("empIdList")List<String> empIdList);

XML中:

<delete id="deleteEmpsByempIdList">
delete from t_employee
<foreach collection="empIdList" item="empId" separator=","
open="where empId in(" close=")">
#{empId}
</foreach>
</delete>

   6.choose标签

     接口中方法:public List<Employee> getEmpsByChooseCondition(Employee emp);

XML中:

<select id="getEmpsByChooseCondition" resultType="com.mybatis.entity.Employee">
select * from t_employee
<where>
<!-- 如果带了empId就用empId查,如果带了empName就用empName查;只会进入其中一个 -->
<choose>
<when test="empId!=null">
empId=#{empId}
</when>
<when test="empName!=null">
empName like #{empName}
</when>
<otherwise>
empSex = 0
</otherwise>
</choose>
</where>
</select>

总结:mybatis 的动态sql语句是基于OGNL表达式的,主要有以下几类(可以随机组合)

  •   if  简单的条件判断
  •   choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
  •   trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
  •   where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
  •   set (主要用于更新时)
  •   foreach (在实现 mybatis in 语句查询时特别有用)