Mybatis新增数据并返回主键id的两种方法实现
作者:爱吃蜂蜜的王
我们在开发过程中有时可能会有这样的场景,新增数据并返回新增行的主键id值,这个场景很简单,常规操作是在新增数据成功后,在访问数据库查询一次,这样虽然能解决问题,但是写在业务中感觉怪怪的,其实在Mybatis中,它就考虑到了这个场景,那下面我们就展开讲解哈。
注意:useGeneratedKeys 可以设置全局配置项开启,建议不全局开启,那个地方使用就在那地方手动配置。
keyProperty 属性必须开发者处理,且要么都是基于XML配置,要么都是注解(@Insert+@Options),不能XML与注解混用。
一、常规使用(具有自增主键的数据库)
1、基于配置(XML)
a)在mapper.xml配置中<insert> 标签中添加两个属性。
- useGeneratedKeys:开启返回主键id
- keyProperty:指定主键id值存放属性
b)配置文件详解
<!--新增用户--> <insert id="saveUpdate" useGeneratedKeys="true" keyProperty="id"> insert into d_user(id, user_name, age, gender) values (#{user.id}, #{user.userName}, #{user.age}, #{user.gender}) ON DUPLICATE KEY UPDATE user_name = values(user_name), age = values(age), gender = values(gender) </insert>
c)测试
注意:返回值(keyProperty值)是放入在参数对象的属性中。
可以关注新增数据前id属性未有值。
新增成功后,可以看到对象中的id属性已经返回了数据库的主键id,与数据库的id比对的上。
2、基于注解(annotation)
a)需要添加@Options注解,注解中在配置useGeneratedKeys与keyProperty属性即可。
- useGeneratedKeys:开启返回主键id
- keyProperty:指定主键id值存放属性
b)详细配置
/** * 新增用户 * * @param user 用户信息 */ @Insert("<script>" + " insert into d_user(id, user_name, age, gender)\n" + " values (#{user.id}, #{user.userName}, #{user.age}, #{user.gender})\n" + " ON DUPLICATE KEY UPDATE\n" + " user_name = values(user_name),\n" + " age = values(age),\n" + " gender = values(gender)" + "</script>") @Options(useGeneratedKeys = true, keyProperty = "id") void saveUpdate(@Param("user") User user);
c)测试
注意:返回值(keyProperty值)是放入在参数对象的属性中。
可以看到未操作数据库时,id属性值为空:
新增成功后,已经将结果返回。
二、自定义使用
所谓的自定义使用时Mybatis官方对外提供的一些没有自增主键的数据库而生成的一种方式。例如,Oracle数据库就没有自增情况,所以需要自定义来获取。
注意:keyPropety属性必须采用insert表中的id的别名。具体的可看下面截图。
1、基于配置
a)在mapper.xml配置中<insert> 标签中添加<selectKey>标签。
# mysql <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID(); </selectKey> # oracel <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT 数据表.NEXTVAL; </selectKey>
b)selectKey标签属性讲解
- keyProperty:存放执行SQL的结果属性。
- databaseId:指定数据库id。例如:oracle
- order:执行在insert语句之前还是之后,参数值:AFTER, BEFORE。
- resultType:结果类型。
- statementType:指定SQL语句的类型,默认为STATEMENT,也可以设置为PREPARED。
c)Mysql测试
2、基于注解
a)需要添加@SelectKey注解。
- keyProperty:存放执行SQL的结果属性。
- databaseId:指定数据库id。例如:oracle
- order:执行在insert语句之前还是之后,参数值:AFTER, BEFORE。
- resultType:结果类型。
b)具体配置
@Insert("<script>" + " insert into d_user(id, user_name, age, gender)\n" + " values (#{user.id}, #{user.userName}, #{user.age}, #{user.gender})\n" + " ON DUPLICATE KEY UPDATE\n" + " user_name = values(user_name),\n" + " age = values(age),\n" + " gender = values(gender)" + "</script>") // Mysql配置 @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "user.id", resultType = Integer.class, before = false) // Oracle配置 @SelectKey(statement = "SELECT 数据表.NEXTVAL;", keyProperty = "user.id", resultType = Integer.class, before = false)
c)测试
d)总结
使用@SelectKey注解时,要谨慎,对于keyProperty与before的配合使用需要仔细调试,避免出现问题。
到此这篇关于Mybatis新增数据并返回主键id的实现的文章就介绍到这了,更多相关Mybatis新增数据返回主键id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!