1. 程式人生 > >mybatis教程4(動態SQL)

mybatis教程4(動態SQL)

over ffffff 標簽 oss 分享 when eve http test

動態SQL語句

MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格,還要註意去掉列表最後一個列名的逗號。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。
雖然在以前使用動態 SQL 並非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射語句中的強大的動態 SQL 語言得以改進這種情形。
動態 SQL 元素和 JSTL 或基於類似 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多元素需要花時間了解。MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 采用功能強大的基於 OGNL 的表達式來淘汰其它大部分元素。

if語句

動態 SQL 通常要做的事情是根據條件包含 where 子句的一部分。比如:

<select id="queryUser" resultMap="baseMap"
     resultType="com.sxt.bean.User" parameterType="user"> 
    select id ,name ,age  from t_user 
    where 1 =1 
    <if test="username!=null">
         and name = #{username}
    </if>  
</select> 
// 接口
public List<User> queryUser(User user);

測試
技術分享圖片技術分享圖片

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>

where語句

在使用if語句做動態條件處理的時候如果所有條件都不滿足,那麽得到的SQL語句如下:

select * from t_user where 

在這種情況下,我們一般會加一個1=1來匹配語法規則

    <select id="queryUser" resultMap="baseMap"
         resultType="com.sxt.bean.User" parameterType="user"> 
        select id ,name ,age  from t_user 
        where 1 =1  
        <if test="username!=null">
             and name = #{username}
        </if>  
    </select> 

此時可以使用標簽來處理這種情況

    <select id="queryUser" resultMap="baseMap"
         resultType="com.sxt.bean.User" parameterType="user"> 
        select id ,name ,age  from t_user 
        <where>
            <if test="username!=null">
                 and name = #{username}
            </if>  
        </where>
    </select> 

技術分享圖片技術分享圖片技術分享圖片

set語句

set主要也是用來解決更新問題的。

<update id="updateBookById">
    update t_book
    <set>
            <if test="author!=null"> author=#{author},</if>
            <if test="name!=null"> b_name=#{name},</if>
            <if test="price!=null"> price=#{price},</if>
    </set>
    where id=#{id};
</update>

trim

trim標記是一個格式化的標記,可以完成set或者是where標記的功能

屬性 說明
prefix 前綴
prefixOverrides 去掉第一個指定內容
suffix 後綴
suffixoverride 去掉最後一個指定內容

替代<where>的用法

    <select id="queryUser" resultMap="baseMap" resultType="com.sxt.bean.User"
        parameterType="user">
        select id ,name ,age from t_user
        <!-- <where>
            <if test="username!=null">
                and name = #{username}
            </if>
        </where> -->
        <trim prefix="where" prefixOverrides="AND |OR ">
            <if test="username!=null">
                 and name = #{username}
            </if>
            <if test="age != 0">
                and age = #{age}
            </if>
        </trim>
    </select>

替代<set>的用法

<update id="updateUser" parameterType="User">
    update t_user
    <trim prefix="set" suffixOverrides=",">
        <if test="username!=null">
            name = #{username},
        </if>
        <if test="age != 0">
            age = #{age}
        </if>
    </trim>
    where id=#{id}
</update>

或者

<update id="updateUser" parameterType="User">
    update t_user
    set 
    <trim  suffixOverrides=",">
        <if test="username!=null">
            name = #{username},
        </if>
        <if test="age != 0">
            age = #{age}
        </if>
    </trim>
    where id=#{id}
</update>

技術分享圖片

foreach語句

foreach用來遍歷,遍歷的對象可以是數組,也可以是集合。
屬性|說明
-----|:------
collection|collection屬性的值有三個分別是list、array、map三種
open|前綴
close|後綴
separator|分隔符,表示叠代時每個元素之間以什麽分隔
item|表示在叠代過程中每一個元素的別名
index|用一個變量名表示當前循環的索引位置
==接口中方法==

public interface UserMapper {
    // 如果不指定@Param 默認是array
    public List<User> queryUserByIds(@Param("ids")List<Integer> ids);

    public int insertUser(@Param("users")List<User> users);
}
<select id="queryUserByIds" resultType="user">
    select * from t_user where id in 
    <foreach collection="ids" open="(" close=")" separator="," item="id" >
        #{id}
    </foreach>
</select>

<insert id="insertUser">
    insert into t_user(name,age)values
    <foreach collection="users" item="user" separator=",">
        (#{user.name},#{user.age})
    </foreach>
</insert>

技術分享圖片技術分享圖片

bind

bind 元素可以從 OGNL 表達式中創建一個變量並將其綁定到上下文。

<select id="getUserById" resultMap="baseMap" resultType="com.sxt.bean.User">
    <!-- 聲明了一個參數aaa 在後面就可以使用了 -->
    <bind name="aaa" value="12"/>
    select
    id ,name ,age from t_user where id=${aaa}
</select>

技術分享圖片

sql塊

sql片段一般用來定義sql中的列
技術分享圖片

mybatis教程4(動態SQL)