mybatis设置主键自增,报错: No setter found for the keyProperty

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">

原因分析

  1. keyProperty中对应的值是实体类的属性,而不是数据库的字段。

  2. 数据库中已经设置主键自增的字段只需配置useGeneratedKeys属性即可

  3. useGeneratedKeys=“true” keyProperty=“id”
    useGeneratedKeys设置为 true 时,表示如果插入的表id以自增列为主键,则允许 JDBC 支持自动生成主键,

  4. keyProperty=“id”可将自动生成的主键id返回传入对象的id中。由于我们传入的对象没有id这个字段,也就自然没有它的set方法,因而会报错。

  5. 如果插入的表中没有主键怎么办?

    1. 可以用属性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)。如果生成列不止一个,可以用逗号分隔多个属性名称。

部分参考自

你可能感兴趣的:(mybatis,java,spring)