学习mybatis遇到的报错问题

129 阅读2分钟
### Error querying database.  Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'empName' from result set.  Cause: java.sql.SQLDataException: Cannot determine value type from string 'tom'
### The error may exist in mappers/EmployeeMapper.xml
### The error may involve com.atguigu.mapper.EmployeeMapper.queryById
### The error occurred while handling results
### SQL: select emp_id empId,emp_name empName, emp_salary empSalary         from t_emp where emp_id=?
### Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'empName' from result set.  Cause: java.sql.SQLDataException: Cannot determine value type from string 'tom'

原因是我在Employee类中自己定义了一个含参构造函数,导致mybatis找不到默认函数来处理

. MyBatis 的默认对象创建与属性映射机制

  • 无参构造函数与属性映射:。当 MyBatis 从数据库查询结果集并映射到 Employee 对象时,它会先使用无参构造函数创建对象实例,然后通过反射调用对象的 setter 方法将结果集中的字段值赋给对象的对应属性。例如,对于 empName 字段,MyBatis 会调用 setEmpName 方法来设置值。

2. 自定义构造函数带来的影响

  • 构造函数参数匹配问题:当你添加了自定义的构造函数 public Employee(String empName, Double empSalary) 后,Java 就不会再提供默认的无参构造函数。MyBatis 在处理结果集映射时,会尝试根据构造函数的参数列表来匹配结果集中的字段值。在这种情况下,MyBatis 会尝试使用这个构造函数来创建 Employee 对象,并且要求结果集中的字段名与构造函数的参数名一致。
  • 参数类型不匹配问题:在你的错误信息中,MyBatis 尝试将 empName 字段的值(字符串 'tom')转换为 Double 类型,这表明 MyBatis 在匹配构造函数参数时出现了混乱,可能是因为它没有正确识别参数类型,或者在寻找匹配的字段值时出现了错误。MyBatis 可能会将 empName 字段的值错误地传递给期望为 Double 类型的参数,从而导致 java.sql.SQLDataException 异常。

最后的手动添加了一个默认构造函数解决了报错问题

public Employee(){

}

另外注意点

在数据库中定义列的数据类型时,DOUBLE(M,D) 表示这是一个浮点数类型的列,其中:

  • M 是数字的总位数(包括整数部分和小数部分的位数)。
  • D 是小数点后面的位数。

在你的例子中,DOUBLE(10,5) 意味着这列可以存储最多10位数的浮点数,其中有5位是小数位。例如,数值 123.45678 可以存储在这种类型的列中,因为它总共有8位数字(3个整数位和5个小数位),符合最大位数限制。 即使你用123.4,因为设置了五位小数,它会自动增加在123.4后面补充4位小数