最常用的动态sql语句梳理Mybatis(转)

公司项目中一直使用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>

时间: 2024-10-10 23:11:59

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

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

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

MyBatis学习总结_11_MyBatis动态Sql语句

MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach 1.if 对属性进行判断,如果不为空则执行判断条件 [html] view plaincopy <select id="selectByCriteria" parameterType="com.mu

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

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 a

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

转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中

Mybatis学习之动态sql语句(7)

Mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的

MyBatis的动态SQL语句这么厉害的!

MyBatis动态SQL语句,非常实用 MyBatis 的强大特性之一便是它的动态 SQL.简直厉害啦~ if if 语句比较常用,查询.删除.修改的时候都是可以用到! 其中的 where 1 = 1 仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法. where 1 = 0 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表 <!-- 测试 if 语句 id 与之查询方法相对应 resultType 表示User对

MyBatis 源码分析——动态SQL语句

有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以mybatis动态SQL功能在笔者看来是最引吸人的.为了更好的区别XML映射文件上的SQL语句.mybatis把SQL语句分为四类.那么这个笔者已经在前面的章节里面讲过了.但是我们在开发过程中常常用到的也就俩种:静态和动态. 关于静态和动态的定义,笔者是这样子理解的--静态SQL语句显示就是里面没有相

MyBatis学习(三)、动态SQL语句

三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使

Mybatis使用之动态SQL语句

Mybatis使用之动态SQL语句 一:简介 Mybatis动态SQL语句可帮助我们根据需要动态拼接SQL语句.主要在配置文件中使用<where> <if><choose><when><otherwise> <set> <trim><foreach>标签来实现. 二:具体使用方式 2.1 where 2.1.1 功能 语句的作用主要是简化SQL语句中where中的条件判断,where元素的作用是会在写入wher