mybatis的EnumOrdinalTypeHandler和EnumlTypeHandler的使用

使用mybatis自带的枚举类处理,有2种方式,一个是EnumTypeHandler,一个是EnumOrdinalTypeHandler。
区别如下:
EnumTypeHandler直接存储name值。它是mybatis默认的枚举类型转换器。
EnumOrdinalTypeHandler存储enum类里的序号值,此时数据库表字段一般对应用smallint/int类型的处理。
也可以使用 自定义的typeHandler来实现枚举映射:

一、EnumOrdinalTypeHandler

public enum Sex {
    MALE(1,"男"),
    FEMALE(2, "女");

    private int id;
    private String name;
    Sex(int id, String name){
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static Sex getSex(int id){
        if(id == MALE.getId()){
            return MALE;
        }else if(id == FEMALE.getId()){
            return FEMALE;
        }
         return null;
    }
}

User类:

@Alias("user")
public class User {
    private int id;
    private String userName;
    private String password;
    private String email;
    private String address;
    private int age;
    private int sex;
	...setter、getter方法
}

mybatis-config.xml

  <!--注册自定义的typeHandler-->
    <typeHandlers>
        <typeHandler jdbcType="VARCHAR" javaType="string" handler="typeHandler.MyStringTypeHandler"/>
        <!-- EnumOrdinalTypeHandler -->
        <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="util.Sex" />
    </typeHandlers>

userMapper.xml

<mapper namespace="mapper.UserMapper">
    <resultMap type="user" id="userMap">
        <!--定义结果类型转化标识,才能使用类型转换器-->
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <id column="user_name" property="userName" javaType="string" jdbcType="VARCHAR"/>
        <id column="password" property="password" javaType="string" jdbcType="VARCHAR"/>
        <id column="email" property="email"  typeHandler="typeHandler.MyStringTypeHandler"/>
        <id column="address" property="address" typeHandler="typeHandler.MyStringTypeHandler"/>
        <id column="age" property="age" javaType="int" jdbcType="INTEGER"/>
        <id column="sex" property="sex" />
    </resultMap>
    
    <select id="getUserById" resultMap="userMap" parameterType="int">
        select id, user_name, password, address, email, age, sex from user where id=#{id}
    </select>
</mapper>

数据库中的数据存数:

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `user_name` varchar(30) NOT NULL,
  `password` varchar(100) NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  `address` varchar(200) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'amy', 'amy123', 'amy@163.com', '北京市', '30', '2');
INSERT INTO `user` VALUES ('2', 'panda', '123456', 'panda@sina.com', '天津市', '27', '1');
INSERT INTO `user` VALUES ('3', 'balala', '54321', 'balala@163.com', '河北省', '10', '1');

工具类:

public class SqlSessionFactoryUtil {
    //SqlSessionFactory对象
    private static SqlSessionFactory sqlSessionFactory = null;
    //类线程锁
    private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;

    private SqlSessionFactoryUtil(){}
    /**
     * 构建SqlSessionFactory
     */
    public static SqlSessionFactory initSqlSessionFactory(){
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try{
            inputStream = Resources.getResourceAsStream(resource);
        }catch (IOException ex){
            Logger.getLogger(SqlSessionFactoryUtil.class.getName()).log(Level.ERROR, null, ex);
        }

        synchronized (CLASS_LOCK) {
            if (sqlSessionFactory == null) {
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            }
        }

        return sqlSessionFactory;
    }

    public static SqlSession openSqlSession(){
        if (sqlSessionFactory == null) {
            initSqlSessionFactory();
        }
        return sqlSessionFactory.openSession();
    }
}

测试类:

public class UserTest {
    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try{
            sqlSession = SqlSessionFactoryUtil.openSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.getUserById(1);
            System.out.println(user.getUserName());
            System.out.println(user.getAddress());
            System.out.println(user.getEmail());
            System.out.println(user.getSex());
        }finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

运行结果

amy
北京市
amy@163.com
2

二、EnumOrdinalTypeHandler

这里只写和EnumOrdinalTypeHandler不同的代码部分

1、User类中sex的定义

//其中sex也可以定义成String类型
 private Sex sex;

2、mybatis-config.xml

<typeHandler handler="org.apache.ibatis.type.EnumTypeHandler" javaType="util.Sex" />

3、userMapper.xml

<id column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>

4、数据库中sex字段的定义:

CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `user_name` varchar(30) NOT NULL,
  `password` varchar(100) NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  `address` varchar(200) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` enum('FEMALE','MALE') DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'amy', 'amy123', 'amy@163.com', '北京市', '30', 'FEMALE');
INSERT INTO `user` VALUES ('2', 'panda', '123456', 'panda@sina.com', '天津市', '27', 'MALE');
INSERT INTO `user` VALUES ('3', 'balala', '54321', 'balala@163.com', '河北省', '10', 'MALE');

还是使用上面的UserTest类测试:
结果:

amy
北京市
amy@163.com
FEMALE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值