Ibatis的resultMap报错Could not find result map java.lang.Integer

博主在使用MyBatis时遇到代码全面报错的问题,经过排查发现是由于resultMap配置错误导致。在UserMapper.xml文件中,所有resultMap被设置为相同的BaseResultMap,进一步检查发现是resultType属性配置不正确。通过修改<select>标签中的resultType为java.lang.Integer,问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我觉得我一直比较心细,但是今天这个问题确实让我很头大...

ibatis一直在报错,不仅如此,所有的代码全都报错了!!

昨天还好好的代码,为啥都报错?我找了很久,根据提示应该是我这个resultMap里边类型不对。但我在对应的UserMapper.xml中找了,出现resultMap配置的错误!!所有的resultMap都是   resultMap="BaseResultMap"(已经把所有的其他的sql全部注释了)但任然没有解决问题..

想了很久,没有一点头绪,不过usermapper.xml没错,那么一定是其他的xml错了??如果错了,那应该是resultmap错了吧?!所以用了ctrl+h 来搜索了一下错误的。就像下图:

 

看吧! 这里配置错了,正确的应该是resultType=“java.lang.Integer”!!

  <select id="countByRoleName" parameterType="com.inclination.scaffold.infrastraction.repository.po.Role" resultType="java.lang.Integer">
     select count(*) from role where rolename=#{rolename,jdbcType=VARCHAR}
  </select>

 

现在看一下demo的运行结果吧。

这下好了 ,虽然这是手误,但是一定要注意。以后真的不要再犯这种低级的错误了。

### SQL 查询中 `ClassCastException` 的原因分析 当遇到错误提示 `java.lang.String cannot be cast to java.lang.Integer` 时,表明应用程序试图将字符串类型的对象强制转换为整数类型。这种异常通常发生在数据处理过程中,特别是在数据库查询结果被映射到 Java 对象时。 #### 数据库字段与实体类属性不匹配 如果数据库中的某个字段存储的是字符串形式的数据(例如 `'1'`, `'abc'`),但在对应的 Java 实体类中定义为 `Integer` 类型,则在执行查询并尝试将该字段赋值给实体类属性时会抛出此异常[^1]。 ```sql -- 假设有一个表 t_user, 其中 age 字段实际存有 '25', 而不是数值 25. SELECT * FROM t_user WHERE id = ? ``` 对于上述情况,在获取记录后将其映射至 User.java 中: ```java public class User { private Integer age; // 应用程序期望这里接收 int 或者 Integer 类型 } ``` 此时就会发生类型转换失败的情况。 ### 解决方案 为了有效解决此类问题,可以采取以下措施之一或者组合使用这些方法来确保正确性和稳定性。 #### 方法一:调整数据库设计 最根本的办法是从源头解决问题——即修改数据库结构使得各列的数据类型与其所代表的意义相吻合。比如把原本保存年龄信息却用了 VARCHAR(255) 这样的字符型改为 TINYINT/SMALLINT/MEDIUMINT/BIGINT 等适合表示数字范围内的合适类型[^2]。 #### 方法二:自定义类型处理器 另一种方式是在应用层面上通过编写自定义的 TypeHandler 来实现更灵活地控制如何解析来自 JDBC 驱动返回的结果集。MyBatis 提供了这样的机制让用户能够指定特定情况下应该如何完成从 ResultSet 到目标 POJO 属性之间的转换逻辑。 ```xml <!-- mybatis-config.xml --> <typeHandlers> <typeHandler handler="com.example.MyCustomTypeHandler"/> </typeHandlers> ``` 以及相应的 Java 文件: ```java package com.example; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class MyCustomTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { try { ps.setInt(i, Integer.parseInt(parameter)); } catch (NumberFormatException e) { throw new RuntimeException("Failed to convert string '" + parameter + "' into integer.", e); } } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return String.valueOf(rs.getInt(columnName)); } @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return String.valueOf(rs.getInt(columnIndex)); } @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return String.valueOf(cs.getInt(columnIndex)); } } ``` 这种方法允许开发者针对具体场景定制化处理流程而不必改变底层架构。 #### 方法三:验证输入合法性 无论何时都应该对外部传入参数做必要的校验工作以防止非法值进入系统内部引发不必要的麻烦。可以通过正则表达式或者其他手段确认待操作项确实满足预期格式后再继续后续动作;另外也可以考虑利用框架自带的功能简化这部分开发成本,如 Spring Validation 注解等工具可以帮助快速构建起一套完整的约束体系[^3]。 ### 总结 综上所述,面对 `java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer` 错误,应该先定位其产生的根源在于哪一层级出现了不当的操作行为,再依据实际情况选用合适的策略加以应对。无论是优化数据库模式还是增强业务代码健壮性都是可行的选择方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值