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

发布时间 2023-04-22 20:58:37作者: binbinx

场景:当我们添加一个检查组,并且我们需要给这个检查组中添加多个检测项,我们应该先创建检查组,然后根据检查组的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;
}