學習java的基本都會「ssh」,我也不例外,其中就包括了hibernate,當時感受挺神奇的,去年開始接觸mybatis,一對比發現,這mybatis有很多優勢。java
下面分享一下我在學習mybatis的時候整理的內容。sql
基本配置的xml
映射關係的xml
映射的接口
獲取`session`的工具類
實體類編程
這裏須要注意的是:session
當實體類中的屬性名和表中的字段名不一致時,使用MyBatis進行查詢操做時沒法查詢出相應的結果的問題以及針對問題採用的兩種辦法:mybatis
1. 經過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就能夠表的字段名和實體類的屬性名一一對應上了,
這種方式是經過在sql語句中定義別名來解決字段名和屬性名的映射關係的。app
2. 經過`<resultMap>`來映射字段名和實體類屬性名的一一對應關係。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關係的。ssh
首先須要新建SQL類的實例,而後調用構造sql的方法ide
該類的每個方法均返回當前對象的引用,故使得鏈式編程成爲可能,按照sql語句的順序依次調用對應的方法便可函數
在構造中,函數會接收到一個`Map<String, Object>`的對象列表,裏面鍵就是對應接口方法的參數的註解名稱,在向對應的`SQL`的方法傳參數的時候要使用對應的佔位符,例如對於鍵`id`,須要使用佔位符`#{id}`,甚至能夠加上數據的類型`#{id,javaType=string,jdbcType=VARCHAR}`工具
處理一對一的關聯映射,能夠按照兩種處理思路:
- 一次查詢出須要的數據,在做映射的時候進行嵌套
- 分兩次進行查詢,根據第一次查詢出來的結果進行第二次查詢
兩種處理方式都須要使用到`association`標籤,分別的用法爲(分別對應兩種處理方式):
<association property="teacher" javaType="Teacher"> <id property="id" column="t_id" /> <result property="name" column="t_name" /> </association>
<association property="teacher" column="teacher_id" select="getTeacher" /> <!-- 須要藉助另外的一個查詢映射配置 -->
`association`標籤可用的屬性以下:
- property:對象屬性的名稱
- javaType:對象屬性的類型
- column:所對應的外鍵字段名稱
- select:使用另外一個查詢封裝的結果
處理一對多關聯和處理一對一關聯相似,使用collection標籤來解決一對多的關聯查詢,ofType屬性指定集合中元素的對象類型。
在xml中仍是普通的標籤,可是多了屬性`statementType="CALLABLE"`,
而且配置單獨的parameterMap屬性和節點進行參數的配置,使用mode="IN"配置參數的類型
<!-- 查詢獲得男性或女性的數量, 若是傳入的是0就女性不然是男性 --> <select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE"> CALL ges_user_count(?,?) </select> <!-- parameterMap.put("sexid", 0); parameterMap.put("usercount", -1); --> <parameterMap type="java.util.Map" id="getUserCountMap"> <parameter property="sexid" mode="IN" jdbcType="INTEGER" /> <parameter property="usercount" mode="OUT" jdbcType="INTEGER" /> </parameterMap>
在調用的時候和普通的調用沒什麼較大的區別,只是返回的值是經過從傳入的map中獲取的,而不是方法的返回值
String statement = "mapper.userMapper.getUserCount";// 映射sql的標識字符串 Map<String, Integer> parameterMap = new HashMap<String, Integer>(); parameterMap.put("sexid", 0); parameterMap.put("usercount", -1); sqlSession.selectOne(statement, parameterMap); Integer result = parameterMap.get("usercount"); System.out.println(result);
對應查詢方法的返回值是null
可能會以爲奇怪,怎麼感受文章裏面的內容了亂七八糟的?這裏面的內容是我當時學習的時候記下來的,如今只是粘在了一塊兒而已,下一篇將慢慢敘述知識點了