mybatis的insert插入后獲取自增id的方法詳解(從controller到mapper)
需求說(shuō)明:當(dāng)執(zhí)行插入操作的時(shí)候,其中數(shù)據(jù)包含兩個(gè)模塊,分別存放在兩種數(shù)據(jù)庫(kù)表中,拿表A,表B來(lái)說(shuō)。
表A為基本信息表,其中插入時(shí)候有自增id,也就是每新增一條數(shù)據(jù)后下一個(gè)id都會(huì)自動(dòng)加1。
表B為詳情表,其中有個(gè)字段為A_id與A表中的id是一樣的,也就是他們的關(guān)聯(lián)字段。
那么問(wèn)題就來(lái)了:如果你在新增數(shù)據(jù)的時(shí)候,你發(fā)現(xiàn)基本信息和詳情的數(shù)據(jù)都是在一個(gè)頁(yè)面中,也是同時(shí)傳遞到后端接口中,那么我們勢(shì)必會(huì)有個(gè)先后,必須要有A表中的id,那樣的話B表中的數(shù)據(jù)才能夠?qū)?yīng)入庫(kù),不然所屬關(guān)聯(lián)關(guān)系就會(huì)亂,這樣也會(huì)影響功能,廢話不多說(shuō),直接上代碼。
Controller.java代碼模塊(也可以寫在service,看個(gè)人習(xí)慣)
//數(shù)據(jù)新增 //先將基本數(shù)據(jù)入庫(kù) res = service.insertbase(po); int id =po.getId(); newid = id; //然后獲取id再將另一部分?jǐn)?shù)據(jù)入另一張表
Mapper.xml代碼模塊
<insert id="insertbase" parameterType="alertmodelPo" useGeneratedKeys="true" keyProperty="po.id">
insert into A(profile_name,use_flag, create_by, create_date, remark)
values (#{po.profile_name},'1', #{po.create_by}, now(), #{po.remark})
<selectKey order="AFTER" resultType="java.lang.Integer" keyProperty="po.id">
select last_value from A_id_seq
</selectKey>
</insert>keyProperty:默認(rèn)為unset,主要用于設(shè)置getGeneratedKeys方法或selectKey子元素返回值將賦值到領(lǐng)域模型的哪個(gè)屬性中。
useGeneratedKeys:取值范圍true|false(默認(rèn)值),設(shè)置是否使用JDBC的。
其中主要是先執(zhí)行插入操作,然后再?gòu)谋硇蛄兄胁樵兂鲎钚碌臄?shù)據(jù),也就是last_value,這個(gè)地方存在一個(gè)情況就是表的數(shù)據(jù)最好不要直接庫(kù)操作表插入,不然會(huì)影響這個(gè)表的序列,當(dāng)然重置表序列等操作可以看我之前寫的博客,里面有詳細(xì)介紹。
操作過(guò)程可能遇到的問(wèn)題:
Id值取不到之情況1:keyProperty的值直接寫id沒(méi)有寫po.id。
本質(zhì)原因,因?yàn)閗eyProperty的值是對(duì)象的屬性值,不是數(shù)據(jù)表中的字段名。
Id值取不到之情況2:在dao層的入?yún)⑻帥](méi)有聲明@Param(“po”)從而導(dǎo)致po.id的值獲取不到,也就是說(shuō)這個(gè)沒(méi)聲名的話mapper里面就不知道你的po是什么值,就會(huì)報(bào)錯(cuò)no getter ‘po’……..。
本質(zhì)原因,對(duì)@Param的理解不夠。
后話:
*之前網(wǎng)上很多都是沒(méi)有下面selectKey的標(biāo)簽,我發(fā)現(xiàn)這個(gè)不寫的話會(huì)存在版本兼容,報(bào)下面這個(gè)錯(cuò)誤,所以沒(méi)有用網(wǎng)上的那些方法,上面的我寫的方法反正百試不爽。所以還是用我的方法吧。
Returning autogenerated keys is only supported for 8.2 and later servers.
以上就是mybatis的insert插入后獲取自增id的方法詳解(從controller到mapper)的詳細(xì)內(nèi)容,更多關(guān)于mybatis insert獲取自增id的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
代理角色java設(shè)計(jì)模式之靜態(tài)代理詳細(xì)介紹
查了好多資料,發(fā)現(xiàn)還是不全,干脆自己整理吧,至少保證在我的做法正確的,以免誤導(dǎo)讀者,也是給自己做個(gè)記錄吧!2013-05-05
mybatis insert 返回自增主鍵的實(shí)現(xiàn)示例
mybatis 在新增之后怎么也獲取不到自增主鍵,本文主要介紹了mybatis insert 返回自增主鍵的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法
這篇文章主要介紹了詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
java向es中寫入數(shù)據(jù)報(bào)錯(cuò)org.elasticsearch.action.ActionReque問(wèn)題
這篇文章主要介紹了java向es中寫入數(shù)據(jù)報(bào)錯(cuò)org.elasticsearch.action.ActionReque問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java 實(shí)戰(zhàn)項(xiàng)目之小說(shuō)在線閱讀系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)前臺(tái)閱讀后臺(tái)管理的小說(shuō)在線閱讀系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11

