枚举
我们在写程序的时候会遇到这种需求。就是我的对象里面有一个属性是一个枚举值,但是mybatis默认是不支持的,官方提供了一个typeHandler可以用枚举的ordinal()来进行存和取的自动转换。把它配置在mybatis-configuration.xml
里。
|
|
问题
但是这里有一些问题,必须如果数据库里面存在了别的数字,举个例,有以下枚举
|
|
这个枚举在数据库中对应的数字应该是0和1,问题如下
- 枚举写的顺序不能变,否则数据库数据会错乱
- 枚举序数中间不能中断(0,2)
- 数据库里有除了0和1之外的数字,在查询数据的时候程序会得到一个异常(
ArrayIndexOutOfBoundsException
)
最怕的就是程序出异常了,这里ArrayIndexOutOfBoundsException
的原因是因为EnumOrdinalTypeHandler的代码大致是下面这个的意思。
UserType.values()[i]
所以就出现了我们写代码其实并不经常会遇到的ArrayIndexOutOfBoundsException
解决方案
为了避免出现这些情况,有个简单的办法就是重写一个EnumOrdinalTypeHandler
,
我这里贴一下我的解决方案。
首先要为所有枚举写一个接口,为了获取枚举对应的intValue,代码如下。
|
|
上面3个静态方法也可以提取到工具类中,我这里偷了一下懒,也因为我是用的JDK8。
枚举实例如下:
|
|
这里就是一个很常见的枚举,重点在下面的typeHandler。
|
|
这个类基本上也是拷的EnumOrdinalTypeHandler
。重要的改动的代码如下:
ps.setInt(i, parameter.getValue());
return CommonEnum.getEnum(type, i);
第一句是插入和更新的时候用到的,第二句是查询的时候用到的,最后把mybatis-configuration.xml
里的改一下。
|
|