mybatis入門-2 動態sql

MyBatis 的強大特性之一即是它的動態 SQL。 閒話少說,代碼擼起來!數組

 

IF 這基本上是where的必需品了mybatis

public interface BlogMapper {
  //這個地方須要註解 @Param 對這個參數進行命名,要否則if的時候獲取不到參數名稱
    List<Blog> selectByTitle(@Param("title") String title);

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 綁定Dao接口,以後,你能夠不用寫接口實現類,
mybatis會經過與id同名的接口自動幫你找到對應要執行的SQL語句 -->
<mapper namespace="cm.mbs.dao.BlogMapper">

    <!--模糊查詢的時候三種寫法任選其一就能夠了-->
    <select id="selectByTitle" resultType="Blog">
        select * from blog where 1=1
        <if test="title != null and title.trim() != ''">
            and title like concat('%',#{title},'%')
        </if>
        <!--<if test="title != null and title.trim() != ''">
            and title like '%${title}%'
        </if>-->
        <!--<if test="title != null and title.trim() != ''">
            and title like "%"#{title}"%"
        </if>-->
    </select>


</mapper>

choose, when, otherwise

有時咱們不想應用到全部的條件語句,而只想從中擇其一項。針對這種狀況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。app

 

List<Blog> selectByExample(Blog blog);
<select id="selectByExample" resultType="Blog">
        select * from blog where 1=1
        <choose>
            <when test="title != null and title.trim() != ''">
                and title like concat('%',#{title},'%')
            </when>
            <when test="state != null and state.trim() != ''">
                and state like concat('%',#{state},"%")
            </when>
            <otherwise>
                and featured = 1
            </otherwise>
        </choose>
</select>

trim, where, set

where這個標籤會自動的爲你去出第一個條件前面的and|or 這樣就不會出錯了。例如:ide

<select id="selectWhere" resultType="Blog">
        select * from blog
        <where>
            <if test="title != null and title.trim() != ''">
                and title like concat('%',#{title},'%')
            </if>
            <if test="state != null and state.trim() != ''">
                and state like concat('%',#{state},"%")
            </if>
        </where>
    </select>

 

where 元素只會在至少有一個子元素的條件返回 SQL 子句的狀況下才去插入「WHERE」子句。並且,若語句的開頭爲「AND」或「OR」,where 元素也會將它們去除。spa

若是 where 元素沒有按正常套路出牌,咱們能夠經過自定義 trim 元素來定製 where 元素的功能。好比,和 where 元素等價的自定義 trim 元素爲:code

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

set標籤會自動的爲咱們忽略掉最後一個逗號例如:xml

Integer updateBlog(Blog blog);
<update id="updateBlog" parameterType="Blog" >
        update blog
        <set>
            <if test="title != null">title = #{title},</if>
            <if test="state != null">state = #{state},</if>
        </set>
        where id = #{id}
    </update>

這裏會只能的爲你忽略掉最後的一個逗號防止出錯blog

foreach

動態 SQL 的另一個經常使用的操做需求是對一個集合進行遍歷,一般是在構建 IN 條件語句的時候。好比:接口

List<Blog> selectInAuthorId(String[] arr);
<select id="selectInAuthorId" resultType="Blog">
        select * from blog where authorId in
        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>

注意 collection這個屬性最容易出錯了,通常這個屬性表示的是你傳過來的容器是什麼,若是是數組,那麼你就能夠寫成 array 是list 就能夠寫成 list 是 map 就能夠寫成 map 有的時候你會看到同行寫的代碼是直接引用註解中的參數名字 ,這樣mybatis會忽略類型,按名字引入。這個時候要使用@param:it

public User queryUserByParams(@Param("id") Integer id, @Param("userName") String userName);

相關文章
相關標籤/搜索