MyBatis插入返回Account类型报错问题咨询
解决MyBatis新增账户时的返回类型报错与主键自增配置问题
嘿,刚看到你的问题,这两个点我帮你梳理清楚!
一、搞定返回类型报错问题
你碰到的这个报错,核心原因是MyBatis里@Insert注解修饰的方法,默认返回的是受影响的行数(int类型),但你把方法返回类型定义成了Account实体类,这不符合MyBatis的规则,所以才会抛出“不支持的返回类型”错误。
正确的处理办法很简单:
- 把
AccountMapper里createAccount方法的返回值改成int或者void就行 - 你已经配置了
@Options(useGeneratedKeys=true, keyProperty = "id", keyColumn="id"),MyBatis会自动把数据库生成的主键值注入到你传入的Account对象的id属性里。所以调用方法之后,直接用你传进去的那个Account对象就能拿到自动生成的id。
修改后的Mapper代码:
public interface AccountMapper { @Select("SELECT * FROM ACCOUNT WHERE id = #{id}") Account getAccount(@Param("id") Long id); @Options(useGeneratedKeys=true, keyProperty = "id", keyColumn="id") @Insert("INSERT INTO ACCOUNT(customerId,country) values (#{customerId},#{country})") int createAccount(Account account); // 这里改成int或者void都可以 }
举个调用的例子(假设你已经通过SqlSession拿到了mapper实例):
Account newAccount = new Account(); newAccount.setCustomerId(123L); newAccount.setCountry("CN"); // 调用插入方法,返回值是受影响的行数 int affectedRows = mapper.createAccount(newAccount); // 此时newAccount的id已经被MyBatis填充好了 System.out.println("自动生成的账户ID:" + newAccount.getId());
二、确认id自增配置是否正确
你的表结构里id INTEGER NOT NULL GENERATED always as identity这个配置是完全正确的,这是符合SQL标准的主键自增定义,适用于H2、PostgreSQL、DB2这类支持IDENTITY列的数据库。不过有几个小细节要注意:
- 确保你用的数据库驱动支持IDENTITY列的主键生成逻辑,比如PostgreSQL的官方驱动是完全支持的
- 实体类里
@Id注解标注在id属性上是正确的,MyBatis会识别这个属性作为主键字段 - 要是你用的是MySQL,那表结构得改成
id INT AUTO_INCREMENT PRIMARY KEY,但从你当前的表结构来看,用的是IDENTITY语法,只要对应数据库支持就没问题。
另外你配置的@Options注解参数也是对的:
useGeneratedKeys=true:告诉MyBatis要去获取数据库自动生成的主键值keyProperty="id":指定把主键值注入到传入对象的id属性中keyColumn="id":指定数据库表中的主键列名(如果实体属性名和列名一致,其实可以省略,但写上更清晰,避免歧义)
内容的提问来源于stack exchange,提问作者artjom prozorov
相关产品推荐
相关产品推荐

