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>