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