事情情景
在做一个插入操作的时候,总是报一个主键重复或者字段不能为空的错误:
原因
在A.mapper中的insert语句中,使用了useGeneratedKeys,keyProperty属性,那这两个属性是干什么用的呢?
useGeneratedKeys=true表示使用数据库自动增长的主键
keyProperty设置自增主键返回字段(用户在插入数据之后获取相应主键)
作用
知道了这两个属性是做什么的,那起到什么作用了呢?
作用: 完成不需要输入主键也能插入数据了,而且只适用于insert语句
解决方法
知道了是什么原因造成了这个问题,那么接下来就好解决了。
首先先检查了数据库中这个id字段有没有设置为自增长和非空
然后又去与A.mapper相关联的另一个B.mapper中查看相应的插入语句有没有设置这两个属性,果然没写,写上之后完美解决问题。
<insert id="insertSelective" parameterType="com.***.UserPasswordDO" keyProperty="id" useGeneratedKeys="true">
规则
1、我们使用keyProperty属性指定id为主键字段,同时使用useGeneratedKeys属性告诉MyBatis这个主键是否使用数据库的内置规则生成。
2、在数据库中设置id的自增规则
拓展
在使用keyProperty的时候,发现竟然还有个类似的属性:keyColumn,那么他是干什么用的呢?
keyColumn用于指定数据库table中的主键
也就是说这是三个属性同时使用时,则可以使用数据库中自增长的主键,并且可以将主键的值返回给keyProperty中写好的字段
总结:
useGeneratedKeys 设置为"true"表明要 MyBatis 获取由数据库自动生成的主键;
keyProperty="id"指定把获取到的主键值注入到 Student(实体类) 的 id 属性。
keyColumn是数据库中主键名,如果数据库主键名和实体类字段名都规范,可以不用keyColumn