1. 程式人生 > 實用技巧 >Mybatis入門之mapper對映(案例Demo)

Mybatis入門之mapper對映(案例Demo)

動態sql相關

mybatis支援強大的動態生成sql功能,提供了一些標籤實現動態sql拼接, 更加靈活。

mapper.xml的常用標籤(參考:https://www.cnblogs.com/coder-lzh/p/8960928.html):

標籤 描述
<mapper>
根標籤,表示mapper需要對映的配置
<resultMap>
指定返回集合的屬性,適合使用返回值是自定義實體類的情況
<constructor>
<resultMap>中的子標籤,表示建構函式式宣告

<idArg>

<constructor>的子標籤,表示實體主鍵
<sql> 可以重用的 SQL 塊,也可以被其他語句引用,與<include>標籤結合使用,id必須唯一
<include> 表示引用一個<sql>語句體,refid屬性指定<sql>標籤的id
<insert>、<select>、<update>、<delete> 分別對應C(create)R(read)U(update)D(delete)

1.if標籤的使用,此種方式需要使用註解傳參(不使用註解的話test表示式裡面引數應該用value表示)

   //1.動態sql之if
   Book queryOneByBookId(@Param("bookId")Integer bookId);
   <if test="null!=bookId and ''!=bookId">
      and id = #{bookId}
    </if>

2.trim標籤的使用,包含去除前後綴的操作,可以與if結合使用

<insert id="insertSelective" parameterType="com.star.model.Book" >
    insert into t_book_vue
    
<!-- prefix:代表字首( suffix:代表字尾) suffixOverrides:去除末尾的字尾, prefixOverrides:去除開頭的字首 --> <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null" > id, </if> <if test="bookname != null" > bookname, </if> <if test="price != null" > price, </if> <if test="booktype != null" > booktype, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="id != null" > #{id,jdbcType=INTEGER}, </if> <if test="bookname != null" > #{bookname,jdbcType=VARCHAR}, </if> <if test="price != null" > #{price,jdbcType=REAL}, </if> <if test="booktype != null" > #{booktype,jdbcType=VARCHAR}, </if> </trim> </insert>

3.foreach標籤的使用,可以迴圈遍歷標籤體的內容

  <!-- foreach用法 -->
  <select id="queryBookByForeach" resultType="com.star.model.Book">
    <include refid="base_query_list"/>
    and id in
    <!--
      conllection:代表要迴圈的引數
      item: 每一項的別名自定義
      open:開頭字首
      close: 結尾字尾
      separator:每項之間插入字元
    -->
    <foreach collection="list" item="id" open="(" close=")" separator=",">
      #{id}
    </foreach>
    <include refid="base_order"/>
  </select>

4.choose(when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似

  <!--
    id:唯一
    parameterType:引數型別
    resultType:返回型別
   -->
  <select id="dynamicChooseTest" parameterType="com.star.model.Book" resultMap="BaseResultMap">
    <include refid="base_query_list"/>
    <!-- 滿足表示式拼接標籤體sql語句 -->
    <choose>
      <when test="bookname != null">
        and bookname like concat('%',#{bookname},'%')
      </when>
      <when test="booktype != null">
        and booktype = #{booktype}
      </when>
      <otherwise>
        and 2 = 2
      </otherwise>
    </choose>
    <include refid="base_order"/>
  </select>

5.where(主要是用來簡化sql語句中where條件判斷的,能智慧的處理 and or 條件)

  <!--
    id唯一
    where標籤跟在表名的後面,與if標籤結合使用
  -->
  <select id="dynamicWhereTest" parameterType="com.star.model.Book" resultMap="BaseResultMap">
    select * from t_book_vue
    <where>
      <if test="bookname != null">
        bookname = #{bookname}
      </if>
      <if test="booktype != null">
        and booktype = #{booktype}
      </if>
    </where>
  </select>

6.set主要是用在更新操作的時候,它的主要功能和where元素其實是差不多的,主要是在包含的語句前輸出一個set,然後如果包含的語句是以逗號結束的話將會把該逗號忽略,如果set包含的內容為空的話則會出錯。有了set元素我們就可以動態的更新那些修改了的欄位

  <!--
    set標籤與where標籤大同小異
  -->
  <update id="dynamicSetTest" parameterType="com.star.model.Book">
    update t_book_vue
    <set>
      <if test="bookname != null">
        bookname = #{bookname},
      </if>
      <if test="booktype != null">
        booktype = #{booktype},
      </if>
    </set>
    where id = #{id}
  </update>