mybatis xml裡的 resultMap、resultOrdered、resultSets、resultSetType、resultType 區別

del88發表於2024-10-01

在MyBatis中,對映結果集是一項重要的功能,用於將資料庫查詢結果對映到Java物件中。為了實現這一功能,MyBatis提供了多個配置選項,如 resultMapresultOrderedresultSetsresultSetTyperesultType。以下是這些配置選項的詳細解釋及示例:

1. resultType

resultType 是最簡單的結果對映方式之一,它指定了查詢結果應該對映到的Java類。MyBatis會自動將查詢結果的列名和Java屬性的名進行匹配(基於命名規則)。

示例

假設有一個 User 類:

public class User {
    private int id;
    private String username;
    private String password;

    // getters and setters
}

MyBatis XML配置:

<select id="getUserById" resultType="com.example.User">
    SELECT id, username, password FROM users WHERE id = #{id}
</select>

2. resultMap

resultMap 是最靈活和強大的結果對映方式。它允許你指定查詢結果如何對映到Java物件的屬性上,甚至允許處理複雜的對映(如巢狀物件和集合)。

示例

MyBatis XML配置:

<resultMap id="userResultMap" type="com.example.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
</resultMap>

<select id="getUserById" resultMap="userResultMap">
    SELECT id, username, password FROM users WHERE id = #{id}
</select>

3. resultOrdered

resultOrdered 並不是一個獨立的配置選項,而是在 resultMap<constructor> 標籤中使用的一個屬性,用於指定構造方法引數的順序。

示例

假設 User 類有一個構造方法:

public class User {
    private int id;
    private String username;
    private String password;

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    // getters and setters
}

MyBatis XML配置:

<resultMap id="userResultMap" type="com.example.User">
    <constructor resultOrdered="true">
        <idArg column="id" javaProperty="id"/>
        <arg column="username" javaProperty="username"/>
        <arg column="password" javaProperty="password"/>
    </constructor>
</resultMap>

<select id="getUserById" resultMap="userResultMap">
    SELECT id, username, password FROM users WHERE id = #{id}
</select>

4. resultSets

resultSets 是在使用儲存過程時指定多個結果集的處理方式。普通查詢通常只返回一個結果集,但儲存過程可以返回多個結果集。

示例

假設儲存過程 getUserAndOrders 返回兩個結果集,一個是使用者資訊,一個是訂單資訊。

MyBatis XML配置:

<select id="getUserAndOrders" statementType="CALLABLE" resultSets="userResultMap,ordersResultMap">
    {CALL getUserAndOrders(#{userId, jdbcType=INTEGER, mode=IN, javaType=int})}
</select>

<resultMap id="userResultMap" type="com.example.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
</resultMap>

<resultMap id="ordersResultMap" type="com.example.Order">
    <id property="id" column="id"/>
    <result property="orderId" column="order_id"/>
    <result property="amount" column="amount"/>
</resultMap>

5. resultSetType

resultSetType 指定了MyBatis應該如何處理資料庫的遊標(結果集型別),它影響MyBatis對結果集的滾動和更新行為。常見的值有 FORWARD_ONLYSCROLL_INSENSITIVESCROLL_SENSITIVE

  • FORWARD_ONLY:結果集只能向前滾動(預設)。
  • SCROLL_INSENSITIVE:結果集可以滾動,但對結果集的更改不敏感。
  • SCROLL_SENSITIVE:結果集可以滾動,並且對結果集的更改敏感。

示例

MyBatis XML配置:

<select id="getUserById" resultSetType="SCROLL_INSENSITIVE" resultType="com.example.User">
    SELECT id, username, password FROM users WHERE id = #{id}
</select>

總結

  • resultType:簡單對映,用於直接將結果列對映到Java屬性。
  • resultMap:複雜對映,允許細粒度控制結果到Java物件的對映。
  • resultOrdered:在 resultMap<constructor> 中使用,指定構造方法引數順序。
  • resultSets:處理儲存過程返回的多個結果集。
  • resultSetType:指定結果集的型別,控制遊標的滾動和更新行為。

這些配置選項使得MyBatis能夠靈活地處理各種資料庫查詢結果,並將其對映到Java物件中。根據具體需求,你可以選擇最適合的配置方式。

相關文章