MyBatis探究-----动态SQL详解
Posted fengfuwanliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis探究-----动态SQL详解相关的知识,希望对你有一定的参考价值。
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 && empName.trim()!="""> 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中:
<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee"> select * from t_employee <where> <if test="empId!=null"> empId=#{empId} </if> <if test="empName!=null && empName.trim()!="""> and empName like #{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 && empName!="""> 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 语句查询时特别有用)
以上是关于MyBatis探究-----动态SQL详解的主要内容,如果未能解决你的问题,请参考以下文章