首页 > 其他分享 >springboot~mybatis中使用selectKey获取自增主键

springboot~mybatis中使用selectKey获取自增主键

时间:2023-08-09 09:11:46浏览次数:35  
标签:语句 自增 springboot 数据库 主键 获取 MyBatis id

在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 语句的方式有一些差异,导致了这种不同的结果。

下面是一些可能导致此问题的原因和解决方法:

  1. 事务问题: MyBatis 默认是在事务中执行 SQL 语句的。如果你在 <insert> 中同时使用了 <selectKey>,确保你的事务配置正确,事务提交之后才能正确地获取到自增主键值。

  2. 数据库返回值处理问题: MyBatis 在执行 <insert> 语句后,会通过 JDBC 获取数据库的返回结果。如果数据库的返回结果不符合预期,可能导致 MyBatis 返回 1。确保数据库返回的结果和 MyBatis 预期的结果一致。

  3. 数据库驱动问题: 不同的数据库驱动可能在处理 <selectKey> 时存在不同的行为。确保使用了与你的数据库兼容的驱动版本。

  4. 日志输出: 启用 MyBatis 的日志输出,查看生成的 SQL 语句以及执行情况,以便进一步分析问题。

  5. 环境问题: 确保在 MyBatis 中配置了正确的数据库连接信息,以及其他必要的配置项。

如果你已经排除了上述可能的问题,但仍然无法解决,建议提供更多关于你的 MyBatis 配置、映射文件和代码的详细信息,以及在命令行上执行 SQL 语句的方式,这样我才能更准确地帮助你排查问题。

标签:语句,自增,springboot,数据库,主键,获取,MyBatis,id
From: https://www.cnblogs.com/lori/p/17615957.html

相关文章

  • Springboot集成使用阿里云kafka详细步骤
    明确连接认证类型首先要明确使用哪种连接认证类型Ons模式参考https://github.com/AliwareMQ/aliware-kafka-demos/tree/master/kafka-java-demo/betaOns模式的conf内容KafkaClient{com.aliyun.openservices.ons.sasl.client.OnsLoginModulerequiredAccessKey="......
  • springboot集成mongo
    springboot集成mongo背景linux版本:KylinV10docker版本:18.03mongo版本:5.0.5报错信息Causedby:com.mongodb.MongoCommandException:Commandfailedwitherror18:'Authenticationfailed.'onserver172.18.48.233:8888.Thefullresponseis{"ok&quo......
  • SpringBoot静态资源
    访问顺序:Controller->静态资源->404静态资源默认访问路径前端访问:http://localhost:8080/page4.htmlclasspath:/staticclasspath:/publicclasspath:/resourcesclasspath:/META-INF/resources自定义访问路径自定义后默认访问路径失效yml配置文件配置spring: #匹配方式-即前缀 mvc......
  • SpringBoot入门
    1.介绍:SpringBoot是一个基于Spring框架的开源项目,旨在简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。SpringBoot提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。它通过自动......
  • SpringBoot配置文件和修改端口
    我们在上一篇文章中已经运行起了一个简单的基础项目并运行起来了。SpringBoot简介项目创建和运行使用但是我们发现简单版的SpringBoot项目没有配置文件,定制版的项目有一个配置文件application.properties,我们还可以发现有些SpringBoot的项目使用的是xml或者yml配置文件。那么......
  • springboot的AOP整理总结
    aop是spring的两大功能模块之一,功能非常强大,为解耦提供了非常优秀的解决方案。现在就以springboot中aop的使用来了解一下aop。一:使用aop来完成全局请求日志处理pom文件如下:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmln......
  • springboot中的缓存介绍
    前言Spring框架支持透明地向应用程序添加缓存对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法(包括增删查改等),从而减少操作数据的执行次数(主要是查询,直接从缓存中读取数据),同时不会对程序本身造成任何干扰。SpringBoot继承了Spring框架的缓存管理功能,通过使用@Enable......
  • springboot中redis作为缓存使用
    springboot中redis作为缓存使用springboot中的redis作为缓存使用application.yamlserver:port:8089#servlet:#context-path:/demoRedis1spring:redis:host:127.0.0.1port:6379password:pom文件<!--添加的依赖--><!--Redis......
  • SpringBoot学习
    SpringBoot学习1.SpringBoot入门1.1SpringbootWeb项目pom.xml基本配置 <properties> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot......
  • springboot集成seata1.5.2+nacos2.1.1
    一、前言Seata出现前,大部分公司使用的都是TCC或者MQ(RocketMq)等来解决分布式事务的问题,TCC代码编写复杂,每个业务均需要实现三个入口,侵入性强,RocketMQ保证的是最终一致性。二、环境准备1、nacos:(这里采用最新版本2.1.1)下载地址:https://github.com/alibaba/nacos/releases......