1. 程式人生 > >MyBatis超詳細介紹——Mapper XML檔案

MyBatis超詳細介紹——Mapper XML檔案

MyBatis Mapper XML檔案

(本文作為學習筆記,瞭解更多請參考:MyBatis參考文件
頂級元素介紹(按照應該被定義的順序)
  • cache – 給定名稱空間的快取配置。
  • cache-ref – 其他名稱空間快取配置的引用。
  • resultMap – 是最複雜也是最強大的元素,用來描述如何從資料庫結果集中來載入物件。
  • sql – 可被其他語句引用的可重用語句塊。
  • insert – 對映插入語句
  • update – 對映更新語句
  • delete – 對映刪除語句
  • select – 對映查詢語句
select
<select id="selectPerson" parameterType="int"
resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select>

等價於

// Similar JDBC code, NOT MyBatis…
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
  • select屬性配置
<select
  id="selectPerson"
parameterType="int" resultType="hashmap" resultMap="personResultMap" flushCache="false" useCache="true" timeout="10000" fetchSize="256" statementType="PREPARED" resultSetType="FORWARD_ONLY">
insert,update和delete
  • 屬性設定
<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="" timeout="20"> <update id="updateAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20"> <delete id="deleteAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">
  • 示例程式碼
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

<update id="updateAuthor">
  update Author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
  where id = #{id}
</update>

<delete id="deleteAuthor">
  delete from Author where id = #{id}
</delete>
sql
  • sql可用來定義可重用的SQL程式碼段,可以包含在其他語句中,如:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

被包含在其他語句中::

<select id="selectUsers" resultType="map">
  select
    <include refid="userColumns"><property name="alias" value="t1"/></include>,
    <include refid="userColumns"><property name="alias" value="t2"/></include>
  from some_table t1
    cross join some_table t2
</select>
引數(Parameters)
  • 簡單資料型別
<select id="selectUsers" resultType="User">
  select id, username, password
  from users
  where id = #{id}
</select>
  • 傳入物件作為引數
<insert id="insertUser" parameterType="User">
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>
字串替換

使用 #{} 會導致MyBatis建立PreparedStatement,當希望在SQL語句中插入一個不轉義的字串時,可這樣使用:

ORDER BY ${columnName}

這裡MyBatis不會修改或轉義字串

Result Maps
  • 當程式中使用JavaBean或POJO作為模型,MyBatis支援二者的對映操作
<select id="selectUsers" resultType="com.someapp.model.User">
  select id, username, hashedPassword
  from some_table
  where id = #{id}
</select>
  • Tip
    可以使用類型別名
<!-- In mybatis-config.xml file -->
<typeAlias type="com.someapp.model.User" alias="User"/>

<!-- In SQL Mapping XML file -->
<select id="selectUsers" resultType="User">
  select id, username, hashedPassword
  from some_table
  where id = #{id}
</select>
  • 示例程式碼(解決列名不匹配的問題)
<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>

直接引用即可:

<select id="selectUsers" resultMap="userResultMap">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{id}
</select>
快取
  • 預設情況下並沒有開啟快取,當需要開啟二級快取時,需要在SQL對映檔案中新增:
<cache/>
  • 對映語句檔案中的所有 select 語句將會被快取。
  • 對映語句檔案中的所有 insert,update 和 delete 語句會重新整理快取。
  • 快取會使用 Least Recently Used(LRU,最近最少使用的)演算法來收回。
  • 根據時間表(比如 no Flush Interval,沒有重新整理間隔), 快取不會以任何時間順序 來重新整理。
  • 快取會儲存列表集合或物件(無論查詢方法返回什麼)的 1024 個引用。
  • 快取會被視為是 read/write(可讀/可寫)的快取,意味著物件檢索不是共享的,而 且可以安全地被呼叫者修改,而不干擾其他呼叫者或執行緒所做的潛在修改。