insert返回主键 — mybatis selectKey

日常项目开发中,经常会用到一个场景:在表中新增一条数据,需要得到该条数据的主键ID。如何不额外写一条查询语句来得到新增数据的主键ID呢?mybatis的selectKey实现了这个功能。

mybatis的selectKey在不同数据库中的用法有点区别:

oracle中的用法

 <insert id="insertUser" parameterClass="XXX.user"> 
          <selectKey resultClass="long" keyProperty="id"order="BEFORE"> 
              select SEQ_USER_ID.nextval as id from dual 
          </selectKey> 
           insert into user  (id,name,password) 
          values (#{id},#{name},#{password}) 
      </insert> 

这句话会在插入user之前执行(order=“BEFORE”),该句话执行完之后,通过SEQ_USER_ID.nextval生成一个ID,传进来的参数User对象里的id字段就会被赋值成sequence的值,通过user.id即可获取新增数据的主键ID。

mysql中的用法

<insert id="insertUser" parameterClass="XXX.user"> 
      insert into user (name,password) values (#{id},#{name},#{password}) 
      <selectKeykeyProperty="id" order="AFTER" resultType="java.lang.Integer">  
            SELECT LAST_INSERT_ID() AS ID  
      </selectKey>  
 </insert> 

该种用法是通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值。插入之后获得ID赋值到传进来的对象中,通过user.id获取。

SelectKey用法详解:

1、SelectKey因为可以很随意的设置生成主键的方式,所以用在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题。使用它可以得到sequence的值(比如用在oracle中,就可以使用SEQ_USER_ID.nextval来生成一个主键),同时也会将值返回。对于不同的数据库有不同的操作方式。

2、SelectKey标签中有一个order属性,在不同的数据库中有不同的用法:
1)在支持自动增长类型的数据库(mysql)中,order需要设置为after才会取到正确的值。新增数据的时候mysql数据库通过自增取得主键ID,然后将值返回;
2)像Oracle这样取序列的情况,需要设置为before。通过序列化方法生成一个主键ID,之后插入数据库。

3、属性
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis plus是一款基于Mybatis的增强工具,它在Mybatis的基础上进行了扩展,提供了更加便捷的使用方式。在使用mybatis plus的mapper.insert方法时,如果没有返回主键id,这可能是由于数据源连接池未配置正确导致的。常见设置方式是在application.yml或application.properties文件中增加如下配置: ``` # datasource spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.initialSize=1 spring.datasource.maxActive=10 spring.datasource.minIdle=1 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false ``` 如果以上配置项设置正确,但仍然无法返回主键id,则可以考虑通过在实体类中使用@TableId注解指定主键生成策略来解决问题。例如: ``` @TableId(value = "id", type = IdType.AUTO) private Long id; ``` 通过指定type属性值为IdType.AUTO,可以让Mybatis plus自动根据数据库自增长生成主键id。 当然,如果以上解决方法均无效,则可以考虑在mapper.xml文件中使用<selectKey>标签手动获取主键id。 总的来说,使用Mybatis plus时如果mapper.insert无法返回主键id要检查数据源连接池配置是否正确,并注意实体类中主键的生成策略设置。 ### 回答2: Mybatis Plus是一个基于Mybatis的增强工具库,提供了很多便捷的方法和功能。Mapper.insert方法是其中一个经常被使用的方法,它可以将一个实体类对象插入到数据库中。但是,在使用Mapper.insert方法插入数据的时候,有的时候我们会遇到一个问题,即没有返回主键id。 造成这种情况的原因是,当我们使用Mapper.insert方法插入数据时,如果实体类中没有主键id属性或者主键id属性的值为null,则Mybatis Plus默认使用数据库自增插入主键id。而这时,插入操作是通过SQL语句完成的,数据库返回主键id并不会映射到实体类的主键id属性上,因此Mapper.insert方法无法返回主键id值。 为了解决这个问题,我们可以使用Mybatis Plus提供的两种方法: 1.使用注解@TableId(type= IdType.AUTO)标注实体类的主键id属性,表示主键id是自增的,默认类型为雪花算法(63位随机自增的唯一ID),这样Mybatis Plus会在插入成功后将主键id赋值到实体类的主键id属性上。 2.在Mapper.insert操作后,通过实体类对象获取主键id值,可以使用Mybatis Plus提供的两种方法: (1)实体类主键id属性用@TableId注解,并指定id生成策略,如自增: User user = new User(); user.setName("test"); user.setAge(20); user.setSex(1); user.setAddress("test"); mapper.insert(user); Long id = user.getId(); (2)实体类主键id属性不用@TableId注解,Mapper.insert方法后使用数据库的CURRVAL或NEXTVAL获取主键id: User user = new User(); user.setName("test"); user.setAge(20); user.setSex(1); user.setAddress("test"); mapper.insert(user); Long id = (Long)SqlHelper.getObject(user, MetaObject.forObject(user), "id"); 综上所述,Mybatis Plus Mapper.insert方法没有返回主键id,是因为实体类主键id属性没有映射到返回值里。我们可以使用@TableId注解或者getObject方法获取实体类主键id属性的值来解决这个问题。 ### 回答3: MyBatis Plus作为一个流行的ORM框架,大大简化了Java应用程序与数据库的交互。在使用MyBatis Plus中的Mapper接口进行数据插入时,如果使用Mapper.insert方法,可能会遇到无法返回主键id的情况。 造成该现象的主要原因在于Mapper.insert方法使用了另一个名为SqlMethod.INSERT_ONE的私有静态方法,该方法会忽略对主键id的处理。实际上,该方法的insert语句并没有包含主键列,所以也就无法返回主键id了。 在这种情况下,我们可以使用Mapper.insert方法的重载版本,即Mapper.insert(T entity, boolean selective)。其中,第二个参数为一个布尔值,表示是否选择只插入非空字段。通过将该参数置为false,我们可以强制Mapper插入所有字段,包括主键列,从而获得正确的主键id。例如: ``` User user = new User(); user.setName("张三"); user.setAge(20); user.setEmail("zhangsan@qq.com"); mapper.insert(user, false); //将第二个参数置为false System.out.println("新增用户id:" + user.getId()); ``` 除了使用重载方法之外,我们还可以在实体类的主键字段上添加一个注解,指示该字段为自增主键。这样,MyBatis Plus就会自动处理主键id,在插入数据后将主键id赋值给实体对象的主键字段。例如: ``` public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; //...省略getter和setter方法 } ``` 在实际开发中,我们可以根据具体场景选择使用哪种方式获取插入数据的主键id,以便更好地处理业务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值