插入一条数据后获取这条新数据自动生成的id值

问题:插入一条数据,如何获取这条新数据自动生成的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);
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值