在想写什么内容的时候,正好看到一个基础面试题上有这个问题,就把它记录下来了。
👨💻面试官:你说Mybatis执行插入语句后可以返回主键ID吗??如果能的话,能否实现一下。
🙋我:当然是可以的,连JDBC都能做到的事情,Mybatis也能做到的。
开始敲代码…
<insert id="insertUser" parameterType="com.crush.mybatisplus.entity.User">
INSERT INTO tb_user (username,password) VALUES(#{username},#{password});
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
解释:
SELECT LAST_INSERT_ID()
返回的是最后一个ID值意思。传入的参数必须为对象,不能为String int 之类的单个参数
order
属性,取值范围BEFORE|AFTER
,指定是在insert语句前还是后执行selectKey
操作。AFTER
一般用于Mysql自增的情况下,BEFORE
一般用于自定义的ID的获取。keyProperty
属性,默认值unset
,用于设置getGeneratedKeys
方法或selectKey
子元素返回值将赋值到领域模型的哪个属性中,也就是你实体类中,对应数据库的主键id。impl
层controller
层,直接实体类.getId() 即可获取本次插入后的主键ID,返回前端即可。如:
@Override
public Long insert(User user) {
return userMapper.insertUser(user)>0?user.getId():null;
}
<insert id="insertUser2" parameterType="com.crush.mybatisplus.entity.User">
<selectKey keyProperty="id" order="BEFORE" resultType="String">
select uuid()
</selectKey>
INSERT INTO tb_user (id,username,password) VALUES(#{id},#{username},#{password});
</insert>
结果和上文是一样的。
👨💻面试官:那你会用Mybatis-Plus吗?Mybatis-Plus如何做这件事情啊,有简单的方式吗?
🙋我:还好学过,正好能回答这个问题。
一步一步道来:
可以直接使用Mybatis-Plus
的sava
方法,或者mapper
层的insert
方法,它都会将返回的结果自动填充进你映射的的实体类。从而可以直接获取到你的数据。
@PostMapping("/add3")
public Object add3(@RequestBody User user){
return tbUserService.save(user)==true?user.getId():"插入失败";
}
我们还可以直接将User打印出来看一下:
@PostMapping("/add3")
public Object add3(@RequestBody User user){
tbUserService.save(user);
System.out.println("执行完插入后的User:"+user);
return user.getId();
}
执行完插入后的User:User(id=890909294458048512, username=123456, password=123456, deleted=0, createTime=2021-09-24T10:35:36.873908700, updateTime=2021-09-24T10:35:36.873908700)
还可以使用注解方式,不过注解的那种就是将上文Mybatis中的第二种方法搬到注解上去了。
@Insert(value = "INSERT INTO t_XXXX" +
"XXX,XXX,XXX " +
"VALUES (XXX,XXX,XXX)")
@SelectKey(statement="select LAST_INSERT_ID()",keyProperty = "id",before = false,resultType = Long.class)
Integer testInsert1(MessageMould messageMould);
本文就是简单介绍了,具体使用具体情况具体分析啦。
你好,我是博主
宁在春
:主页 希望本篇文章能让你感到有所收获!!! 祝我们:待别日相见时,都已有所成
。