Mybatis中如何获取自增主键

Mybatis中如何获取自增主键

前言

在实际项目开发中,经常有这样的需求,即在插入一条数据后需要获取该条记录的主键这就涉及到主键的生成策略问题了;

  1. 在一个单系统中常见的方法M是设置表中主键为自动递增,每次插入后,mybatis会将自动生成的主键赋值给指定的实体类字段
  2. 在分布式系统中,则需要生成全局唯一主键ID

方案1又根据数据库是否支持自动生成主键分为2中情况:

  • 若数据库支持自动生成主键的字段(比如 MySQL和 SQL Server),则可以设置useGeneratedKeys=”true”,然后再把keyProperty 设置到目标属性上
  • 对于不支持自增型主键的数据库(例如Oracle),则要先通过序列来模拟自增,每次插入数据前先从序列中拿到自增ID

方案1的局限性很大、不利于项目后期扩展,实际开发中不推荐使用;

方案2无论是单例项目还是分布式项目都适用;

本文基于mysql数据库分上下两篇,分别对方案1 和方案2进行介绍

1.修改代码

在上篇文章代码的基础上,我们对项目做如下修改

DepartmentMapper.java中新增insertAutoId接口

int insertAutoId(Department record);

DepartmentMapper.xml中接口对应sql如下

  <insert id="insertAutoId" useGeneratedKeys="true" keyProperty="id" parameterType="com.wg.demo.po.Department">
    insert into department (dept_name, descr,create_time)
    values ( #{deptName,jdbcType=VARCHAR}, #{descr,jdbcType=VARCHAR},
      #{createTime,jdbcType=TIMESTAMP})
  </insert>

useGeneratedKeys设置为true后,mybatis会使用JDBC的getGeneratedkeys方法获取由数据库内部自动生成的主键,并将该值赋值给由keyProperty指定的字段;

新建DepartmentService.java

@Service
public class DepartmentService {
    @Autowired
    private DepartmentMapper departmentMapper;

    public int insertDept(Department department)
    {
        return departmentMapper.insertAutoId(department);
    }
}

新建DepartmentController.java

@Api(description = "department")
@RestController
@RequestMapping("dept")
public class DepartmentController {
    @Autowired
    public DepartmentService departmentService;

    @ApiOperation(value = "新增部门")
    @PostMapping("new")
    public ResultMsg newDepartment(@RequestBody Department department)
    {
        departmentService.insertDept(department);
        return ResultMsg.getMsg(department);
    }
}

2.设置表主键为自动递增

最后一定要将数据库department表的主键设置为自动递增,否则会报java.sql.SQLException: Field ‘id’ doesn’t have a default value异常

设置方法如下:

3.测试

返回结果如下,自增主键为27


项目地址

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值