1. 程式人生 > >MyBatis中對映器Mapper概述

MyBatis中對映器Mapper概述

MyBatis真正強大之處在於它的對映器。因為它異常強大並且編寫相對簡單,不僅比傳統編寫SQL語句做的更好並且能節省將近95%的程式碼量

XML中頂級元素彙總

  1. cache: 給定名稱空間的快取配置
  2. cache-ref: 其他給定名稱空間快取配置的引用
  3. resultMap: 最複雜也是最強大的元素,用來描述如何從資料庫結果集中載入物件
  4. sql: 可以被其他語句引用的重複語句塊
  5. insert: 對映插入語句
  6. update: 對映更新語句
  7. delete: 對映刪除語句
  8. select: 對映查詢語句

select

查詢語句是MyBatis中使用最多的元素之一。一個簡單的查詢元素是非常簡單的,看如下示例:

<select id="selectPerson" parameterType="int" resultType="hashmap">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>

這個語句的ID為selectPerson ,並且接受一個int型別的引數,返回一個HashMap型別的物件。其中鍵名為列名,值為結果行中的對應值。

當然,select元素中有很多屬性可以允許我們配置,用以決定每條語句的作用細節:

具體的相關其他屬性可以查閱官網:

Mapper XML 檔案

insert,update和delete

資料變更語句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">

具體的相關其他屬性可以查閱官網:
Mapper XML 檔案

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

一般來說,元素的parameterType會被設定為int或者String之類的原生類或者簡單的資料結構。但是當傳入一個複雜的物件時,行為就會變得有些不同。比如:

<insert id="insertUser" parameterType="User">
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>

如果User型別的引數物件被傳入到語句中,id、username、password屬性就會被查詢並且傳入預處理語句的引數中。

resultMap

resultMap元素是MyBatis中最重要最強大的元素,它可以讓我們從90%的JDBCResultSets資料提取程式碼中解放出來,並在一些條件下允許我們做一些JDBC所不支援的事情。

ResultMap的設計思想是:簡單的語句不需要明確的結果對映,而複雜一點的語句只需要描述他們的關係就行了。

一個簡單的對映語句如下,它沒有明確resultMap,知識簡單的將所有的列對映到HashMap的鍵上,這由resultType指定:

<select id="selectUsers" resultType="map">
  select id, username, hashedPassword
  from some_table
  where id = #{id}
</select>

雖然如此在大部分情況下都夠用了,但是HashMap不是一個很好的模型,開發人員可能更加傾向於使用JavaBean或者POJO作為模型。MyBatis對兩者都支援。

我們假定現在已經擁有一個名叫User的JavaBean,它定義了id、username以及hashedPassword屬性。

這樣的一個JavaBean可以被對映到ResultSet,就像對映到HashMap中一樣簡單:

<select id="selectUsers" resultType="com.someapp.model.User">
  select id, username, hashedPassword
  from some_table
  where id = #{id}
</select>

如果列名和屬性名並不能完全吻合的話,我們也可以使用自行定義的外部ResultMap:

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

Java 填坑手冊。分享知識,共同進步。歡迎轉載、fork