MyBatis-Mapper.xml(輸入輸出映射動態sql)講解

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、定義resultMap

    2、使用resultMap作為statement的輸出映射類型

    例子:

    將下邊的sql使用User完成映射
    SELECT id id_, username username_ FROMuserwhere 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片段

  • 測試


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容