zl程序教程

您现在的位置是:首页 >  后端

当前栏目

5.4 如何在Mybatis中使用insert标签并返回主键id?-- 教你通用做法

mybatis 如何 -- 标签 返回 ID 通用 主键
2023-09-27 14:29:07 时间

CSDN成就一亿技术人



前言

通过 《上文》,我们学会了XML映射文件Mapper的创建,以及最常用的select标签和resultMap标签,本文主要讲解insert标签,用于和insert SQL语句映射,非常简单上手,只有两个点可以扩展讲讲:一个点是insert后返回主键id(会介绍两种方式),另外一个点是实现批量添加,原本打算一文讲完,但由于合在一起篇幅过长,所以后面再讲批量添加,本文会结合实战案例边做边讲,让你彻底玩转Mybatis insert标签,Let’s Go!


一、普通insert

insert 标签用于映射SQL语句中的insert语句

创建非常简单,我们还是以上文的UserMapperUserMapper.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标签的 useGeneratedKeyskeyProperty 两个属性:

<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 对象的字段名
resultTypeselectKey标签内的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标签的 useGeneratedKeyskeyProperty 属性
    • 嵌套selectKey标签(推荐)

最后

那么,已经看到这了,希望得到各位的三连,感谢支持!!!🙏🙏🙏

如果觉得写的不错,期待大家的专栏订阅!后面紧跟着会输出更多干货!

服务端实战SpringBoot+Vue前后端分离项目实战
前端实战Vue + SpringBoot前后端分离项目实战

再次说明: 这个实战专栏是真实战,是真从0到1!用的也是最新最主流的技术。具体的优势、规划、技术选型都可以在《开篇》试读,有详细说明!
高质量专栏,一个专栏足可以让你具备工作实战能力,所以定位上很容易上让你甄别出来这是高质量的!
我们保证会用心持续高质量输出文章,订阅后加我微信,我会对你做针对性指导

另外,别忘了关注:天罡gg ,发布新文不容易错过: https://blog.csdn.net/scm_2008