IT评测·应用市场-qidao123.com
标题:
springboot~mybatis中使用selectKey获取自增主键
[打印本页]
作者:
美丽的神话
时间:
2023-8-9 09:20
标题:
springboot~mybatis中使用selectKey获取自增主键
在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 中使用 来获取自增主键值时,有时可能会出现返回 1 的情况。这可能是因为在 MyBatis 的执行环境和命令行中执行 SQL 语句的方式有一些差异,导致了这种不同的结果。
下面是一些可能导致此问题的原因和解决方法:
事务问题:
MyBatis 默认是在事务中执行 SQL 语句的。如果你在 中同时使用了 ,确保你的事务配置正确,事务提交之后才能正确地获取到自增主键值。
数据库返回值处理问题:
MyBatis 在执行 语句后,会通过 JDBC 获取数据库的返回结果。如果数据库的返回结果不符合预期,可能导致 MyBatis 返回 1。确保数据库返回的结果和 MyBatis 预期的结果一致。
数据库驱动问题:
不同的数据库驱动可能在处理 时存在不同的行为。确保使用了与你的数据库兼容的驱动版本。
日志输出:
启用 MyBatis 的日志输出,查看生成的 SQL 语句以及执行情况,以便进一步分析问题。
环境问题:
确保在 MyBatis 中配置了正确的数据库连接信息,以及其他必要的配置项。
如果你已经排除了上述可能的问题,但仍然无法解决,建议提供更多关于你的 MyBatis 配置、映射文件和代码的详细信息,以及在命令行上执行 SQL 语句的方式,这样我才能更准确地帮助你排查问题。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4