5.4 如何在Mybatis中使用insert标签并返回主键id?-- 教你通用做法
本文目录
前言
通过 《上文》,我们学会了XML映射文件Mapper的创建,以及最常用的select标签和resultMap标签,本文主要讲解insert标签,用于和insert SQL语句映射,非常简单上手,只有两个点可以扩展讲讲:一个点是insert后返回主键id(会介绍两种方式),另外一个点是实现批量添加,原本打算一文讲完,但由于合在一起篇幅过长,所以后面再讲批量添加,本文会结合实战案例边做边讲,让你彻底玩转Mybatis insert标签,Let’s Go!
一、普通insert
insert 标签用于映射SQL语句中的insert语句
创建非常简单,我们还是以上文的UserMapper
和UserMapper.xml
为例.
① 在UserMapper接口中新增insert方法
Integer insert(User user);
② 通过上文安装的MybatisX插件生成insert标签
点击后,在UserMapper.xml中生成如下(不用插件生成的话,自己手写也是一样的):
<insert id="insert"></insert>
说明:
和select标签一样,通过唯一的 id 与接口方法关联。
③ 写insert SQL 语句
然后编写对应的insert SQL语句,如下:
<insert id="insert">
insert into user(id, user_name, password, role, gmt_create, gmt_modified)
values (#{userId},#{userName},#{password},#{role},#{gmtCreate},#{gmtModified})
</insert>
说明:
我们在前面用过#{xxx}占位符,获取的是@Param设置的参数值,但这里并没有加@Param注解,是因为当方法参数只有一个且是PO对象时,通过#{xxx}就可以取到这个PO的xxx字段值! 例如,这里#{userName}取的就是参数user.userName
这样就实现了普通的Mybatis insert标签,非常Easy,对应的PO是User类:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
private Integer userId;
private String userName;
private String password;
private Integer role;
private Date gmtCreate;
private Date gmtModified;
}
二、insert返回自增主键id
可能有的小伙伴已经看出来了,MySQL数据库支持自增主键,user表id也设置的自增主键,所以并不需要传id!
实际上,大多数情况下,我们都不会在插入时指定 id 的值,而是通过数据库自动去生成。
修改SQL将插入id去掉:
<insert id="insert">
insert into user(user_name, password, role, gmt_create, gmt_modified)
values (#{userName},#{password},#{role},#{gmtCreate},#{gmtModified})
</insert>
接下来是重点: 如何获取到插入后的自增的主键id呢?
方式一
设置insert标签的 useGeneratedKeys
和 keyProperty
两个属性:
<insert id="insert" useGeneratedKeys="true" keyProperty="userId">
insert into user(user_name, password, role, gmt_create, gmt_modified)
values (#{userName},#{password},#{role},#{gmtCreate},#{gmtModified})
</insert>
说明:
keyProperty的值:对应参数User的字段名,这样当insert成功后,User.userId字段就会自动被设置自增id值。
方式二
如果像Oracle等数据库不支持主键自增,又该怎么做呢?
这时,Mybatis提供了selectKey标签通过 SQL 语句获得主键,这个更通用,所以更常用!
<insert id="insert" >
<selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(user_name, password, role, gmt_create, gmt_modified)
values (#{userName},#{password},#{role},#{gmtCreate},#{gmtModified})
</insert>
在5.2 Mybatis快速入门,轻松学会常用12种注解开发 我们讲过@Insert + @SelectKey注解,其实注解和xml的实现异曲同工!
selectKey 中的SELECT LAST_INSERT_ID()
是获取自增id的SQL 语句,这个和@SelectKey注解使用的是相同的SQL语句!
selectKey标签属性说明:
属性 | 描述 |
---|---|
keyProperty | 对应Java 对象的字段名 |
resultType | selectKey标签内的sql查询返回的类型 |
order | 执行的顺序,在 insert 之前调用为 BEFORE,之后调用为 AFTER |
实战注册接口
既然已经实现了对user表的insert操作,那么我们必须顺势实现一个简易的注册接口!
这个接口我相信大家自己应该能写出来,至少能看懂,所以我就不多说了,如果看不懂, 请复习一下这篇有巨详细的说明:2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包
① AuthController定义API接口
新增一个Post请求的方法:
@PostMapping("/register")
public TgResult<Integer> register(@RequestBody LoginVO loginVO){
Integer id = authService.register(loginVO.getUserName(), loginVO.getPassword());
return TgResult.ok(id);
}
② AuthService
Integer register(String userName, String password);
对应AuthServiceImpl的实现:
@Override
public Integer register(String userName, String password) {
User user = new User();
user.setUserName(userName);
user.setPassword(password);
// 角色(0-学生 1-管理员)
user.setRole(0);
user.setGmtCreate(new Date());
userMapper.insert(user);
return user.getUserId();
}
③ 拦截器
在InterceptorConfig中排除注册接口,不用登录就可以访问!其中excludePathPatterns的参数是可变长度的参数列表。
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**")
// 排除的请求路径
.excludePathPatterns("/auth/login", "/auth/register");
④ Postman请求测试
正如我们期望的,正确返回了MySQL插入后生成的自增id为2 👏👏👏
查看MySQL的user表数据,也和我们期望的一致,生成的是id为2的一行数据 👏👏👏
⑤ 提交Git
总结
通过Mybatis实现一个数据库插入方法,简单来说,步骤如下:
- 创建接口对应的xml映射文件
- 创建插入方法对应的insert标签
- 写插入insert语句SQL
- 获取自增id有两种方式
- 设置insert标签的
useGeneratedKeys
和keyProperty
属性 - 嵌套
selectKey
标签(推荐)
- 设置insert标签的
最后
那么,已经看到这了,希望得到各位的三连,感谢支持!!!🙏🙏🙏
如果觉得写的不错,期待大家的专栏订阅!后面紧跟着会输出更多干货!
服务端实战 :SpringBoot+Vue前后端分离项目实战
前端实战 :Vue + SpringBoot前后端分离项目实战
再次说明: 这个实战专栏是真实战,是真从0到1!用的也是最新最主流的技术。具体的优势、规划、技术选型都可以在《开篇》试读,有详细说明!
高质量专栏,一个专栏足可以让你具备工作实战能力,所以定位上很容易上让你甄别出来这是高质量的!
我们保证会用心持续高质量输出文章,订阅后加我微信,我会对你做针对性指导!
另外,别忘了关注:天罡gg ,发布新文不容易错过: https://blog.csdn.net/scm_2008
相关文章
- [MyBatis]一级缓存/二级缓存/三方缓存
- 适合新手的12个Mybatis-Plus常用注解
- Mybaits 源码解析 (十二)----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?
- Spring Boot(六):如何优雅的使用 Mybatis
- Mybatis/Ibatis,数据库操作的返回值
- mybatis-generator自动生成
- 浅谈 Mybatis中的 ${ } 和 #{ }的区别
- MyBatis中如何一次执行多条语句(使用mysql数据库)
- mybatis由浅入深day02_4多对多查询_多对多查询总结
- MyBatis系列(六):MyBatis动态Sql之if标签的用法
- 如何在Eclipse中搭建MyBatis基本开发环境?(使用Eclipse创建Maven项目)
- 面渣逆袭(MyBatis八股文面试题)必看👍
- mybatis实现一对多的关系
- JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
- 如何创建MyBatis的工具类
- mysql 存储过程,以及mybatis如何调用
- mybatis如何遍历Map的key和value【增删改查】
- 如何使用MyBatis-Plus实现字段的自动填充?(若不会,我便手把手教你)
- Intellij IDEA Mybatis plugin插件破解安装