1. 返回自增主鍵
對于某些數(shù)據(jù)庫而言,在進(jìn)行insert操作時會自動生成主鍵值。這種情況下,我們可以通過MyBatis提供的 useGeneratedKeys 和 keyProperty 屬性來獲取添加后的主鍵值。
首先在Mapper接口中定義insert方法,并在注解或XML配置文件中指定 useGeneratedKeys="true" 和 keyProperty="id":
public interface UserMapper {
int insertUser(User user);
}
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>在調(diào)用 insertUser() 方法時,MyBatis會自動將自增主鍵值設(shè)置到 user 對象的 id 屬性中。
2. 返回影響行數(shù)
有時我們只需要知道添加操作影響了多少行數(shù)據(jù),而不需要獲取添加后的對象實例。這種情況下,我們可以直接讓insert方法返回影響的行數(shù)。
在Mapper接口中定義insert方法,返回值為 int 類型:
public interface UserMapper {
int insertUser(User user);
}在XML配置文件中編寫相應(yīng)的SQL語句:
<insert id="insertUser">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>在service層或controller層中調(diào)用 insertUser() 方法,返回值就是影響的行數(shù)。
3. 返回Insert語句執(zhí)行后的SelectKey
有時我們需要在insert操作之后立即獲取添加數(shù)據(jù)的詳細(xì)信息,而不僅僅是自增主鍵值。這種情況下,我們可以使用MyBatis提供的 selectKey 標(biāo)簽。
在Mapper接口中定義insert方法,參數(shù)為 User 對象:
public interface UserMapper {
void insertUser(User user);
}在XML配置文件中編寫相應(yīng)的SQL語句,并使用 selectKey 標(biāo)簽獲取添加后的對象信息:
<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>在調(diào)用 insertUser() 方法時,MyBatis會先執(zhí)行 selectKey 語句獲取添加后的主鍵值,并將其設(shè)置到 user 對象的 id 屬性中。隨后執(zhí)行實際的insert語句。
4. 返回添加后的完整對象
有時我們需要獲取添加操作后的完整對象實例,包括主鍵值以及其他字段。這種情況下,我們可以利用MyBatis提供的 useGeneratedKeys 和 keyProperty 屬性,結(jié)合 parameterType 屬性。
在Mapper接口中定義insert方法,參數(shù)為 User 對象:
public interface UserMapper {
void insertUser(User user);
}在XML配置文件中編寫相應(yīng)的SQL語句,并使用 useGeneratedKeys 和 keyProperty 屬性獲取添加后的完整對象:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>在調(diào)用 insertUser() 方法時,MyBatis會自動將添加后的完整 User 對象返回。我們可以直接使用這個對象,而無需再次查詢數(shù)據(jù)庫。
5. 返回insert操作執(zhí)行后的結(jié)果集
有時我們需要獲取insert操作執(zhí)行后的結(jié)果集,比如觸發(fā)器產(chǎn)生的額外數(shù)據(jù)。這種情況下,我們可以使用MyBatis提供的 ResultMap 功能。
首先在Mapper接口中定義insert方法,參數(shù)為 User 對象,返回值為 List<User>:
public interface UserMapper {
List<User> insertUserAndReturnAll(User user);
}在XML配置文件中編寫相應(yīng)的SQL語句,并使用 ResultMap 映射結(jié)果集:
<insert id="insertUserAndReturnAll" parameterType="com.example.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
SELECT * FROM users WHERE id = #{id}
</insert>在調(diào)用 insertUserAndReturnAll() 方法時,MyBatis會先執(zhí)行insert語句,然后立即執(zhí)行select語句獲取添加后的完整用戶信息列表。
6. 總結(jié)
本文詳細(xì)介紹了MyBatis在進(jìn)行insert操作時,如何通過各種方式返回添加后的對象實例。包括返回自增主鍵、返回影響行數(shù)、返回Insert語句執(zhí)行后的SelectKey、返回添加后的完整對象,以及返回insert操作執(zhí)行后的結(jié)果集。這些方法涵蓋了絕大部分的業(yè)務(wù)需求,可以幫助開發(fā)者靈活選擇合適的方式來獲取insert操作的結(jié)果。