在mybatis中,我們在insert操作之後,可以獲取到自增主鍵的值,這個需要我們用到 INSERT INTO lawyer_id_offset (kgid) VALUES (#{kgid}) ``` # java中調用它 > 註意,這裡有個坑,獲取自增主鍵,不是獲取mapper的返回值,而是從當 ...
在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中調用它
註意,這裡有個坑,獲取自增主鍵,不是獲取mapper的返回值,而是從當前實體中獲取id,這點需要註意。
@GetMapping("insert")
public AjaxResult insert() {
IdOffset idOffset = new IdOffset();
idOffset.setKgid("ax01");
idOffsetMapper.inserIdOffset(idOffset );
return AjaxResult.success(idOffset.getId());
}
解析後的SQL語句
selectKey不起作用的原因
在 MyBatis 中使用 <selectKey>
來獲取自增主鍵值時,有時可能會出現返回 1 的情況。這可能是因為在 MyBatis 的執行環境和命令行中執行 SQL 語句的方式有一些差異,導致了這種不同的結果。
下麵是一些可能導致此問題的原因和解決方法:
-
事務問題: MyBatis 預設是在事務中執行 SQL 語句的。如果你在
<insert>
中同時使用了<selectKey>
,確保你的事務配置正確,事務提交之後才能正確地獲取到自增主鍵值。 -
資料庫返回值處理問題: MyBatis 在執行
<insert>
語句後,會通過 JDBC 獲取資料庫的返回結果。如果資料庫的返回結果不符合預期,可能導致 MyBatis 返回 1。確保資料庫返回的結果和 MyBatis 預期的結果一致。 -
資料庫驅動問題: 不同的資料庫驅動可能在處理
<selectKey>
時存在不同的行為。確保使用了與你的資料庫相容的驅動版本。 -
日誌輸出: 啟用 MyBatis 的日誌輸出,查看生成的 SQL 語句以及執行情況,以便進一步分析問題。
-
環境問題: 確保在 MyBatis 中配置了正確的資料庫連接信息,以及其他必要的配置項。
如果你已經排除了上述可能的問題,但仍然無法解決,建議提供更多關於你的 MyBatis 配置、映射文件和代碼的詳細信息,以及在命令行上執行 SQL 語句的方式,這樣我才能更準確地幫助你排查問題。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!