1,輸出映射
1.1,resultType
輸出pojo或者list(上面都有見過了):
使用resultType進行輸出映射,只有查詢出來的數據列名和pojo中的屬性名一致,該列才可以映射成功。
如果查詢出來的列名和pojo中的屬性名全部不一致,沒有創建pojo對象。
只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象。
比如:本該返回一個pojo對象的list的,但是pojo屬性和數據庫返回數據的字段不匹配,那么list長度會是實際返回個數,但是列表的元素都是null.
輸出簡單類型:
Mapper.xml文件
<!-- 獲取用戶列表總數 -->
<select id="findUserCount" parameterType="user" resultType="int"> select count(1) from user </select>
Mapper接口
public int findUserCount(User user) throws Exception;
調用:
Public void testFindUserCount() throws Exception{ //獲取session SqlSession session = sqlSessionFactory.openSession(); //獲取mapper接口實例 UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setUsername("管理員"); //傳遞Hashmap對象查詢用戶列表 int count = userMapper.findUserCount(user); //關閉session session.close(); }
查詢出來的結果集只有一行且一列,可以使用簡單類型進行輸出映射。
輸出hashmap
輸出pojo對象可以改用hashmap輸出類型,將輸出的字段名稱作為map的key,value為字段值。
1.2,resultMap使用方法
resultType可以指定pojo將查詢結果映射為pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應關系 ,resultMap實質上還需要將查詢結果映射到pojo對象中。
resultMap可以實現將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。
即:可以將數據放入任何想要的一個對象中(對象屬性和數據列不需要一致)。
如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系:
1、定義resultMap
2、使用resultMap作為statement的輸出映射類型
定義reusltMap
<id />:此屬性表示查詢結果集的唯一標識,非常重要。如果是多個字段為復合唯一約束則定義多個<id />。
Property:表示person類的屬性。
Column:表示sql查詢出來的字段名。
Column和property放在一塊兒表示將sql查詢出來的字段映射到指定的pojo類屬性上。
<result />:普通結果,即pojo的屬性。
使用resultMap作為statement的輸出映射類型
mapper.java
測試
小結
使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列才可以映射成功。
如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。
2, 動態sql
mybatis核心 對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。
(ps:即傳入數據的正確驗證在sql中進行)
需求:
用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。
對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。
mapper.xml
測試代碼
3,sql片段
需求:
將上邊實現的動態sql判斷代碼塊抽取出來,組成一個sql片段。其它的statement中就可以引用sql片段。方便程序員進行開發。
定義sql片段
引用sql片段
在mapper.xml中定義的statement中引用sql片段:
4,foreach
向sql傳遞數組或List,mybatis使用foreach解析
需求:
在用戶查詢列表和查詢總數的statement中增加多個id輸入查詢。sql語句如下:
兩種方法:
1,SELECT * FROM USER WHERE id=1 OR id=10 OR id=16 2,SELECT * FROM USER WHERE id IN(1,10,16)
在輸入參數類型中添加List<Integer> ids傳入多個id
修改mapper.xml
WHERE id=1 OR id=10 OR id=16
在查詢條件中,查詢條件定義成一個sql片段,需要修改sql片段。
(ps:其中item的值可以隨便取,但是需要和占位符中字段一致。)
測試:
另外一個sql的實現:
總結:
mybatis是什么?
mybatis是一人持久層框架,mybatis是一個不完全的ORM框架。sql語句需要程序員自己去編寫,但是mybatis也有映射(輸入參數映射、輸出結果映射)。
mybatis入門門檻不高,學習成本低,讓程序員把精力放在sql語句上,對sql語句優化非常方便,適用與需求變化較多項目,比如互聯網項目。
mybatis框架執行過程:
1、配置mybatis的配置文件,SqlMapConfig.xml(名稱不固定)
2、通過配置文件,加載mybatis運行環境,創建SqlSessionFactory會話工廠 SqlSessionFactory在實際使用時按單例方式。 3、通過SqlSessionFactory創建SqlSession SqlSession是一個面向用戶接口(提供操作數據庫方法),實現對象是線程不安全的,建議sqlSession應用場合在方法體內。 4、調用sqlSession的方法去操作數據。 如果需要提交事務,需要執行SqlSession的commit()方法。 5、釋放資源,關閉SqlSession
mybatis開發dao的方法:
1、原始dao 的方法
需要程序員編寫dao接口和實現類
需要在dao實現類中注入一個SqlSessionFactory工廠。
2、mapper代理開發方法(建議使用) 只需要程序員編寫mapper接口(就是dao接口) 程序員在編寫mapper.xml(映射文件)和mapper.java需要遵循一個開發規范: 1、mapper.xml中namespace就是mapper.java的類全路徑。 2、mapper.xml中statement的id和mapper.java中方法名一致。 3、mapper.xml中statement的parameterType指定輸入參數的類型和mapper.java的方法輸入 參數類型一致。 4、mapper.xml中statement的resultType指定輸出結果的類型和mapper.java的方法返回值類型一致。
SqlMapConfig.xml配置文件:可以配置properties屬性、別名、mapper加載。。。
輸入映射:
parameterType:指定輸入參數類型可以簡單類型、pojo、hashmap。。
對於綜合查詢,建議parameterType使用包裝的pojo,有利於系統 擴展。
輸出映射:
resultType:
查詢到的列名和resultType指定的pojo的屬性名一致,才能映射成功。
reusltMap:
可以通過resultMap 完成一些高級映射。
如果查詢到的列名和映射的pojo的屬性名不一致時,通過resultMap設置列名和屬性名之間的對應關系(映射關系)。可以完成映射。
高級映射:
將關聯查詢的列映射到一個pojo屬性中。(一對一)
將關聯查詢的列映射到一個List<pojo>中。(一對多)
動態sql:(重點)
if判斷(掌握)
where
foreach
sql片段(掌握)