mybatis对枚举类型提供了两种类型支持:
- org.apache.ibatis.type.EnumTypeHandler
- org.apache.ibatis.type.EnumOrdinalTypeHandler
EnumTypeHandler
EnumTypeHandler是mybatis默认的枚举类型转换器,如果pojo类中使用了枚举类型,而配置文件没有指定类型转换类,mybatis将使用EnumTypeHandler处理枚举属性。EnumTypeHandler的将把枚举类的name进行存储,枚举类的name即枚举类名。
EnumOrdinalTypeHandler
EnumOrdinalTypeHandler是mybatis提供的另一种转换器,顾名思义这个转换类使用了枚举类的ordinal属性作为数据库存储信息,由于ordinal属性是int类型的,按照官网的说明数据库中对应资源应该是int或double类型的,但是个人测试过程中MYSQL的varchar字段也可以存储。
总结:
EnumTypeHandler和EnumOrdinalTypeHandler的区别主要是数据库中存储字段的类型差别,由于EnumOrdinalTypeHandler使用枚举类型的ordinal作为存储,所以必须使用数字类型字段存储。
建表语句如下:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`salt` varchar(100) DEFAULT NULL,
`locked` tinyint(1) DEFAULT '0',
`gender` varchar(20) DEFAULT '0',
`idNumber` varchar(45) DEFAULT NULL,
`email` varchar(45) DEFAULT NULL,
`realname` varchar(45) DEFAULT NULL,
`mobile` varchar(45) DEFAULT NULL,
`grade` int(11) DEFAULT NULL, #用的是int类型
PRIMARY KEY (`id`),
UNIQUE KEY `idx_sys_users_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=137 DEFAULT CHARSET=utf8;
映射文件如下:
insert into user (id,
username, password,
salt, locked, gender,grade, idNumber,
email, realname,
mobile
)
values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR},
#{password,jdbcType=VARCHAR},
#{salt,jdbcType=VARCHAR},
#{locked,jdbcType=BIT}, #{gender,jdbcType=VARCHAR},
#{grade,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},
#{idNumber,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR},
#{realname,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR}
)