首页 / 技术 / 正文

MyBatis中的动态SQL语句

2016年01月13日 暂无评论 ... 技术

MyBatis 支持使用动态 SQL ,灵活配置 SQL 语句。

主要的 MyBatis 动态 SQL 语句有:

if, choose, when, otherwise, where, trim, set, foreach

1.if

if语句用于根据条件进行筛选用。

(注,代码来自iteye)

  1. <select id="dynamicIfTest" parameterType="Blog" resultType="Blog">    
  2.     select * from t_blog where id = 1    
  3.     <if test="title != null">    
  4.         and title = #{title}    
  5.     </if>    
  6.     <if test="content != null">    
  7.         and content = #{content}    
  8.     </if>    
  9.     <if test="owner != null">    
  10.         and owner = #{owner}    
  11.     </if>    
  12. </select>  

if 标签中含有属性 test,配置的是判断条件,判断条件中可以使用 and or 等逻辑语句进行多条件判断。

2.choose, when, otherwise

when 语句相当于常见的 switch-case 语句,与 otherwise 匹配,相当于 default。

  1. <select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">    
  2.     select * from t_blog where id = 1     
  3.     <choose>    
  4.         <when test="title != null">    
  5.             and title = #{title}    
  6.         </when>    
  7.         <when test="content != null">    
  8.             and content = #{content}    
  9.         </when>    
  10.         <otherwise>    
  11.             and owner = "owner1"    
  12.         </otherwise>    
  13.     </choose>    
  14. </select> 

与 if 类似,when 标签中也有 test 属性,内容填写条件。

3.where

where 可以代替 SQL 语句中的 where ,可以更加灵活地搭配动态 SQL 语句。

  1. <select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">    
  2.     select * from t_blog     
  3.     <where>    
  4.         <if test="title != null">    
  5.             title = #{title}    
  6.         </if>    
  7.         <if test="content != null">    
  8.             and content = #{content}    
  9.         </if>    
  10.         <if test="owner != null">    
  11.             and owner = #{owner}    
  12.         </if>    
  13.     </where>    
  14. </select> 

如代码所示,如果 <where>标签中的 if 都不符合的话,则不会产生 select * from t_blog where 这样诡异的语句,一切都会被自动修改成正确的。

4.trim

trim 的英文汉译是“修饰”,这个语句在 Mybits 中的作用也是修饰作用。

  1. <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">    
  2.     select * from t_blog     
  3.     <trim prefix="where" prefixOverrides="and |or">    
  4.         <if test="title != null">    
  5.             title = #{title}    
  6.         </if>    
  7.         <if test="content != null">    
  8.             and content = #{content}    
  9.         </if>    
  10.         <if test="owner != null">    
  11.             or owner = #{owner}    
  12.         </if>    
  13.     </trim>    
  14. </select> 

trim 的属性如下

prefix:前缀覆盖并增加其内容

suffix:后缀覆盖并增加其内容

prefixOverrides:前缀判断的条件

suffixOverrides:后缀判断的条件

实际应用中,trim 可以去替代 where,set 等标签,不过应用的并不是很广。

5.set

set 标签是用做 update SQL 语句中的 set 替代的,所以一般用于更新语句。

  1. <update id="dynamicSetTest" parameterType="Blog">    
  2.     update t_blog    
  3.     <set>    
  4.         <if test="title != null">    
  5.             title = #{title},    
  6.         </if>    
  7.         <if test="content != null">    
  8.             content = #{content},    
  9.         </if>    
  10.         <if test="owner != null">    
  11.             owner = #{owner}    
  12.         </if>    
  13.     </set>    
  14.     where id = #{id}    
  15. </update> 

如果 set 条件中没有满足的,则会出现错误。

6.foreach

foreach 使用比较多样,作用是可以迭代一个集合类的数据。可以迭代的类型有三种,分别是 List, Array, Map。

foreach 有6个参数

collection:表示参数形式,即 List, Array, Map

index:指的是迭代过程中每次迭代到的位置

item:迭代的时候的别名

open:开始时的符号

separator:分割符号

close:结束时的符号

  1. <select id="dynamicForeachTest" resultType="Blog">    
  2.     select * from t_blog where id in    
  3.     <foreach collection="list" index="index" item="item" open="(" separator="," close=")">    
  4.         #{item}    
  5.     </foreach>    
  6. </select> 

暂无评论

发布评论