更新時(shí)間:2023-02-17 17:06:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽4785次
添加單一記錄時(shí)返回主鍵ID
添加一條記錄時(shí)返回主鍵值,在xml映射器和接口映射器中都可以實(shí)現(xiàn)。
在映射器中配置獲取記錄主鍵值
xml映射器
在定義xml映射器時(shí)設(shè)置屬性u(píng)seGeneratedKeys值為true,并分別指定屬性keyProperty和keyColumn為對(duì)應(yīng)的數(shù)據(jù)庫(kù)記錄主鍵字段與Java對(duì)象的主鍵屬性。
<mapper namespace="org.chench.test.mybatis.mapper">
<!-- 插入數(shù)據(jù):返回記錄主鍵id值 -->
<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
insert into test(name,descr,url,create_time,update_time)
values(#{name},#{descr},#{url},now(),now())
</insert>
</mapper>
接口映射器
在接口映射器中通過(guò)注解@Options分別設(shè)置參數(shù)useGeneratedKeys,keyProperty,keyColumn值
// 返回主鍵字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
獲取新添加記錄主鍵字段值
需要注意的是,在MyBatis中添加操作返回的是記錄數(shù)并非記錄主鍵id。因此,如果需要獲取新添加記錄的主鍵值,需要在執(zhí)行添加操作之后,直接讀取Java對(duì)象的主鍵屬性。
Integer rows = sqlSession.getMapper(TestMapper.class).insertOneTest(test);
System.out.println("rows = " + rows); // 添加操作返回記錄數(shù)
System.out.println("id = " + test.getId()); // 執(zhí)行添加操作之后通過(guò)Java對(duì)象獲取主鍵屬性值
添加批量記錄時(shí)返回主鍵ID
如果希望執(zhí)行批量添加并返回各記錄主鍵字段值,只能在xml映射器中實(shí)現(xiàn),在接口映射器中無(wú)法做到。
<!-- 批量添加數(shù)據(jù),并返回主鍵字段 -->
<insert id="insertBatchTest" useGeneratedKeys="true" keyProperty="id">
INSERT INTO test(name,descr,url,create_time,update_time) VALUES
<foreach collection="list" separator="," item="t">
(#{t.name},#{t.descr},#{t.url},now(),now())
</foreach>
</insert>
可以看到,執(zhí)行批量添加并返回記錄主鍵值的xml映射器配置,跟添加單條記錄時(shí)是一致的。不同的地方僅僅是使用了foreach元素構(gòu)建批量添加語(yǔ)句。
獲取主鍵ID實(shí)現(xiàn)原理
需要注意的是,不論在xml映射器還是在接口映射器中,添加記錄的主鍵值并非添加操作的返回值。實(shí)際上,在MyBatis中執(zhí)行添加操作時(shí)只會(huì)返回當(dāng)前添加的記錄數(shù)。
package org.apache.ibatis.executor.statement;
public class PreparedStatementHandler extends BaseStatementHandler {
@Override
public int update(Statement statement) throws SQLException {
PreparedStatement ps = (PreparedStatement) statement;
// 真正執(zhí)行添加操作的SQL語(yǔ)句
ps.execute();
int rows = ps.getUpdateCount();
Object parameterObject = boundSql.getParameterObject();
KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
// 在執(zhí)行添加操作完畢之后,再處理記錄主鍵字段值
keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
// 添加記錄時(shí)返回的是記錄數(shù),而并非記錄的主鍵字段值
return rows;
}
}
順便看一下MyBatis添加操作的時(shí)序圖:
跟蹤時(shí)序圖執(zhí)行步驟可以看到,MyBatis最終是通過(guò)MySQL驅(qū)動(dòng)程序獲取到了新添加的記錄主鍵值。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"讓我們深入的了解下mybatis返回主鍵id",希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您務(wù)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743