深入浅出Mybatis系列(九)—强大的动态SQL

 

  传统的动JDBC的法门,相信大家以整合复杂的的SQL语句之上,需要去拼接,稍不检点就少了单空格,都见面造成错误。Mybatis的动态SQL功能正是为化解这种问题,
其经过 if, choose, when, otherwise, trim, where, set,
foreach标签,可结合成非常灵活的SQL语句,从而提高开发人员的频率。下面就是错过感受Mybatis动态SQL的魅力吧:

 

1. if:    你们能断定,我呢能断定!

作程序猿,谁不知道 if !  在mybatis中吗能够因此 if 啦:

图片 1

<select id="findUserById" resultType="user">
           select * from user where 
           <if test="id != null">
               id=#{id}
           </if>
            and deleteFlag=0;
</select>

图片 2

地方例子: 如果传入的id 不为空, 那么才会SQL才拼接id = #{id}。
这个相信大家看一样就是能知道,不多说。

有心人的口会发现一个问题:“你马上不对准什么! 要是若传入的id为null,
 那么您顿时最终的SQL语句不就成了 select * from user where and
deleteFlag=0,  这语词有题目!”

凡是呀,这时候,mybatis的 where 标签就是该隆重登场啦:

 

2. where, 有了自身,SQL语句拼接条件神马的还是浮云!

我们通过where改造一下上面的例证:

图片 3

<select id="findUserById" resultType="user">
           select * from user 
           <where>
               <if test="id != null">
                   id=#{id}
               </if>
               and deleteFlag=0;
           </where>
 </select>

图片 4

小人就是假设问了: “你立即还是把什么玩意儿! 跟方的相比,
不纵是大抵矣个where标签嘛! 那这个还见面不见面出现  select * from user where
and deleteFlag=0 ?”

当真,从表面上来拘禁,就是大抵矣个where标签而已, 不了精神上,
mybatis是针对其做了处理,当它们撞AND或者OR这些,它掌握怎么处理。其实我们得经
trim 标签去打定义这种拍卖规则。

 

3. trim :  我之地盘,我做主!

地方的where标签,其实用trim 可以代表如下:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ... 
</trim>

它的意思就是是: 当WHERE后紧随AND或则OR的时,就失除AND或者OR。
除了WHERE以外, 其实还有一个于经典的实现,那就是SET。

 

4. set:  信我,不出错!

图片 5

<update id="updateUser" parameterType="com.dy.entity.User">
           update user set 
           <if test="name != null">
               name = #{name},
           </if> 
           <if test="password != null">
               password = #{password},
           </if> 
           <if test="age != null">
               age = #{age}
           </if> 
           <where>
               <if test="id != null">
                   id = #{id}
               </if>
               and deleteFlag = 0;
           </where>
</update>

图片 6

题目又来了: “如果我只有name不也null,  那么就SQL不就是成了 update set name
= #{name}, where …….. ?  你那么name后面那逗号会导致差啊!”

是,这时候,就得据此mybatis为我们提供的set
标签了。下面是由此set标签改造后:

图片 7

<update id="updateUser" parameterType="com.dy.entity.User">
           update user
        <set>
          <if test="name != null">name = #{name},</if> 
             <if test="password != null">password = #{password},</if> 
             <if test="age != null">age = #{age},</if> 
        </set>
           <where>
               <if test="id != null">
                   id = #{id}
               </if>
               and deleteFlag = 0;
           </where>
</update>

图片 8

夫用trim 可代表也:

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

WHERE是动的 prefixOverrides(前缀), SET是下的 suffixOverrides
(后缀), 看明白了咔嚓!

 

5. foreach:  你生出for, 我出foreach, 不要觉得就是您才屌!

java中起for, 可由此for循环, 同样, mybatis中有foreach,
可经过它们实现循环,循环的靶子自然要是java容器和数组。

图片 9

<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>

图片 10

以一个 List 实例或者数组作为参数对象传于
MyBatis,当如此做的时段,MyBatis 会自动将它包裹在一个 Map
中连盖名称为键。List
实例将会见盖“list”作为键,而数组实例的键将是“array”。同样,
当循环的目标呢map的当儿,index其实就是map的key。

 

6. choose:  我选择了卿,你选择了自家!

Java中有switch,  mybatis有choose。

图片 11

<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>

图片 12

如上例子中: 当title和author都无也null的时候,
那么选择二抉择同(前者优先), 如果都为null, 那么尽管分选 otherwise中之,
如果tilte和author只发一个无呢null, 那么即使选择无为null的可怜。

综观mybatis的动态SQL, 强大使简易, 相信大家简单看一下便可知下了。

哼啊,本次就写及马上!下篇文章将组成mybatis的源码分析一次sql语句执行的整个过程。

 

网站地图xml地图