Mapper.xml映射文件
Mapper.xml映射文件定義了操作數據庫的sql,每個sql是一個statement,映射文件是mybatis的核心。
輸入映射
通過parameterType 指定輸入參數類型,類型可以是簡單類型、hashMap、pojo包裝類型。
- 簡單類型,上面有
- hashMap :
<!-- 傳遞hashmap綜合查詢用戶信息 -->
<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
上面大括號中的 id 和 username 就是hashmap的key
-
pojo包裝對象:
開發中通過pojo傳遞查詢條件,查詢條件是綜合的查詢條件,這時可以使用包裝對象傳遞輸入參數
需求: 完成用戶信息的綜合查詢,需要傳入復雜查詢條件(可能會包括用戶信息,其他信息,比如商品的,訂單的)。
定義包裝類型pojo:
根據需求,建議使用自定義的包裝類型的pojo。在包裝類型的pojo中將復雜的查詢條件包裝進去。
- 映射文件 mapper.xml
在UserMapper.xml中定義用戶信息綜合查詢(查詢條件復雜,通過高級查詢進行復雜關聯查詢)
- mapper.java
- 測試
輸出映射
-
resultType
(輸出簡單類型、輸出pojo對象、輸出pojo列表、輸出hashmap列表)
使用resultType 進行輸出映射,只有查詢出來的列名和pojo的屬性名一致,該列才可以映射成功。
如果查詢出來的列名和pojo的屬性名全部不一致,則不會創建pojo對象。
如果查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象。總結:
1、查詢出的結果集如果只有一行且一列,可以使用簡單類型進行輸出映射
2、輸出pojo對象和pojo列表:在mapper.xml中指定的類型是一樣的,在mapper.java中指定的方法的返回值類型不同。
3、輸出hashmap:輸出pojo對象可以改用 hashmap 輸出類型 ,將輸出的字段名稱作為map的Key,value為字段值。
-
resultMap
如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和屬性名之間做一個映射關系。
1、定義resultMap2、使用resultMap作為statement的輸出映射類型
例子:
將下邊的sql使用User完成映射
SELECT id id_, username username_ FROM
userwhere id=#{id};
user類中屬性名和上邊查詢列名不一致1、定義resultMap
2、使用resultMap作為statement的輸出映射類型
3、mapper.java
4、測試
5、總結:
1、resultType可以指定POJO將查詢結果映射為POJO,但需要POJO的屬性名和sql查詢的列名一致方可映射成功。
2、如果sql查詢字段名和POJO的屬性名不一致,可通過resultmap將字段名和屬性名作一個對應關系,resultmap實質上還需要將查詢結果映射到POJO對象中。
3、resultmap 可以將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢,完成高級輸出結果映射。
動態sql
什么是動態sql
mybatis的核心就是對sql語句進行靈活操作:可以通過表達式進行判斷,對sql進行靈活拼接、組裝。
需求
用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。
對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。
mapper.xml
測試代碼
sql片段
- 需求
將上面實現的動態sql判斷代碼塊抽取出來,組成一個sql片段。其他的statement中就可以直接引用sql片段。方便開發。
- 引用sql片段
在mapper.xml中定義的 statement 中引用 sql 片段
- 測試
foreach
向sql傳遞數組或List,mybatis 使用 foreach 解析,如下:
- 需求
在用戶查詢列表和查詢總數的 statement 中增加多個id輸入查詢。
sql語句如下:
SELECT * FROM user
WHERE id=2 OR id=3 OR id=7
或
SELECT * FROM user
WHERE id IN(2,3,7)
- 在輸入參數類型中添加 List<Integer>ids 用來傳入多個id
- 修改mapper.xml
WHERE (id=2 OR id=3 OR id=7)
在查詢條件中,查詢條件定義成一個sql片段,需要修改sql片段
-
測試