mybatis用map接收返回对象,不想让数据类型为tinyint自动转换为boolean,如何处理

在 MyBatis 中,当使用 Map 来接收查询结果时,MyBatis 会根据列的数据类型自动选择合适的 Java 类型来映射这些值。默认情况下,如果数据库列是 TINYINT(1),MyBatis 可能会错误地将其映射为 boolean,因为它经常被误解为只能存储 0 或 1,并且用于表示真/假值。然而,正如前面提到的,TINYINT 实际上是一个整数类型,应该映射为 Integer

为了避免 TINYINT 被自动转换为 boolean,你可以采取以下措施:

1. 使用 resultType 指定结果类型

如果你正在使用注解来配置你的 Mapper 接口,你可以使用 @Select 注解,并指定 resultType 为 Map<String, Object>。这将确保 MyBatis 不会尝试对 TINYINT 进行特殊的布尔类型映射。


  
java@Select("SELECT * FROM your_table WHERE id = #{id}")
Map<String, Object> selectById(int id);

2. 使用 resultMap 并明确指定 javaType

如果你使用的是 XML 配置文件,你可以创建一个 resultMap,并在其中明确指定 TINYINT 列应该映射为 java.lang.Integer 类型。


  
xml<resultMap id="yourResultMap" type="java.util.HashMap">
<result column="your_tinyint_column" property="yourTinyIntColumn" javaType="java.lang.Integer"/>
<!-- 其他 result 配置 -->
</resultMap>

<select id="selectById" resultMap="yourResultMap">
SELECT * FROM your_table WHERE id = #{id}
</select>

在这个配置中,javaType="java.lang.Integer" 明确告诉 MyBatis 将 your_tinyint_column 列映射为 Integer 类型。

3. 使用 typeHandler

如果上述方法仍然不能解决问题,你可以考虑自定义一个 TypeHandler 来处理 TINYINT 到 Integer 的映射。尽管这通常用于更复杂的类型转换场景,但它也可以用于覆盖 MyBatis 的默认行为。


  
javapublic class TinyIntTypeHandler extends BaseTypeHandler<Integer> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Integer parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter);
}

@Override
public Integer getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getInt(columnName);
}

@Override
public Integer getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getInt(columnIndex);
}

@Override
public Integer getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getInt(columnIndex);
}
}

然后,在你的 MyBatis 配置文件中注册这个 TypeHandler


  
xml<typeHandlers>
<typeHandler handler="com.yourpackage.TinyIntTypeHandler"/>
</typeHandlers>

或者在 Mapper XML 文件中指定:


  
xml<result column="your_tinyint_column" property="yourTinyIntColumn" typeHandler="com.yourpackage.TinyIntTypeHandler"/>

4. 检查 MyBatis 版本和数据库驱动

确保你使用的 MyBatis 版本没有已知的与此问题相关的 bug。同时,检查你的数据库驱动是否是最新版本,有时候驱动的问题也可能导致类型映射不正确。

注意事项

  • 在处理 TINYINT 类型的列时,始终要记得检查数据库中的实际数据类型和值,以确保它们符合你的期望。
  • 如果你在多个地方使用 TINYINT,并且希望全局改变其映射行为,使用自定义 TypeHandler 可能是最好的选择。如果只是偶尔需要改变映射,使用 resultMap 和 javaType 指定可能就足够了。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 19:40:11       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 19:40:11       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 19:40:11       82 阅读
  4. Python语言-面向对象

    2024-06-05 19:40:11       91 阅读

热门阅读

  1. WebSocket 断网重连、心跳检测功能封装

    2024-06-05 19:40:11       29 阅读
  2. xjoi题库一级八段题解(c语言版)

    2024-06-05 19:40:11       30 阅读
  3. 数据库到服务器提权

    2024-06-05 19:40:11       31 阅读
  4. 【C language】两个数的交换

    2024-06-05 19:40:11       25 阅读
  5. ML307R OpenCPU UDP使用

    2024-06-05 19:40:11       32 阅读
  6. 华为欧拉 EulerOS V2.0 SP5 一键安装 Oracle 19C 单机

    2024-06-05 19:40:11       32 阅读
  7. 代码随想录算法训练营第20天|二叉树

    2024-06-05 19:40:11       29 阅读
  8. ORACLE 查询SQL优化

    2024-06-05 19:40:11       31 阅读
  9. 在Spring Boot中集成H2数据库:完整指南

    2024-06-05 19:40:11       28 阅读
  10. 注册windows系统服务

    2024-06-05 19:40:11       26 阅读
  11. [蓝桥杯 2021 省 AB2] 负载均衡

    2024-06-05 19:40:11       26 阅读