公司项目中一直使用Mybatis作为持久层框架,自然,动态sql写得也比较多了,最常见的莫过于在查询语句中使用if标签来动态地改变过滤条件了。Mybatis的强大特性之一便是它的动态sql,免除了拼接sql带来的各种麻烦,在开发项目的过程中,常见的和不常见的你都有可能会用到,现在就来把这一块总结一下。

  •   if
  •   choose(when,otherwise)
  •   trim(where,set)
  •   foreach

if

<select id="getCategory" parameterType="EshopShopCategory" resultMap="EshopCategory" >
  SELECT * from MALLT_SHOP_CATEGORY t WHERE (1=1)
<if test="eshopShopCategory.shopCategoryId!=null">
AND t.shop_category_id =#{eshopShopCategory.shopCategoryId}
</if>
<if test="eshopShopCategory.shopCategoryName!=null">
AND t.SHOP_CATEGORY_NAME like '%${eshopShopCategory.shopCategoryName}%'
</if>
<if test="eshopShopCategory.shopId==null">
AND t.shop_id=0
</if>
ORDER BY SEQUENCE_NO
</select>

  这通常用于多条件组合查询。

<insert id="addProductCategory" parameterType="EshopShopCategory">
insert into MALLT_SHOP_CATEGORY(
<if test="shopCategoryName!=null and shopCategoryName!='' ">
  shop_category_name,
</if>
<if test="shopId!=null and shopId!=''">
shop_id,
</if>
ADD_TIME)
values(
  <if test="shopCategoryName!=null and shopCategoryName!=''">
  #{shopCategoryName,jdbcType=VARCHAR},
  </if>
  <if test="shopId!=null and shopId!=''">
  #{shopId,jdbcType=NUMERIC},
  </if>
  current_timestamp
) </insert>
这适用于数据库有默认值的时候可以不让插入空值。
<update id="updateProductCategory" parameterType="EshopShopCategory" >
update MALLT_SHOP_CATEGORY t set
<if test="shopCategoryName!=null">
t.shop_category_name=#{shopCategoryName,jdbcType=VARCHAR},
</if>
<if test="updateUser!=null">
t.update_user=#{updateUser,jdbcType=VARCHAR} ,
</if>
t.update_time=current_timestamp
where t.shop_category_id=#{shopCategoryId,jdbcType=NUMERIC}
</update>

这条动态地修改语句用得非常多,是因为很多时候我们在做修改操作时并不确定到底要修改哪些字段(哪些属性),可能有的需要保存原值不变,这时候就可以做动态的sql,你新建一个对象后将需要修改的字段附上新值,这样不用修改的属性在这个对象上表现地是null,调用这个动态的sql时便可以完成部分修改。

choose,when,otherwise

适用场景:我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。(我感觉它有点像提供多种条件规则时,而这些规则又可以综合写在一起时)

<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>

到目前为止,我还没有用到过choose,以后多留意。

trim,where,set

为了避免当if动态条件都不成立时,或者第一个条件不成立第二个条件成立时出现诸如"select * from TableA where"或者"select * from TableA and where"病态sql,我们可以使用trim,where,set标签来解决。

<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>

在实际应用中,我通常是不写where标签,而在where关键字之后加上1=1的条件。即不管有无动态条件,总可以得到完整的sql:select * from A where 1=1。。。

<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>

foreach

foreach有时候在项目中会遇到,而且不止一次,用的时候是需要动点脑子的。通常用于筛选出在多个值组成的一个集合中或者排除多个值的场景,说白了,也就是我们之前写sql时用到in、not in的时候:(集合是动态不确定的,需要从前台传值过来)

<select id="selectNumInOrder" resultType="String">
select count(0) from eshop_order a left join eshop_order_item b on a.ORDER_ID = b.ORDER_ID
where a.STATUS in ('1','2','3','5')
<if test="list.size() > 0">
and b.PHONE_NUM in
<foreach item="numberList" collection="list" open="(" separator="," close=")">
#{numberList.num}
</foreach>
</if>
</select>
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>

foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

注意 你可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。

以上是结合http://mybatis.github.io/mybatis-3/zh/getting-started.html及自己开发中比较常用的总结出来的,今天给梳理一下,分享给大家!

行走在设计师的路上!
 
http://www.cnblogs.com/yolanda-lee/p/4552514.html
 

最常用的动态sql语句梳理Mybatis(转)的更多相关文章

  1. 最常用的动态sql语句梳理——分享给使用Mybatis的小伙伴们!

    公司项目中一直使用Mybatis作为持久层框架,自然,动态sql写得也比较多了,最常见的莫过于在查询语句中使用if标签来动态地改变过滤条件了.Mybatis的强大特性之一便是它的动态sql,免除了拼接 ...

  2. MyBatis学习总结_11_MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

  3. MyBatis学习总结(11)——MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

  4. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

  5. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  6. 【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if ...

  7. 7. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:http://www.kyjszj.com/htzq/79.html 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 sw ...

  8. mybatis 动态sql语句(3)

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

  9. Mybatis学习(8)动态sql语句

    Mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

随机推荐

  1. syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区

    syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区 syslog-ng 3.4.3 发布,强烈建议升级    oschina 发布于: 2013年08月16日 (2评)    分享到 ...

  2. 从零开始学C++之动态创建对象

    回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Circle"之类的语法,导致CreateShape 函 数中需要不断地ifelse地去判断, ...

  3. 架设FLASH视频流server心得

    什么样的情况下才使用FMS?有下面几种情形的时候,你可能须要用到FMS 1.须要通过Flash Player 播放视频,而视频是以流的方式,而不是http渐进式下载的方式进行播放的时候.渐进式下载就是 ...

  4. hdu1503(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503 题意:由两个字符串构造出另一个字符串,该字符串包含前两个字符串(按字符顺序,但不一定连续),使该 ...

  5. Nginx使用ngx_zeromq模块返回502错误的解决方法

    /*********************************************************************  * Author  : Samson  * Date   ...

  6. 基于 Groovy 的自动化构建工具 Gradle 入门(转)

    本人工作之初没有使用自动化构建,后来敏捷了,开始使用 Ant - 完全面向过程的定义步骤,不进行依赖管理.再发展到 Maven,面向对象的方式管理工程,有了依赖的管理,JAR 包统一从中央仓库获得,保 ...

  7. AS3.0下去除flash右键菜单

    这两天工作中遇到一个问题,就是网页中内嵌的flash小游戏的用户体验,当鼠标在flash上点击右键时,出现的右键菜单中会有播放,停止等选项,虽然不会造成什么漏洞,但是体验非常差.在寻找解决方案的时候, ...

  8. Smarty中模板eq相等 ne、neq不相等, gt大于, lt小于

    eq相等   ne.neq不相等,   gt大于, lt小于 gte.ge大于等于   lte.le 小于等于   not非   mod求模   is [not] div by是否能被某数整除   i ...

  9. CentOS 6.5安全加固及性能优化

    (文章来自:http://www.cnblogs.com/seasonzone/p/3526296.html) 我们可以通过调整系统参数来提高系统内存.CPU.内核资源的占用,通过禁用不必要的服务.端 ...

  10. matlab 2014a 改为英文版本号

    1. 在 Matlab 的安装目录以下找到例如以下的路径,X:\MATLAB\R2014a\java\jar,当中 X 为安装盘符,这个不用过多解释了,然后找到目录 zh_CN.此目录就是中文界面的语 ...