MyBatis -- sql映射文件詳解

MyBatis 真正的力量是在映射語句中。和對等功能的jdbc來比價,映射文件節省很多的代碼量。MyBatis的構建就是聚焦於sql的。

sql映射文件有如下幾個頂級元素:(按順序)

cache配置給定命名空間的緩存。

cache-ref從其他命名空間引用緩存配置。

resultMap最複雜,也是最有力量的元素,用來描述如何從數據庫結果集中來加載你的對象。

parameterMap已經被廢棄了!老式風格的參數映射。內聯參數是首選,這個元素可能在將來被移除。

sql可以重用的SQL塊,也可以被其他語句引用。

insert映射插入語句。

update映射更新語句。

delete映射刪除語句。

select映射查詢語句。

下面就詳細描述一些元素:

1、select

查詢語句是使用 MyBatis 時最常用的元素之一。

<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
SELECT * FROM PERSON WHERE ID = #{id}
</select>
使用一個int(或Integer)類型的參數,並返回一個HashMap類型的對象,其中的鍵是列名,值是列對應的值。

注意參數註釋:

#{id}

select 元素有很多屬性允許你配置,來決定每條語句的作用細節。

<select
id=”selectPerson” 在命名空間中唯一的標識符,可以被用來引用這條語句。

parameterType=”int” 將會傳入這條語句的參數類的完全限定名或別名。

parameterMap=”deprecated” (已廢棄)

resultType=”hashmap” 從這條語句中返回的期望類型的類的完全限定名或別名。注意集合情形,那應該是集合可以包含的類型,而不能是集合本身。使用resultType或resultMap,但不能同時使用。

resultMap=”personResultMap” 命名引用外部的resultMap。返回map是MyBatis最具力量的特性,對其有一個很好的理解的話,許多複雜映射的情形就能被解決了。使用 resultMap 或 resultType,但不能同時使用。

flushCache=”false” 將其設置爲true,不論語句什麼時候被調用,都會導致緩存被清空。默認值: false。

useCache=”true” 將其設置爲 true,將會導致本條語句的結果被緩存。默認值: true。

timeout=”10000” 這個設置驅動程序等待數據庫返回請求結果,並拋出異常時間的最大等待值。默認不設置(驅動自行處理)。

fetchSize=”256” 這是暗示驅動程序每次批量返回的結果行數。默認不設置(驅動自行處理)。
statementType=”PREPARED” STATEMENT,PREPARED 或 CALLABLE 的一種。這會讓 MyBatis使用選擇使用 Statement, PreparedStatement 或 CallableStatement。默認值: PREPARED。

resultSetType=”FORWARD_ONLY” FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一種。默認是不設置(驅動自行處理)。
>
2、insert, update, delete
數據變更語句 insert, update 和 delete 在它們的實現中非常相似:

<insert
id="insertAuthor"  在命名空間中唯一的標識符,可以被用來引用這條語句。

parameterType="domain.blog.Author"  將會傳入這條語句的參數類的完全限定名或別名。

flushCache="true" 將其設置爲 true,不論語句什麼時候被調用,都會導致緩存被清
空。默認值: false。

statementType="PREPARED"  STATEMENT,PREPARED 或 CALLABLE 的一種。這會讓 MyBatis使用選擇使用 Statement, PreparedStatement 或CallableStatement。默認值: PREPARED。

keyProperty=""  (僅對 insert有用)標記一個屬性, MyBatis 會通過 getGeneratedKeys或者通過 insert 語句的 selectKey 子元素設置它的值。默認:不設置。

useGeneratedKeys=""  ( 僅 對 insert 有 用 ) 這 會 告 訴 MyBatis 使 用 JDBC 的getGeneratedKeys 方法來取出由數據(比如:像 MySQL 和 SQLServer 這樣的數據庫管理系統的自動遞增字段)內部生成的主鍵。默認值: false。

timeout="20000"  這個設置驅動程序等待數據庫返回請求結果,並拋出異常時間的最大等待值。默認不設置(驅動自行處理)。
>
下面就是insert, update 和 delete 語句的示例:

<insert id="insertAuthor" parameterType="domain.blog.Author">
       insert into Author (id,username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio})
</insert>

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

<delete id="deleteAuthor” parameterType="int">
     delete from Author where id = #{id}
</delete>
如前所述,插入語句有一點多,它有一些屬性和子元素用來處理主鍵的生成。首先,如果你的數據庫支持自動生成主鍵的字段(比如MySQL和SQLServer),那麼你可以設置 useGeneratedKeys=”true”,而且設置 keyProperty 到你已經做好的目標屬性上。例如,如果上面的 Author 表已經對 id 使用了自動生成的列類型,那麼語句可以修改爲:

<insert id="insertAuthor" parameterType="domain.blog.Author"
useGeneratedKeys=”true” keyProperty=”id”>
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
3、sql

這個元素可以被用來定義可重用的SQL代碼段,可以包含在其他語句中。

<select id=”selectUsers” parameterType=”int” resultType=”hashmap”>
select <include refid=”userColumns”/>
from some_table
where id = #{id}
</select>

後續將會詳細介紹緩存和resultMap

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章