获取插入数据自动生成的id的值的三种方法

博客围绕插入数据后获取自动生成ID的问题展开。场景是添加检查组及多个检测项,需先创建检查组,再关联检查组和检测项ID到第三个表。介绍了三种方法,一是用MyBatis的<selectKey>标签,二是用insert标签的useGeneratedKeys和keyProperty属性,三是用MyBatis-Plus的insert方法。

场景:当我们添加一个检查组,并且我们需要给这个检查组中添加多个检测项,我们应该先创建检查组,然后根据检查组的ID和检查项的id 将俩者关系添加到第三个表中,但是我们所插入的检查组的ID值是数据库自动生成的,我们怎么才能在插入数据后获取当前插入数据的ID呢?

9.1 方法一:使用mybaits的 <selectKey>标签

     <!--新增-->
     <insert id="add" parameterType="com.tk.domain.CheckGroup">
         <!--
             selectKey 可以查询出当前插入数据自动生成的id 值,并赋值给传入给对象的 id
             resultType : 主键ID 的类型
             order : 该代码是在下面代码之前执行还是之后执行
                     如果设置 After : 先执行插入语句,然后在selectKey 元素
             keyProperty : 对象中的属性
         -->
         <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
             SELECT LAST_INSERT_ID()
         </selectKey>
         insert into t_checkgroup(code,name,sex,helpCode,remark,attention)
          values (#{code},#{name},#{sex},#{helpCode},#{remark},#{attention})
     </insert>

ServiceImpl

     /**
      * 增加一条检查组数据
      * @param checkGroup
      * @return
      */
     @Override
     public int add(CheckGroup checkGroup,Integer[] checkitemIds) {
         int result = checkGroupDao.add(checkGroup);
         // 获取数据库自动生成主键 ID 的值
         Integer checkGroupId = checkGroup.getId();
 ​
         Map<String,Integer> map = new HashMap<>();
         // 添加检查组和检测项的依赖关系
         if(checkitemIds != null && checkitemIds.length > 0){
             for (Integer checkitemId : checkitemIds) {
                 map.put("checkItemId",checkitemId);
                 map.put("checkGroupId",checkGroupId);
                 checkGroupDao.addCheckGroupIdAndCheckItemId(map);
             }
         }
         return result;
     }

 

9.2 方法二: 使用mybaits的 insert 标签的 useGeneratedKeys 和 keyProperty 属性

   
    <!--新增-->
     <!-- useGeneratedKeys 和 keyProperties 和上面的含义相同 -->
     <insert id="add" parameterType="com.tk.domain.CheckGroup" useGeneratedKeys="true" keyProperty="id">
         insert into t_checkgroup(code,name,sex,helpCode,remark,attention)
          values (#{code},#{name},#{sex},#{helpCode},#{remark},#{attention})
     </insert>

 

9.3 方法三: 使用mybatis-plus 的的 insert 方法

mybatis -plus 会默认的把自动生成的主键封装到我们传入的实体对象中

     @Override
     public int add(CheckGroup checkGroup,Integer[] checkitemIds) {
        /* 
         原始xml方法
         int result = checkGroupDao.add(checkGroup);
         */
         // mybatis-plus 中的insert 方法
         int count = checkGroupDao.insert(checkGroup);
         // 获取数据库自动生成主键 ID 的值
         Integer checkGroupId = checkGroup.getId();
         System.out.println(checkGroup.getId());
 ​
         Map<String,Integer> map = new HashMap<>();
         // 添加检查组和检测项的依赖关系
         if(checkitemIds != null && checkitemIds.length > 0){
             for (Integer checkitemId : checkitemIds) {
                 map.put("checkItemId",checkitemId);
                 map.put("checkGroupId",checkGroupId);
                 checkGroupDao.addCheckGroupIdAndCheckItemId(map);
             }
         }
         return count;
     }

 

在不同数据库中,存储过程插入数据自动生成 ID方法有所不同,以下为几种常见数据库的实现方式: #### PostgreSQL 在 PostgreSQL 中,可以通过创建序列发生器,再利用序列操作函数生成 ID。 ```sql -- 创建序列发生器 CREATE SEQUENCE serial START 101; -- 创建存储过程 CREATE OR REPLACE FUNCTION add_student("name" text, age integer) RETURNS bigint AS $BODY$ DECLARE s_no bigint; BEGIN -- 获取序列的下一个 s_no := nextval('serial'); -- 插入数据 INSERT INTO students VALUES (s_no, $1, $2); -- 返回生成的 ID RETURN s_no; END; $BODY$ LANGUAGE plpgsql; ``` 此存储过程中,先创建了一个名为 `serial` 的序列发生器,起始为 101。在存储过程 `add_student` 里,通过 `nextval('serial')` 函数获取序列的下一个作为 ID插入到 `students` 表中,最后返回该 ID [^3]。 #### 使用 UUID 作为主键 在 PostgreSQL 中,也可以使用 UUID 作为主键,插入数据时会自动生成 UUID 。 ```sql -- 创建表时指定 UUID 主键 CREATE TABLE example_table ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), column1 text, column2 integer ); -- 插入数据 INSERT INTO example_table (column1, column2) VALUES ('value1', 123); ``` 这里创建表时,`id` 字段使用 `UUID PRIMARY KEY DEFAULT uuid_generate_v4()` 定义,插入数据时会自动生成 UUID [^2]。 #### 在 MyBatis 中结合存储过程插入数据 在 MyBatis 中,可使用 `useGeneratedKeys` 和 `keyProperty` 属性实现插入数据返回自动生成ID。 ```xml <insert id="insertData" parameterType="com.example.entity.ExampleEntity" useGeneratedKeys="true" keyProperty="id"> INSERT INTO example_table (column1, column2) VALUES (#{column1}, #{column2}) </insert> ``` 这里 `useGeneratedKeys="true"` 表示使用数据自动生成的主键,`keyProperty="id"` 表示将自动生成的主键Java 对象的 `id` 属性 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值