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

本文主要是介绍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 指定可能就足够了。

这篇关于mybatis用map接收返回对象,不想让数据类型为tinyint自动转换为boolean,如何处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020917

相关文章

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.