Mybatis 实时获取到数据库的自增id
前言
在日常业务处理中,我们难免需要立马用到刚刚插入数据库数据的id,如果我们的id并不是我们插入的(例如uuid,雪花算法得到的等),而是数据库自增的,我们便无法得知次id是多少,如果我们再次查询数据库来获取该id,属实是写复杂了,并且还再次访问了数据库,有些多此一举,但mybatis给我们提供了一种方法以便我们来获取到该id,接下来就让我们来一探究竟吧
业务复现
现在我们有一张用户表,一张角色表,一张用户角色中间表,我们需要新建用户的时候给用户赋予角色,这个时候便需要在用户表插入数据时获取到该用户的id
我们正常来写的话代码如下:
(简单复现一下代码)
实现类
@Override
public void insertUserDept(User user) {
System.out.println(user);
userMapper.insertUserDept(user);
System.out.println(user);
//给用户角色中间表添加角色
insertDept(user);
}
private void insertDept(User user) {
UserDept userDept = new UserDept();
userDept.setDeptId(user.getDeptId());
userDept.setUserId(user.getId());
userDeptMapper.insertDept(userDept);
}
user.xml
<insert id="insertUserDept">
insert into user (name)
values (#{user.name})
</insert>
userDept.xml
<insert id="insertDept">
insert into dept (dept_id,user_id) values (#{deptId},#{userId})
</insert>
这样子写会有报错,提示我们userId不能为空,这就说明我们无法获取到新加入用户的id
解决方案
在user.xml加入两个参数
useGeneratedKeys
keyProperty
useGeneratedKeys:允许JDBC支持自动生成主键
keyProperty:主键字段
user.xml
<insert id="insertUserDept" useGeneratedKeys="true" keyProperty="id">
insert into user (name)
values (#{user.name})
</insert>
这时,我们看到成功拿到了刚加入数据的id
注意:
如果还是没拿到,可能是yaml的mybatis配置问题,以下是我的配置
# Mybatis配置
mybatis:
# 配置XML映射文件中指定的实体类别名路径
type-aliases-package: com.example.demo.domain
# 配置MyBatis的xml配置文件路径
mapper-locations: classpath:mapper/*.xml
# 开启驼峰userName自动映射到user_name
map-underscore-to-camel-case: true
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 楠笙
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
音乐天地