Mybatis Generator将tinyint映射成Integer的解决办法

2024-08-27 15:38

本文主要是介绍Mybatis Generator将tinyint映射成Integer的解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境

Java:1.8+
mybatis:3.3.0
mybatis-generator-core:1.3.5

前言

今天遇到了这么一个错误:

TicketMonitorServiceImpl.personMonitorPage.error org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'TINYINT'.  Cause: java.lang.ClassNotFoundException: Cannot find class: TINYINTat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:368)at com.sun.proxy.$Proxy104.selectList(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:198)at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)at com.sun.proxy.$Proxy181.selectPartUserIdByQO(Unknown Source)

也就是说,不能识别或者找到TINYINT; 我的dao层代码是用生成工具生成出来的;
字段 is_accept java类型是Byte, jdbcType类型是TINYINT;
刚开始,我以为是不能使用jdbcType:TINYINT,javaType:Byte这套组合.所以就想着换成Integer类型。
实际上,之所以报错的原因是:其实是我在XXXMapper.xml文件中写错了类型:

# 错误的写法
is_accept = #{accept,javaType=TINYINT}
# 正确应该是
is_accept = #{accept,jdbcType=TINYINT}

不过,既然遇到了,所以就顺道研究了下:1. tinyint如何转Integer的问题?2. tinyint(1)为什么又会转为Boolean?

将tinyint映射成Integer

先来看看MySQL的官方文档:

Java, JDBC and MySQL Types

下面这张图,是说,MySQL的数据类型,可能转为Java的类型有哪些~
在这里插入图片描述
这张图,是明细图,就明确的告诉你,MySQL的数据类型,一定会传为Java的哪个类型~
在这里插入图片描述
我们看到标红的地方,翻译过来就是:当字符类型为tinyint且长度为 1 时,会被转换成布尔类型。如果tinyInt1isBit取false时,则转Integer。

实际你会发现,即使设置了tinyInt1isBit=false,依然不会转Integer;
其实是因为mybatis,在tinyint(1)的情况下,映射成BIT
即:<result column="deleted" property="deleted" jdbcType="BIT" />
因为映射成了BIT类型,所以使用tinyInt1isBit=false参数当然不会起作用。
解法,看后面的tinyint(1) mybatis会生成jdbcType=BIT,导致转Integer失败的解法

解决tinyint转Integer的方法有两种:

方法一:继承插件接口JavaTypeResolverDefaultImpl

mybatis官方文档
在这里插入图片描述
在配置文件中有一个 <javaTypeResolver> 标签可以用来配置映射关系。而该标签有一个 type 属性。上图中的英文翻译过来就是:用户可以提供一个自定义的实现,该类必须实现JavaTypeResolver接口,且必须有一个共有的默认构造器,或者沿用默认值DEFAULT,将使用JavaTypeResolverDefaultImpl来进行映射;

package com.sgy;import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl;import java.sql.Types;public class TinyIntJavaTypeResolver extends JavaTypeResolverDefaultImpl {public TinyIntJavaTypeResolver() {super();typeMap.put(Types.TINYINT, new JavaTypeResolverDefaultImpl.JdbcTypeInformation("TINYINT", new FullyQualifiedJavaType(Integer.class.getName())));}
}

因为我们实际项目开发中,使用的generator是以Maven插件的形式集成到项目中的,插件启动的时候并不会加载我项目中的类文件。故会报类无法加载的错误。解决方法就是将该类的依赖,添加到插件的依赖中。

pom.xml文件中,添加模块依赖。

<plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><dependencies><!--重点这里,将类所在的模块,引入进来,因为是本项目,所以排除掉全部的传递依赖--><!--重点这里,因为我的类TinyIntJavaTypeResolver写在server层,所以只添加server的依赖--><!--重点这里,即:yutao-server--><dependency><groupId>com.sgy</groupId><artifactId>yutao-server</artifactId><version>1.0.1-SNAPSHOT</version><exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency></dependencies><configuration><verbose>true</verbose><overwrite>true</overwrite><configurationFile>${basedir}/src/main/resources/mybatis_generator/generatorConfig-yt.xml</configurationFile></configuration>
</plugin>

接着在generatorConfig.xml文件中:

... ...
<!-- 数据库链接URL、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/misstest"userId="root" password="rootroot">
</jdbcConnection>
<javaTypeResolver type="me.ele.bi.woos.utils.TinyIntJavaTypeResolver"><property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
... ...

自此,完毕,现在生成的代码就是可以将 tinyint映射成Integer的。

但是这种方式,对于tinyint(1)的情况是不行的,因为tinyint(1)的情况,在mybatis中,jdbcType被映射成了BIT类型,这里我们有两种改法:

tinyint(1) mybatis会生成jdbcType=BIT,导致转Integer失败的解法

①改法一:

public TinyIntJavaTypeResolver() {super();typeMap.put(Types.TINYINT, new JavaTypeResolverDefaultImpl.JdbcTypeInformation("TINYINT", new FullyQualifiedJavaType(Integer.class.getName())));//加一段bit的映射typeMap.put(Types.BIT, new JavaTypeResolverDefaultImpl.JdbcTypeInformation("BIT", new FullyQualifiedJavaType(Integer.class.getName())));
}

加一段bit的映射就可以了。

②改法二:

不设置tinyint(1),等于就是叫你别这样用了。或者考虑使用下面的方法二

方法二:在配置文件generatorConfig.xml中直接指定

这个就简单很多了

<table tableName="test" domainObjectName="Test" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><columnOverride column="deleted" property="deleted" javaType="java.lang.Integer" /><columnOverride column="is_accept" property="isAccept" javaType="java.lang.Integer" />
</table>

重点要注意:是javaType="java.lang.Integer",即:javaType,不是配置jdbcType,两者千万别搞混了。

然后我们测试,生成文件看看:

生成的Mapper.xml:
在这里插入图片描述
生成的model是:

在这里插入图片描述

这样也就OK了。

总结

我们学到了,有两种方法可以将 tinyint 映射为 Integer。

方法一,继承JavaTypeResolverDefaultImpl接口的方式,比较通用。

方法二,在配置文件generatorConfig.xml中直接指定,这种方式简单,粗暴;只不过每次生成一张表,都需要进行配置(假设需要的话)。

最后,我最开始报错的原因,其实是我在XXXMapper.xml文件中写错了类型:

is_accept = #{accept,javaType=TINYINT}
# 正确应该是
is_accept = #{accept,jdbcType=TINYINT}

假设最开始我写对了,其实Java类型使用Byte,是没有问题的。

价值参考

5.5 Java, JDBC and MySQL Types

解决tinyint映射成boolean/byte的问题

解决Mybatis generatorConfig.xml将tinyint映射为Byte和Boolean

https://blog.csdn.net/yu542771572/article/details/116607642

这篇关于Mybatis Generator将tinyint映射成Integer的解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

mybatis框架基础以及自定义插件开发

文章目录 框架概览框架预览MyBatis框架的核心组件MyBatis框架的工作原理MyBatis框架的配置MyBatis框架的最佳实践 自定义插件开发1. 添加依赖2. 创建插件类3. 配置插件4. 启动类中注册插件5. 测试插件 参考文献 框架概览 MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,为开发者提供了极大的灵活性和便利性。以下是关于M

mybatis if test 之 0当做参数传入出问题

首先前端传入了参数 if(StringUtils.isNotBlank(status)){requestParam.setProperty("status", Integer.parseInt(status));}List<SuperPojo> applicationList = groupDao.getApplicationListByReviewStatusAndMember(req