mybatis设置主键自增,报错: No setter found for the keyProperty
在xml中的sql语句:
<insert id="registerReader" parameterType="com.by.tsgl.bean.Reader" useGeneratedKeys="true" keyProperty="reader_id">
insert into reader(deposit_num,borrowing_num,reader_state,grade_id,user_id)
values(0,0,"正常",1,#{user_id});
</insert>
测试时报错
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.executor.ExecutorException: No setter found for the keyProperty 'reader_id' in 'java.lang.String'.
解决方法
去除insert标签中的keyProperty属性
改为:
<insert id="registerReader" parameterType="com.by.tsgl.bean.Reader" useGeneratedKeys="true">
原因分析
-
keyProperty中对应的值是实体类的属性,而不是数据库的字段。
-
数据库中已经设置主键自增的字段只需配置useGeneratedKeys属性即可
-
useGeneratedKeys=“true” keyProperty=“id”
useGeneratedKeys设置为 true 时,表示如果插入的表id以自增列为主键,则允许 JDBC 支持自动生成主键, -
keyProperty=“id”
可将自动生成的主键id返回传入对象的id中。由于我们传入的对象没有id这个字段,也就自然没有它的set方法,因而会报错。 -
如果插入的表中没有主键怎么办?
- 可以用属性
keyColumn
<insert id="registerReader" parameterType="com.by.tsgl.bean.Reader" useGeneratedKeys=true keyProperty="userId" keyColumn="user_id">
这个注解的意思就是,使用数据库自动增长的主键,并从table中user_id字段里面把数据放到传入对象的成员变量userId里面。
如果我们已经在数据库表中指定了主键,那么keyColumn属性可以缺省。
- 可以用属性
下面的内容来自mybatis文档
useGeneratedKeys
(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的getGeneratedKeys
方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
keyProperty
(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用getGeneratedKeys
的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。