### 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位小数