文章目录
问题:插入一条数据,如何获取这条新数据自动生成的id值?
插入一条数据,如何获取这条新数据自动生成的id值?
解决方法1:在insert语句上加入两个属性:useGeneratedKeys=“true” keyProperty=“实体类id属性名”
在这条insert语句上加入两个属性:useGeneratedKeys=“true” keyProperty=“postId”
其中useGeneratedKeys的值固定为true,keyProperty为实体类中的id字段
Mapper文件部分代码:
核心代码为useGeneratedKeys="true" keyProperty="postId"
<insert id="insertPostReturnPid" useGeneratedKeys="true" keyProperty="postId" parameterType="com.hrms.pojo.TbPost" >
insert into tb_post
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="postId != null" >
post_id,
</if>
<if test="postName != null" >
post_name,
</if>
<if test="postMsg != null" >
post_msg,
</if>
<if test="postUseState != null" >
post_use_state,
</if>
<if test="created != null" >
created,
</if>
<if test="modified != null" >
modified,
</if>
<if test="powers != null" >
powers,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="postId != null" >
#{postId,jdbcType=INTEGER},
</if>
<if test="postName != null" >
#{postName,jdbcType=VARCHAR},
</if>
<if test="postMsg != null" >
#{postMsg,jdbcType=VARCHAR},
</if>
<if test="postUseState != null" >
#{postUseState,jdbcType=INTEGER},
</if>
<if test="created != null" >
#{created,jdbcType=TIMESTAMP},
</if>
<if test="modified != null" >
#{modified,jdbcType=TIMESTAMP},
</if>
<if test="powers != null" >
#{powers,jdbcType=LONGVARCHAR},
</if>
</trim>
</insert>
Service层部分代码:
@Override
public int insertPost(TbPost post, Map<String, Object> paramMap) {
post.setCreated(new Date());
post.setModified(new Date());
System.out.println("插入前职务id:"+post.getPostId());
int result = postMapper.insertPostReturnPid(post);// 插入成功后返回这条数据的id
System.out.println("插入后职务id:"+post.getPostId());
// 由于插入权限职务表要用到职务id,先插入职务,之后可以直接get到
// 将所选的权限数据插入到职务权限表
paramMap.put("postId", post.getPostId());
paramMap.put("permissionids", post.getPermissionids());
permissionService.insertPostPermission(paramMap);
return result;
}
/**
结果为:
插入前职务id:null
插入后职务id:43
*/
解决方法2:在insert语句内加入<selectKey>标签,详细内容如下
selectKey标签的讲解:【mybatis】认识selectKey
场景:规格与规格选项是一对多,插入规格选项时需要获取被插入的规格ID
<insert id="insert" parameterType="com.study.pojo.TbSpecification">
<!-- 如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 -->
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">
select LAST_INSERT_ID() AS id
</selectKey>
insert into tb_specification (id, spec_name)
values (#{id,jdbcType=BIGINT}, #{specName,jdbcType=VARCHAR})
</insert>
组合实体类Specification(一对多):
package com.study.entity;
import com.study.pojo.TbSpecification;
import com.study.pojo.TbSpecificationOption;
import java.io.Serializable;
import java.util.List;
// json格式的数据 :
// {specification : {"specName":"1","specOptionList" : [{},{}]} }
public class Specification implements Serializable {
private TbSpecification specification;
private List<TbSpecificationOption> specOptionList;
public Specification() {
}
public Specification(TbSpecification specification, List<TbSpecificationOption> specOptionList) {
this.specification = specification;
this.specOptionList = specOptionList;
}
public TbSpecification getSpecification() {
return specification;
}
public void setSpecification(TbSpecification specification) {
this.specification = specification;
}
public List<TbSpecificationOption> getSpecOptionList() {
return specOptionList;
}
public void setSpecOptionList(List<TbSpecificationOption> specOptionList) {
this.specOptionList = specOptionList;
}
}
后端Controller代码:
/**
* 增加
*/
@Override
public void add(Specification specification) {
// 插入规格
specificationMapper.insert(specification.getSpecification());
for (TbSpecificationOption specificationOption : specification.getSpecOptionList()) {
// 获取刚插入的规格的id 对规格选项的specId设置
specificationOption.setSpecId(specification.getSpecification().getId());
specificationOptionMapper.insert(specificationOption);
}
}