Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析
添加記錄后獲取主鍵ID,這是一個(gè)很常見的需求,特別是在一次前端調(diào)用中需要插入多個(gè)表的場(chǎng)景。
除了添加單條記錄時(shí)獲取主鍵值,有時(shí)候可能需要獲取批量添加記錄時(shí)各記錄的主鍵值,MyBatis從3.3.1版本開始支持批量添加記錄并返回各記錄主鍵字段值。
一、獲取新添加記錄主鍵字段值
注意: 在MyBatis中添加操作返回的是記錄數(shù)并非記錄主鍵id。
如果需要獲取新添加記錄的主鍵值,需要在執(zhí)行添加操作之后,直接讀取Java對(duì)象的主鍵屬性。
Integer rows = sqlSession.getMapper(UserMapper.class).insertUser(user);
System.out.println("rows = " + rows); // 添加操作返回記錄數(shù)
System.out.println("id = " + user.getId()); // 執(zhí)行添加操作之后通過Java對(duì)象獲取主鍵屬性值
二、在映射器中配置獲取記錄主鍵值
1.xml映射器
在定義xml映射器時(shí)設(shè)置屬性u(píng)seGeneratedKeys值為true,并分別指定屬性keyProperty和keyColumn為對(duì)應(yīng)的數(shù)據(jù)庫(kù)記錄主鍵字段與Java對(duì)象的主鍵屬性。
1.1 插入單條記錄
<mapper namespace="com.dafeng.dao.mapper"> <!-- 插入數(shù)據(jù):返回記錄主鍵id值 --> <insert id="insertUser" parameterType="com.dafeng.model.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id" > insert into user(name,age,create_time,update_time) values(#{name},#{age},now(),now()) </insert> </mapper>
1.2 插入多條記錄
<!-- 批量添加數(shù)據(jù),并返回主鍵字段 --> <insert id="insertBatchUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name,age,create_time,update_time) VALUES <foreach collection="list" separator="," item="u"> (#{u.name},#{u.age},now(),now()) </foreach> </insert>
2.接口映射器
在接口映射器中通過注解@Options分別設(shè)置參數(shù)useGeneratedKeys,keyProperty,keyColumn值
2.1 插入單條記錄
// 返回主鍵字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into user(name,age,create_time,update_time) values(#{name},#{age},now(),now())")
Integer insertUser(User user);
2.2 插入多條記錄
如果希望執(zhí)行批量添加并返回各記錄主鍵字段值,只能在xml映射器中實(shí)現(xiàn),在接口映射器中無法做到。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring 源碼解析CommonAnnotationBeanPostProcessor
這篇文章主要為大家介紹了Spring 源碼解析CommonAnnotationBeanPostProcessor示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10SpringBoot在Controller層接收參數(shù)的n種姿勢(shì)(超詳細(xì))
這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01java中線程的sleep()方法和yield()方法的區(qū)別
本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時(shí)間,不釋放鎖,而yield()提示調(diào)度器當(dāng)前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下2024-10-10SpringBoot框架RESTful接口設(shè)置跨域允許
這篇文章主要為大家詳細(xì)介紹了SpringBoot框架RESTful接口設(shè)置跨域允許,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08m1 Mac設(shè)置多jdk版本并動(dòng)態(tài)切換的實(shí)現(xiàn)
本文主要介紹 Mac 下如何安裝 JDK 并且多版本如何切換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08