mapper中通過resultMap自定義查詢結果映射


mybatis中使用resultType做自動映射時,要注意字段名和pojo的屬性名必須一致,若不一致,則需要給字段起別名,保證別名與屬性名一致。

使用resultMap做自定義結果映射,字段名可以不一致,並且可以指定要顯示的列,比較靈活,應用也廣泛。

<select id="getUserList" resultMap="userList" parameterType="User">
  select u.*, r.roleName from smbms_user u, smbms_role r 
  where u.userName like connect ('%', #{userName}, '%')
  and u.userRole=#{userRole} and u.userRole=r.id
</select>

<resultMap id="userList" type="User">
  <result property="id" column="id"/>
  <result property="userCode" column="userCode"/>
  <result property="userName" column="userName"/>
  <result property="phone" column="phone"/>
  <result property="birthday" column="birthday"/>
  <result property="gender" column="gender"/>
  <result property="userRole" column="userRole"/>
  <result property="userRoleName" column="roleName"/>
</resultMap>

 在上述代碼中,進行聯表查詢,可得到用戶對應角色的中文名稱

resultMap元素用來描述如何將結果集映射到java對象,此處使用resultMap對象展示所需的必要字段進行自由映射,特別是當數據庫的字段名和pojo中的屬性名一致的情況下。

result子節點用於標識一些簡單屬性,其中column屬性表示從數據庫中查詢的字段名,property則表示查詢出來的字段對應的值賦給實體對象的哪個屬性。

在mybatis進行查詢映射的時候,查詢出來的每個字段值都放在一個對應的Map里面,其中鍵是字段名,值則是其對應的值。當select元素提供的返回類型屬性是resultType的時候,mybatis會將Map里面的鍵值對取出賦值給resultType所指定的對象對應的屬性(即調用對應的對象的屬性的setter方法進行填充)。正因為如此,當使用resultType的時候,直接在后台就能接收到其對應的對象屬性值

由此看出,其實mybatis的每個查詢映射的返回類型都是restultMap,只是當我們提供的返回類型屬性是resultType的時候,mybatis會自動把對應的值賦給resultType所指定對象的屬性,而當我們提供的返回類型屬性是resultMap的時候,因為Map不能很好的表示領域模型,就需要通過進一步的定義把它轉化為對應的實體對象。

在mybatis的select元素中,resultType和resultMap的本質上是一樣的,都是Map數據結構。二者不能同時存在

resultMap自動映射級別

上述代碼中,查詢出了smbms_user表的所有屬性,雖然resultMap中映射關聯了部分屬性,但是沒有在resultMap中做映射關聯的屬性(字段名一致的屬性)在后台也能正常輸出。這跟resultMap的自動映射級別有關,默認的映射級別為PARTIAL。若想讓沒有在resultMap中做映射關聯的屬性不輸出,則需要設置mybatis對於resultMap的自動映射級別(autoMappingBehavior)為NONE,即禁止自動匹配。如下

<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE configuration PUBLIC
                "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <setting name="autoMappingBehavior" value="NONE"/>
    </settings>
</configuration>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM