数据库主键ID自增,两种方法获取插入数据库那条数据主动生成的主键ID值 ...

打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

目次
1. 媒介
2. 适用于 MyBatis 框架
2.1 获取单条插入语句生成的ID
2.2 获取聚集插入生成的多条数据的ID
3. 适用于 MyBatisPlus 框架
3.1 获取单条数据插入生成的ID
3.2 获取聚集插入数据生成的多条数据的ID
4. 小结


1. 媒介

在开发过程中,我们可能会碰到如许的一种情况,我们保存一条数据。
假如这条数据的主键ID是由用户决定的,如许我们在获取主键ID的时间,只必要让前端的同时通报给我们就可以了;
假如主键ID设置为自增,是在用户新增数据操作时主动生成的,在后续业务逻辑中必要利用生成的主键ID值,我们又该怎样获取呢?本篇我们就来说说两种常用方法获取主动生成的主键ID;

2. 适用于 MyBatis 框架

2.1 获取单条插入语句生成的ID

在SQL映射文件中添加 useGeneratedKeys="true" keyProperty="id"
如下,我定义一个插入Product 实体接口
  1. // @Mapper 注释标注当前类为数据访问层接口
  2. @Mapper
  3. public interface ProductMapper {
  4.     // 定义一个插入接口
  5.     Integer insertProduct(@Param("product") Product product);
  6.    
  7. }
复制代码
在对应的 ProductMappper.xml SQL映射语句中,只必要在 <insert> 中添加 useGeneratedKeys="true" keyProperty="id" 这两个属性即可。
SQL语句中并没有传入ID。
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.haust.mapper.ProductMapper">
  4.     <insert id="insertProduct" useGeneratedKeys="true" keyProperty="id" parameterType="com.haust.entity.Product">
  5.         insert into product (`name`,`price`,`color`) values (#{product.productName},#{product.productPrice},#{product.productColor})
  6.     </insert>
  7. </mapper>
复制代码
我们来做个测试,可以看到,创建的实体对象中我并没有传入ID值,只通报了 name,price,color 三个属性值
  1.     @Test
  2.     public void testInsertProduct(){
  3.         Product product = new Product();
  4.         product.setProductName("电视机");
  5.         product.setProductPrice(2000.00);
  6.         product.setProductColor("red");
  7.         productMapper.insertProduct(product);
  8.         System.out.println(product);
  9.     }
复制代码
运行测试方法,就可以在控制台看到打印的商品信息,如下图,数据库主动生成的ID=14;

2.2 获取聚集插入生成的多条数据的ID

在 ProductMapper 接口中自定义 insertAll 插入多条数据接口
  1. @Mapper
  2. public interface ProductMapper extends BaseMapper<Product> {
  3.     Integer insertAll(@Param("productList") List<Product> productList);
  4. }
复制代码
 在对应的 ProductMapper.xml 文件中编写对应的 SQL 语句,利用动态SQL语句的写法
  1. <insert id="insertAll" parameterType="com.haust.entity.Product" useGeneratedKeys="true" keyProperty="id">
  2.         insert into product (name,price,color)
  3.         values
  4.         <foreach collection="productList" item="product" separator="," >
  5.             (#{product.productName},#{product.productPrice},#{product.productColor})
  6.         </foreach>
  7. </insert>
复制代码
编写测试类
  1.     @Test
  2.     public void testInsert(){
  3.         ArrayList<Product> list = new ArrayList<Product>();
  4.         Product product = new Product();
  5.         product.setProductName("电脑");
  6.         product.setProductPrice(5999.00);
  7.         product.setProductColor("white");
  8.         list.add(product);
  9.         Product product2 = new Product();
  10.         product2.setProductName("洗衣机");
  11.         product2.setProductPrice(999.00);
  12.         product2.setProductColor("red");
  13.         list.add(product2);
  14.         Product product3 = new Product();
  15.         product3.setProductName("冰箱");
  16.         product3.setProductPrice(1999.00);
  17.         product3.setProductColor("black");
  18.         list.add(product3);
  19.         productMapper.insertAll(list);
  20.         System.out.println(list);
  21.         // 获取ID集合
  22.         ArrayList<Long> ids = new ArrayList<Long>();
  23.         list.forEach(item ->{
  24.             ids.add(item.getId());
  25.         });
  26.         System.out.println(ids);
  27.     }
复制代码
运行方法,可以在控制台看到批量插入成功,并通过遍历获取到主动生成的ID聚集; 


3. 适用于 MyBatisPlus 框架

3.1 获取单条数据插入生成的ID

MyBatisPlus 框架自带的插入方法会在插入成功之后将方法回写到实体对象参数中;
我们都知道,MyBatisPlus 为提供了单表的增上改查方法,在MyBatis框架的基础上做了加强,我们仍以刚才的 Product 表为例,利用MyBatisPLus 实现获取主动生成主键ID。
第一步:修改实体类,添加表明
  1. @Data
  2. @TableName("product") // @TableName 注释是MyBatisPlus提供的注释,用于标注当前实体类对应数据库的哪张表
  3. public class Product {
  4.     // @TableId("id") 指定数据主键为 id,类型type为自增
  5.     @TableId(value = "id", type = IdType.AUTO)
  6.     private Long id;
  7.     // @TableField("name") 标注当前String字段name为普通字段,对应product数据库表中的字段name,下方同理
  8.     @TableField("name")
  9.     private String productName;
  10.     @TableField("price")
  11.     private Double productPrice;
  12.     @TableField("color")
  13.     private String productColor;
  14.     @TableField("production_date")
  15.     private Date productionDate;
  16. }
复制代码
第二步:修改Mapper接口,继承BaseMappper接口
  1. @Mapper
  2. public interface ProductMapper extends BaseMapper<Product> {
  3. }
复制代码
单表增上改查接口都在BaseMapper接口中定义好了,直接继承利用即可,不必要写xml文件,除非是自定义新增接口必要额外写;
  1.     @Test
  2.     public void testInsert(){
  3.         Product product = new Product();
  4.         product.setProductName("电脑");
  5.         product.setProductPrice(6999.00);
  6.         product.setProductColor("black");
  7.         int insert = productMapper.insert(product);
  8.         System.out.println(product);
  9.     }
复制代码
运行测试方法,打印 product 商品信息,可以发现我们没有传入主键ID的值,数据主动生成的ID=15,并写入到了 product 对象中,我们打印 product 就会显示出来ID,接上了刚才的14。
在现实的开发过程中,假如必要利用ID,在实行完插入操作之后,直接调用 product.getId() 即可获取到生成的主键ID值。

3.2 获取聚集插入数据生成的多条数据的ID

MyBatisPlus 提供了多条插入数据,但是在 Service 业务层接口方法,mapper 层只提供了单条数据插入接口,要利用聚集插入,必要继承 IService 接口,泛型为实体泛型 Product。
  1. public interface ProductService extends IService<Product> {
  2. }
复制代码
实现类继承 ServiceImpl 类并添加两个泛型,第一个泛型填写对应的 Mapper 接口,第二个泛型填写对应的实体类 Product 泛型;
  1. @Service
  2. public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
  3. }
复制代码
书写测试类
  1.     @Test
  2.     public void testInsert(){
  3.         ArrayList<Product> list = new ArrayList<Product>();
  4.         Product product = new Product();
  5.         product.setProductName("电脑");
  6.         product.setProductPrice(6999.00);
  7.         product.setProductColor("black");
  8.         list.add(product);
  9.         Product product2 = new Product();
  10.         product2.setProductName("洗衣机");
  11.         product2.setProductPrice(999.00);
  12.         product2.setProductColor("black");
  13.         list.add(product2);
  14.         Product product3 = new Product();
  15.         product3.setProductName("冰箱");
  16.         product3.setProductPrice(1999.00);
  17.         product3.setProductColor("black");
  18.         list.add(product3);
  19.         productService.saveBatch(list);
  20.         System.out.println(list);
  21.         // 获取ID集合
  22.         ArrayList<Long> ids = new ArrayList<Long>();
  23.         list.forEach(item ->{
  24.             ids.add(item.getId());
  25.         });
  26.     }
复制代码
运行测试类,打印 list 聚集,假如要获取所有ID,遍历 list 聚集即可,代码中我已经写好了,运行如下图,可以看到获取到了生成的ID聚集。


4. 小结

其实上述两种方法没有本质区别,只是框架不一样。
假如在现实开发过程中,你的公司没有利用 MyBatisPlus 框架,那就选择第一种方法加入 useGeneratedKeys="true" keyProperty="id" 即可;
假如你的公司利用了 MyBatisPlus 框架,根本不必要做额外操作,由于现实开发过程中也很少会有插入语句必要去自定义的,直接利用 MyBatisPlus 提供的足以应对业务需求;


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表