18、結果集映射的簡單使用

簡單的ResultMap配置

對應的Author實體類,此實體類已經進行過別名註冊

package com.lf.entity;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString
@NoArgsConstructor
public class Author {
    private Integer id;

    private String username;

    private String password;

    private String email;

    private String bio;

    private String favouriteSection;   
}

結果集配置

  <resultMap id="BaseResultMap" type="com.lf.entity.Author">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="bio" jdbcType="VARCHAR" property="bio" />
    <result column="favourite_section" jdbcType="VARCHAR" property="favouriteSection" />
  </resultMap>

對應的sql片段

<select id="selectUsers" resultMap="userResultMap">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{id}
</select>

使用resultType類型

此處要求User類型。必須進行了別名註冊

<select id="selectUsers" resultType="User">
  select
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
  from some_table
  where id = #{id}
</select>

resultMap屬性詳解

  • constructor - 類在實例化時,用來注入結果到構造方法中
    • idArg - ID 參數;標記結果作爲 ID 可以幫助提高整體效能
    • arg - 注入到構造方法的一個普通結果
  • id – 一個 ID 結果;標記結果作爲 ID 可以幫助提高整體效能
  • result – 注入到字段或 JavaBean 屬性的普通結果
  • association – 一個複雜的類型關聯;許多結果將包成這種類型嵌入結果映射 – 結果映射自身的關聯,或者參考一個
  • collection – 複雜類型的集嵌入結果映射 – 結果映射自身的集,或者參考一個
  • discriminator – 使用結果值來決定使用哪個結果映射
    • case – 基於某些值的結果映射嵌入結果映射 – 這種情形結果也映射它本身,因此可以包含很多相 同的元素,或者它可以參照一個外部的結果映射。
屬性 描述
id 當前命名空間中的一個唯一標識,用於標識一個result map.
type 類的全限定名, 或者一個類型別名 (內置的別名可以參考上面的表格).
autoMapping 如果設置這個屬性,MyBatis將會爲這個ResultMap開啓或者關閉自動映射。這個屬性會覆蓋全局的屬性autoMappingBehavior。默認值爲:unset。

id & result

id 和 result 都映射一個單獨列的值到簡單數據類型(字符 串,整型,雙精度浮點數,日期等)的單獨屬性或字段

<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
屬性 描述
property 映射到列結果的字段或屬性。如果匹配的是存在的,和給定名稱相同 的 JavaBeans 的屬性,那麼就會使用。否則 MyBatis 將會尋找給定名稱 property 的字段。這兩種情形你可以使用通常點式的複雜屬性導航。比如,你 可以這樣映射一些東西: “username” ,或者映射到一些複雜的東西: “address.street.number” 。
column 從數據庫中得到的列名,或者是列名的重命名標籤。這也是通常和會 傳遞給 resultSet.getString(columnName)方法參數中相同的字符串。
javaType 一個 Java 類的完全限定名,或一個類型別名(參考上面內建類型別名 的列表) 。如果你映射到一個 JavaBean,MyBatis 通常可以斷定類型。 然而,如果你映射到的是 HashMap,那麼你應該明確地指定 javaType 來保證所需的行爲。
jdbcType 在這個表格之後的所支持的 JDBC 類型列表中的類型。JDBC 類型是僅 僅需要對插入,更新和刪除操作可能爲空的列進行處理。這是 JDBC jdbcType 的需要,而不是 MyBatis 的。如果你直接使用 JDBC 編程,你需要指定 這個類型-但僅僅對可能爲空的值。
typeHandler 我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默 認的類型處理器。這個屬性值是類的完全限定名或者是一個類型處理 器的實現,或者是類型別名。

*支持的 JDBC 類型*

BIT FLOAT   CHAR    TIMESTAMP   OTHER   UNDEFINED
TINYINT REAL    VARCHAR BINARY  BLOB    NVARCHAR
SMALLINT    DOUBLE  LONGVARCHAR VARBINARY   CLOB    NCHAR
INTEGER NUMERIC DATE    LONGVARBINARY   BOOLEAN NCLOB
BIGINT  DECIMAL TIME    NULL    CURSOR  ARRAY

使用構造函數

<resultMap id="constructorResultMap" type="com.lf.entity.Author">
        <constructor>
            <idArg name="id" column="id" jdbcType="INTEGER"  javaType="int"></idArg>
            <arg name="username"  jdbcType="VARCHAR" column="username" javaType="string"></arg>
            <arg name="password" column="password"  jdbcType="VARCHAR" javaType="string"></arg>
            <arg name="email" column="email"  jdbcType="VARCHAR" javaType="string"></arg>
            <arg name="bio" column="bio"  jdbcType="VARCHAR" javaType="string"></arg>
            <arg name="favouriteSection" column="favourite_section"  jdbcType="VARCHAR" javaType="string"></arg>
        </constructor>
    </resultMap>

此處的name屬性是從3.4.3纔開始的,如果要使用name屬性要有2的注意
1. 實體類有對應的構造方法
2. 如果採用Java 8編譯並且開啓了useActualParamName參數(默認是開啓的),還需要加上-parameters選項
如果不滿足上述3個條件,則需要在構造方法上使用param註解

  public Author(@Param("id") Integer id,@Param("name") String username,@Param("password") String password, @Param("email") String email, @Param("bio") String bio, @Param("favouriteSection")  String favouriteSection) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.bio = bio;
        this.favouriteSection = favouriteSection;
    }

對應的使用方法

 <select id="selectByPrimaryKey2" parameterType="java.lang.Integer" resultMap="constructorResultMap">
        select
        <include refid="Base_Column_List"/>
        from author
        where id = #{id,jdbcType=INTEGER}
    </select>
屬性 描述
column 來自數據庫的類名,或重命名的列標籤。這和通常傳遞給 resultSet.getString(columnName)方法的字符串是相同的
javaType 一個 Java 類的完全限定名,或一個類型別名(參考上面內建類型別名的列表)。 如果你映射到一個 JavaBean,MyBatis 通常可以斷定類型。然而,如 果你映射到的是 HashMap,那麼你應該明確地指定 javaType 來保證所需的 行爲。
jdbcType 在這個表格之前的所支持的 JDBC 類型列表中的類型。JDBC 類型是僅僅 需要對插入, 更新和刪除操作可能爲空的列進行處理。這是 JDBC 的需要, jdbcType 而不是 MyBatis 的。如果你直接使用 JDBC 編程,你需要指定這個類型-但 僅僅對可能爲空的值。
typeHandler 我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默認的 類型處理器。 這個屬性值是類的完全限定名或者是一個類型處理器的實現, 或者是類型別名。
select 用於加載複雜類型屬性的映射語句的ID,從column中檢索出來的數據,將作爲此select語句的參數。具體請參考Association標籤。
resultMap ResultMap的ID,可以將嵌套的結果集映射到一個合適的對象樹中,功能和select屬性相似,它可以實現將多表連接操作的結果映射成一個單一的ResultSet。這樣的ResultSet將會將包含重複或部分數據重複的結果集正確的映射到嵌套的對象樹中。爲了實現它, MyBatis允許你 “串聯” ResultMap,以便解決嵌套結果集的問題。想了解更多內容,請參考下面的Association元素。
name The name of the constructor parameter. Specifying name allows you to write arg elements in any order. See the above explanation. Since 3.4.3.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章