在MyBatis中,對映結果集是一項重要的功能,用於將資料庫查詢結果對映到Java物件中。為了實現這一功能,MyBatis提供了多個配置選項,如 resultMap
、resultOrdered
、resultSets
、resultSetType
和 resultType
。以下是這些配置選項的詳細解釋及示例:
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_ONLY
、SCROLL_INSENSITIVE
和 SCROLL_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物件中。根據具體需求,你可以選擇最適合的配置方式。