(mybatis)EnumTypeHandler和EnumOrdinalTypeHandler的区别

来源:互联网 发布:淘宝代客打小人靠谱吗 编辑:程序博客网 时间:2024/05/29 18:03

mybatis对枚举类型提供了两种类型支持:EnumTypeHandler和EnumOrdinalTypeHandler。

EnumTypeHandler是mybatis默认的枚举类型转换器,如果pojo类中使用了枚举类型,而配置文件没有指定类型转换类,mybatis将使用EnumTypeHandler处理枚举属性。EnumTypeHandler的将把枚举类的name进行存储,枚举类的name即枚举类名。

//http://mybatis.github.io/mybatis-3/zh/configuration.html

上面链接是官方的介绍

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。

执行插入操作结

(mybatis)EnumTypeHandler和EnumOrdinalTypeHandler的区别

(PS:由于枚举类型NORMAL在EnumStatus中排第一,所以ordinal属性是0)

原创粉丝点击