在mybatis中,我們在insert操作之后,可以獲取到自增主鍵的值,這個需要我們用到
- 假設我們有數據表id_offset,然后id是自增主鍵
- 我們在插入數據后,希望得到這個新插入的主鍵的值
- 我們不希望通過兩條語句實現,因為這樣在并發(fā)時會有問題
數據結構
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 的執(zhí)行環(huán)境和命令行中執(zhí)行 SQL 語句的方式有一些差異,導致了這種不同的結果。
下面是一些可能導致此問題的原因和解決方法:
-
事務問題: MyBatis 默認是在事務中執(zhí)行 SQL 語句的。如果你在
<insert>
中同時使用了<selectKey>
,確保你的事務配置正確,事務提交之后才能正確地獲取到自增主鍵值。 -
數據庫返回值處理問題: MyBatis 在執(zhí)行
<insert>
語句后,會通過 JDBC 獲取數據庫的返回結果。如果數據庫的返回結果不符合預期,可能導致 MyBatis 返回 1。確保數據庫返回的結果和 MyBatis 預期的結果一致。 -
數據庫驅動問題: 不同的數據庫驅動可能在處理
<selectKey>
時存在不同的行為。確保使用了與你的數據庫兼容的驅動版本。 -
日志輸出: 啟用 MyBatis 的日志輸出,查看生成的 SQL 語句以及執(zhí)行情況,以便進一步分析問題。
-
環(huán)境問題: 確保在 MyBatis 中配置了正確的數據庫連接信息,以及其他必要的配置項。文章來源:http://www.zghlxwxcb.cn/news/detail-634527.html
如果你已經排除了上述可能的問題,但仍然無法解決,建議提供更多關于你的 MyBatis 配置、映射文件和代碼的詳細信息,以及在命令行上執(zhí)行 SQL 語句的方式,這樣我才能更準確地幫助你排查問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-634527.html
到了這里,關于springboot~mybatis中使用selectKey獲取自增主鍵的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!