MyBatis 真正的力量是在映射語句中,SQL 映射文件有以下幾個頂級元素.
- cache - 配置給定命名空間的緩存
- cache-ref – 從其他命名空間引用緩存配置
- resultMap – 用來描述如何從數據庫結果集中來加載你的對象
- sql – 可以重用的 SQL 塊,也可以被其他語句引用
- insert – 映射插入語句
- update – 映射更新語句
- delete – 映射刪除語句
- select – 映射查詢語句
<br/>
select
查詢語句是使用 MyBatis 時最常用的元素之一,對於每次插入,更新或刪除,那也會有很多的查詢。這是 MyBatis 的一個基本原則,也是將重心和努力放到查詢和結果映射的原因。對簡單類別的查詢元素是非常簡單的。
比如:
<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
SELECT * FROM PERSON WHERE ID = #{id}
</select>
這個語句被稱作 selectPerson,使用一個 int(或 Integer)類型的參數,並返回一個 HashMap類型的對象,其中的鍵是列名,值是列對應的值。
<br/>
這就告訴 MyBatis 創建一個 PreparedStatement(預處理語句)參數。使用JDBC,這樣的一個參數在 SQL 中會由一個“?”來標識,並被傳遞到一個新的預處理語句中,就像這樣:
// 相似的JDBC代碼,不是MyBatis的
String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
當然,這需要很多單獨的 JDBC 的代碼來提取結果並將它們映射到對象實例中,這就是MyBatis 節省你時間的地方。我們需要深入瞭解參數和結果映射.
select 元素有很多屬性允許你配置,來決定每條語句的作用細節。
<select
id=”selectPerson”
parameterType=”int”
resultType=”hashmap”
resultMap=”personResultMap”
flushCache=”false”
useCache=”true”
timeout=”10000”
fetchSize=”256”
statementType=”PREPARED”
resultSetType=”FORWARD_ONLY”
>
如下內容爲各個參數的介紹:
- id [在命名空間中唯一的標識符,可以被用來引用SQL語句]
- parameterType [傳入SQL語句的參數類的類型]
- resultTyp [SQL語句中返回的期望類型的類的類型或者別名。對於集合來說,那應該是集合可以包含的類型,而不能是集合本身]
- resultMap [命名引用外部的 resultMap]
<!--設置domain類和數據庫中表的字段一一對應,注意數據庫字段和domain類中的字段名稱不致,此處一定要!-->
<resultMap id="BaseResultMap" type="User">
<id column="USER_ID" property="userId" jdbcType="INTEGER" />
<result column="USER_NAME" property="userName" jdbcType="CHAR" />
<result column="USER_PASSWORD" property="userPassword" jdbcType="CHAR" />
<result column="USER_EMAIL" property="userEmail" jdbcType="CHAR" />
</resultMap>
<!-- 查詢單條記錄 -->
<select id="selectUserById" parameterType="int" resultMap="BaseResultMap">
SELECT * FROM t_user WHERE USER_ID = #{userId}
</select>
- flushCache [將其設置爲 true,無論語句什麼時候被調用,都會導致緩存被清
空。默認值:false] - useCache [將其設置爲 true,將會導致本條語句的結果被緩存。默認值:true]
- timeout [驅動程序等待數據庫返回請求結果,並拋出異常時間的
最大等待值] - fetchSize [驅動程序每次批量返回的結果行數]
- statementType [STATEMENT,PREPARED 或 CALLABLE 的一種,這會讓 MyBatis使用選擇使用 Statement,PreparedStatement 或 CallableStatement,
默認值:PREPARED] - resultSetType [FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE
中的一種。默認是不設置(驅動自行處理)]
insert
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
useGeneratedKeys=""
timeout="20000">
對於插入操作,假如數據庫表結構中支持自動生成主鍵的字段,那麼你可以設置 useGeneratedKeys=”true”,而且設置 keyProperty 到你已經做好的目標屬性上.
例如:
<insert id="insertAuthor" parameterType="domain.blog.Author"
useGeneratedKeys=”true” keyProperty=”id”>
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
update
<update
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">
例如:
<update id="updateAuthor" parameterType="domain.blog.Author">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
delete
<delete
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">
例如:
<delete id="deleteAuthor” parameterType="int">
delete from Author where id = #{id}
</delete>