Mybatis+Mysql插入数据库返回自增主键id值的三种方法(转)

原文:https://www.cnblogs.com/erma0-007/p/8616256.html

一、场景:

插入数据库的值需要立即得到返回的主键id进行下一步程序操作

 

二、解决方法:

第一种:使用通用mapper的插入方法

Mapper.insertSelective(record);

此方法:插入一条数据,只插入不为null的字段,不会影响有默认值的字段
支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长


controller的实际应用:使用方法id会直接将映射到参数的实体上使用时直接使用参数的实体get获取值

 

通用mapper相关配置查看其它文章   http://blog.csdn.net/isea533/article/details/41457529

 

第二种:编写sql语句

dao层方法:

[java]  view plain  copy
 
  1. /** 
  2.      * 插入数据库并返回主键id 
  3.      * @param batch 
  4.      * @return 
  5.      */  
  6.     Integer insertBatchReturnId(Batch batch);  

 

 

xml的sql语句写法

记得加上useGeneratedKeys和keyProperty配置即可,前者是指设置是否使用jdbc的getGenereatedKeys方法获取主键并赋值到keyProperty设置的属性中,后者即实体类主键字段(并且大小写要对应上)

 

[html]  view plain  copy
 
  1. <insert id="insertBatchReturnId" useGeneratedKeys="true" keyProperty="id" parameterType="org.uz.dxt.model.bankbase.Batch"  >    
  2.        
  3.     insert into t_batch (  
  4.     batchCode,  
  5.     bankCode,  
  6.     bizType,  
  7.     companyCode,  
  8.     wtEndDate,  
  9.     wtDate,  
  10.     contractId,   
  11.     totalCount,  
  12.     totalBase,   
  13.     handCode)  
  14.     values   
  15.     ( #{batchcode},  
  16.     #{bankcode},  
  17.     #{biztype},  
  18.     #{companycode},  
  19.     #{wtenddate},  
  20.     #{wtdate},   
  21.     #{contractid},  
  22.     #{totalcount},  
  23.     #{totalbase},   
  24.     #{handCode})  
  25. </insert>    

 

 

controller的实际应用:使用方法id会直接将映射到参数的实体上使用时直接使用参数的实体get获取值

 

[java]  view plain  copy
 
  1. batchService.insertBatch(param);//实体  
  2. idlist.add(param.getId());  

 

第三种:sql语句使用<selectKey>获取自增逐渐id

 

 

 

[html]  view plain  copy
 
  1. <insert id="add" parameterType="EStudent">  
  2.   // 下面是SQLServer获取最近一次插入记录的主键值的方式  
  3.   <selectKey resultType="_long" keyProperty="id" order="AFTER">  
  4.     select @@IDENTITY as id  
  5.   </selectKey>  
  6.   insert into TStudent(name, age) values(#{name}, #{age})  
  7. </insert>  


使用用法同上

 

 

这里推荐使用第一种和第二种中方法

第三种方法对oracl额外的配置

 

 

controller的实际应用:使用方法id会直接将映射到参数的实体上使用时直接使用参数的实体get获取值

转载于:https://www.cnblogs.com/sanxiao/p/9748701.html

### 回答1: MyBatis 通过 JDBC API 来操作数据库,而 JDBC API 本身就提供了获取自增主键方法。因此,MyBatis 返回自增主键的底层实现方式就是通过 JDBC API 获取自增主键。 具体来说,MyBatis 在执行插入操作时,会将生成的 SQL 语句传递给 JDBC 驱动程序。JDBC 驱动程序会执行该 SQL 语句,并返回一个 ResultSet 对象。MyBatis 会通过 ResultSet 对象获取生成的自增主键,并将其设置到对应的实体类或者参数对象中。 下面是一个示例代码,演示了如何在 MyBatis返回自增主键: ```java public interface UserMapper { // 使用 @Options 注解获取自增主键 @Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})") @Options(useGeneratedKeys = true, keyProperty = "id") int addUser(User user); } ``` 在上面的示例代码中,`@Options` 注解配置了 `useGeneratedKeys` 属性为 `true`,表示使用自动生成的主键。`keyProperty` 属性指定了将自动生成的主键设置到哪个属性中,这里是 `id`。当执行 `addUser` 方法时,MyBatis 会自动获取自增主键并设置到 `User` 对象的 `id` 属性中。 ### 回答2: MyBatis返回自增主键的底层实现是通过数据库的底层支持来实现的。具体来说,MyBatis会在执行插入操作后获取数据库返回自增主键,并将其赋给相应的实体对象或者映射文件中的主键属性。 如果使用MySQL数据库MyBatis会在插入数据后执行`SELECT LAST_INSERT_ID()`语句,从数据库中获取最近插入自增主键。然后,MyBatis返回自增主键给实体对象或者映射文件中的对应主键属性。 如果使用Oracle数据库MyBatis会在执行插入操作后,通过调用`Statement.getGeneratedKeys()`方法来获取生成的自增主键。然后,MyBatis返回自增主键给实体对象或者映射文件中的对应主键属性。 总之,MyBatis通过底层数据库的支持,使用相应的语句方法来获取插入操作后的自增主键,并将其赋给实体对象或者映射文件中的对应属性,以便后续的操作使用。 ### 回答3: MyBatis返回自增主键的底层实现是通过数据库自增主键功能来实现的。 在MyBatis中,可以使用数据库相关的插入语句插入数据,并且使用<selectKey>元素来获取数据库生成的自增主键。这个元素可以放在insert语句的内部,用于将生成的主键返回给应用程序。 具体实现步骤如下: 1. 在insert语句中,设置<selectKey>元素,使用keyProperty属性指定将自增主键存储在哪个属性中。 2. 设置useGeneratedKeys属性为true,表示要使用数据库自动生成的主键。 3. 设置keyColumn属性,指定数据库自动生成的主键所在的列。 4. 设置order属性,可以指定是在insert语句之前获取自增主键,还是在insert之后获取。 当执行insert语句时,MyBatis会执行相应的数据库操作,获取自动生成的主键,并将其存储在指定的属性中。随后,可以通过访问该属性来获取自增主键。 需要注意的是,不同的数据库有不同的自增主键实现方式。例如,MySQL使用AUTO_INCREMENT来生成自增主键,而Oracle使用序列(Sequence)来实现。MyBatis可以根据不同的数据库类型来自动选择适合的实现方式。 总之,MyBatis返回自增主键的底层实现是通过使用数据库自增主键功能实现的,并且在插入语句中使用<selectKey>元素来获取生成的自增主键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值