springboot~mybatis中(zhong)使用selectKey獲取自(zi)增主鍵
在mybatis中,我們在insert操作之后,可以獲取到自增主鍵的值,這個需要我們用到
- 假設我們有數據表id_offset,然后id是自增主鍵
- 我們在插入數據后,希望得到這個新插入的主鍵的值
- 我們不希望通過兩條語句實現,因為這樣在并發時會有問題
數據結構
DROP TABLE IF EXISTS `id_offset`;
CREATE TABLE `lawfirm_id_offset` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`kgid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
);
mybatis中的mapper文件
<insert id="insertIdOffset" parameterType="IdOffset">
<selectKey resultType="long" keyProperty ="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO lawyer_id_offset (kgid) VALUES (#{kgid})
</insert>
java中調用它
注意,這里有個坑,獲(huo)取(qu)自增主鍵,不是獲(huo)取(qu)mapper的返回(hui)值,而是從當前實(shi)體中(zhong)獲(huo)取(qu)id,這點(dian)需要(yao)注意。
@GetMapping("insert")
public AjaxResult insert() {
IdOffset idOffset = new IdOffset();
idOffset.setKgid("ax01");
idOffsetMapper.inserIdOffset(idOffset );
return AjaxResult.success(idOffset.getId());
}
解析后的SQL語句

selectKey不起作用的原因
在 MyBatis 中使用 <selectKey> 來獲取自增(zeng)主鍵值時,有時可(ke)(ke)能會(hui)出現(xian)返(fan)回 1 的(de)情況。這可(ke)(ke)能是因為在(zai) MyBatis 的(de)執行(xing)環境和命令行(xing)中執行(xing) SQL 語句的(de)方式有一些(xie)差(cha)異,導致了這種不(bu)同的(de)結果(guo)。
下面(mian)是一些可能(neng)導致此問(wen)題(ti)的原因(yin)和解決方法:
-
事務問題: MyBatis 默認是在事務中執行 SQL 語句的。如果你在
<insert>中同時使用了<selectKey>,確(que)(que)保你(ni)的(de)事務(wu)配置正(zheng)確(que)(que),事務(wu)提交之后才能正(zheng)確(que)(que)地獲取(qu)到自增主鍵值。 -
數據庫返回值處理問題: MyBatis 在執行
<insert>語句后,會(hui)通(tong)過 JDBC 獲取數據(ju)庫的返(fan)(fan)回結(jie)(jie)果。如果數據(ju)庫的返(fan)(fan)回結(jie)(jie)果不符合預期,可能導(dao)致(zhi) MyBatis 返(fan)(fan)回 1。確保(bao)數據(ju)庫返(fan)(fan)回的結(jie)(jie)果和 MyBatis 預期的結(jie)(jie)果一致(zhi)。 -
數據庫驅動問題: 不同的數據庫驅動可能在處理
<selectKey>時存在不同的行為(wei)。確保(bao)使用了(le)與你的數據庫兼容的驅動版本。 -
日志輸出: 啟用 MyBatis 的日志輸(shu)出,查看生成的 SQL 語句以(yi)及執(zhi)行(xing)情況,以(yi)便(bian)進一步分(fen)析問題。
-
環境問題: 確保在 MyBatis 中配置(zhi)了正確的數據庫連(lian)接信息,以(yi)及其他必要(yao)的配置(zhi)項(xiang)。
如果你已(yi)經排除(chu)了上述(shu)可能的問(wen)題(ti),但(dan)仍然無法解決,建議提供更多關于你的 MyBatis 配置、映(ying)射文件和代碼的詳細信(xin)息(xi),以及在命令行上執行 SQL 語句的方式,這樣我才能更準確地幫助你排查(cha)問(wen)題(ti)。