詳解mybatis對映配置檔案
一 mybatis 對映檔案結構
mybatis對映配置檔案存在如下頂級元素,且這些元素按照如下順序被定義。
- cache – 給定名稱空間的快取配置。
- cache-ref – 其他名稱空間快取配置的引用。
- resultMap – 是最複雜也是最強大的元素,用來描述如何從資料庫結果集中來載入物件。
-
parameterMap– 已廢棄!老式風格的引數對映。內聯引數是首選,這個元素可能在將來被移除,這裡不會記錄。 - sql – 可被其他語句引用的可重用語句塊。
- insert – 對映插入語句
- update – 對映更新語句
- delete – 對映刪除語句
- select – 對映查詢語句
二 mybatis對映配置檔案頂級元素分析
(一)CRUD
在對映配置檔案中,基本的CRUD操作定義如下
<!--select by id--> <select id="getUserInfoById" resultType="UserInfo"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select> <!--insert--> <insert id="addUserInfo" useGeneratedKeys="true"> INSERT INTO user_info(user_name,user_addr)VALUES(#{user_name},#{user_addr}) </insert> <!--update--> <update id="updateUserInfo"> UPDATE user_info set user_name=#{user_name} WHERE user_id=#{user_id} </update> <!--delete--> <delete id="delUserInfoById"> DELETE FROM user_info WHERE user_id=#{user_id} </delete>
1.#{}表示佔位符,相當於?,#{}需要經過預處理,能防止SQL漏洞注入,當然,也可以使用${},只是不能防止漏洞注入。
2.select語句有很多屬性
id -- 唯一標識select語句
parameterType --引數型別
paramerterMap -- 引數對映
resultType -- 返回型別
resultMap -- 返回型別對映
flushCache -- 當語句被呼叫時,是否清除本地快取或二級快取
useCache -- 是否使用二級快取
timeout -- 在丟擲異常之前,驅動程式等待資料庫返回請求結果的秒數
fetchSize -- 每次批量返回的結果行數
statementType -- 使用STATEMENT,PREPARED 或 CALLABLE 的一個
resultSetType -- 使用FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個
<select id="selectPerson" parameterType="int" parameterMap="deprecated" resultType="hashmap" resultMap="personResultMap" flushCache="false" useCache="true" timeout="10000" fetchSize="256" statementType="PREPARED" resultSetType="FORWARD_ONLY">
(二)resultType
resultType可表示返回基本型別,也可表示返回複雜物件型別(包括自定義型別)
1.返回基本型別
<select id="listUserInfo" resultType="int"> SELECT userId FROM user_info </select>
2.返回複雜型別
<select id="getUserInfoById" resultType="UserInfo"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select>
(三)resultMap
resultMap主要解決TABLE欄位與JavaBean對映不匹配問題。
舉個例子:
定義一個JavaBean
public class UserInfo { String userName; String addr; //setter和getter }
SQL語句:
DROP TABLE IF EXISTS `user_info`; CREATE TABLE `user_info`( `user_id` int(5) NOT NULL AUTO_INCREMENT, `user_name` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, `user_addr` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, PRIMARY KEY (`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1;
通過如上發現,user_name與userName不匹配,user_addr與addr不匹配。
通過resultMap就能很好地解決該問題
<resultMap id="userInfoMap" type="UserInfo"> <result property="userName" column="user_name"/> <result property="addr" column="user_addr"/> </resultMap>
property表示JavaBean,column表示table欄位
(四)SQL
sql語句,定義可重用語句。
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.addr </sql>
引定義好的sql
<select id="listUserInfo" resultMap="userInfoMap"> SELECT <include refid="userColumns"> <property name="alias" value="t1"/> </include> FROM user_info t1 </select>
(五)cache &cache-ref
cache和cache-ref比較重要,放在下篇文章講解。
三 Mybatis系列文章
四 參考文獻
【01】http://www.mybatis.org/mybatis-3/zh/configuration.html#
五 版權區
- 轉載部落格,必須註明部落格出處
- 博主網址:http://www.cnblogs.com/wangjiming/
- 如您有新想法,歡迎提出,郵箱:[email protected]