mybatis对枚举类型提供了两种类型支持:EnumTypeHandler和EnumOrdinalTypeHandler。
EnumTypeHandler是mybatis默认的枚举类型转换器,如果pojo类中使用了枚举类型,而配置文件没有指定类型转换类,mybatis将使用EnumTypeHandler处理枚举属性。EnumTypeHandler的将把枚举类的name进行存储,枚举类的name即枚举类名。
EnumOrdinalTypeHandler是mybatis提供的另一种转换器,顾名思义这个转换类使用了枚举类的ordinal属性作为数据库存储信息,由于ordinal属性是int类型的,按照官网的说明数据库中对应资源应该是int或double类型的,但是个人测试过程中MYSQL的varchar字段也可以存储。
总结:EnumTypeHandler和EnumOrdinalTypeHandler的区别主要是数据库中存储字段的类型差别,由于EnumOrdinalTypeHandler使用枚举类型的ordinal作为存储,所以必须使用数字类型字段存储。
示例:
建表语句
CREATE TABLE `t_user` ( `id` varchar(45) NOT NULL, `accountID` varchar(45) DEFAULT NULL, `userName` varchar(45) DEFAULT NULL, `statusDef` varchar(45) DEFAULT NULL, `statusOrdinal` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
实体类
package com.sg.bean; public class User { private String id; private String accountID; private String userName; private EnumStatus statusDef; //枚举属性,使用mybatis默认转换类 private EnumStatus statusOrdinal; //枚举属性,使用EnumOrdinalTypeHandler转换 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getAccountID() { return accountID; } public void setAccountID(String accountID) { this.accountID = accountID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public EnumStatus getStatusDef() { return statusDef; } public void setStatusDef(EnumStatus statusDef) { this.statusDef = statusDef; } public EnumStatus getStatusOrdinal() { return statusOrdinal; } public void setStatusOrdinal(EnumStatus statusOrdinal) { this.statusOrdinal = statusOrdinal; } @Override public String toString() { return "id:" + id + "\naccountID:" + accountID + "\nuserName:" + userName + "\nstatusDef:" + statusDef.getDescription() + "\nstatusOrdinal:" + statusOrdinal.getDescription(); } }
枚举类
package com.sg.bean; public enum EnumStatus { NORMAL(1, "正常"), DELETE(0, "删除"), CANCEL(2, "注销"); private EnumStatus(int code, String description) { this.code = new Integer(code); this.description = description; } private Integer code; private String description; public Integer getCode() { return code; } public String getDescription() { return description; } }
mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.sg.bean.User"> <resultMap type="User" id="userMap"> <id column="id" property="id"/> <result column="accountID" property="accountID"/> <result column="userName" property="userName"/> <result column="statusDef" property="statusDef"/> <result column="statusOrdinal" property="statusOrdinal" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/> </resultMap> <select id="selectUser" resultMap="userMap"> select * from t_user where id = #{id} </select> <insert id="insertUser" parameterType="User"> insert into t_user(id,accountID,userName,statusDef,statusOrdinal) values( #{id}, #{accountID}, #{userName}, #{statusDef}, #{statusOrdinal, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler} ) </insert> </mapper>
注意配置文件中,statusDef没有配置转换类,它将使用mybatis默认的转换类EnumTypeHandler。
执行插入操作结
(PS:由于枚举类型NORMAL在EnumStatus中排第一,所以ordinal属性是0)
源码在这里:http://git.oschina.net/winnie/mybatis-personal
(建议选择enumtypehandler那个分支)