mybatis 遇到枚举类无法获得有效值

作者使用MyBatis从数据库取数据时,发现枚举字段无法取出枚举类,对比代码未发现问题。最终发现是数据库中枚举类对应字段设为tinyint(1),其与布尔类型有特殊对应关系,导致枚举变量值为空。总结指出tinyint(1)有此特性,后来将枚举类设为int(11)类型。

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

今天在使用mybatis从数据库中拿数据的时候发现数据的枚举字段无法取出枚举类,其他的量都能够取到有效值。

在同样的环境下,另一个服务中的类似代码却能够正常取出枚举类,这就让事情显得离奇了起来,把两对代码进行了详细的比较,但是我和前辈都没有发现代码的问题,因为两段代码从枚举类到mybatis的使用方法都是一样的。

一直到我们突发奇想可能不是数据库的问题,终于触及了这次问题的真正成因,在数据库中枚举类所对应的字段因为想要节省空间被设成了tinyint(1),因为布尔型和枚举类基本都只需要一位整数就能储存了,但是我们没有考虑到mysql中tinyint(1)和布尔类型之间的对应联系是特有的,于是在使用mybatis取对象的时候,本应是枚举类的变量其值其实是布尔类型,由于无法放入枚举类变量中,所以表现出来就是该枚举变量值为空,就好像没有取出来一样。

 

总结一下:tinyint(1)在mysql数据库中与java的布尔类型有特殊的对应关系,就算是使用tinyint(2)也不会造成上述的问题。

 

P.S.:后来我们还是沿用了以前的设置习惯把枚举类设成了int(11)类型。

### 解决方案 当遇到MyBatis无法自动识别处理器具体泛型类型的情况时,可以采取多种方法确保TypeHandler能够正确处理特定的数据类型。一种常见的方式是通过显式声明TypeHandler所关联的Java类型和数据库列类型。 对于自定义TypeHandler,在Spring Boot项目中除了按照常规方式创建TypeHandler类之外,还需要确保这些处理器能被MyBatis框架发现并注册。这通常涉及到配置`mybatis.type-handlers-package`属性来指明包含所有自定义TypeHandler实现类的包位置[^2]。 另外一个重要方面在于如何让MyBatis知道哪个TypeHandler应该用于转换给定字段或参数。为此可以在实体类字段上使用`@TypeHandler`注解指定具体的TypeHandler实例;也可以在XML映射文件中的SQL语句里利用`typeHandler`属性来进行局部覆盖设置[^1]。 最后值得注意的是,如果希望全局范围内应用某个TypeHandler,则可以直接继承`BaseTypeHandler<T>`抽象类,并重写其中的方法完成必要的逻辑编码工作。这样做之后只要保证上述提到过的扫描机制生效即可使新创建的TypeHandler在整个应用程序内有效。 ```java // 定义一个通用的基础类型处理器 public class GenericEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> { private final Class<E> type; public GenericEnumTypeHandler(Class<E> type) { this.type = type; } @Override public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException { // 实现将枚举值保存到数据库的操作... } @Override public E getNullableResult(ResultSet rs, String columnName) throws SQLException { // 实现从结果集中读取对应列并将它转成相应的枚举对象... } } ``` 为了进一步提高灵活性以及减少硬编码依赖关系的可能性,还可以考虑采用基于接口的形式设计TypeHandler工厂模式,从而允许动态加载不同的TypeHandler实现而无需修改原有代码结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值