MyBatis配置之枚举类型typeHandler讲解(上)

之前发布了一篇《MyBatis配置之typeHandler类型处理器》的文章,讲解了在使用MyBatis时如何自定义typeHandler。但是在MyBatis中枚举类型的typeHandler则有自己特殊的规则。

在MyBatis中提供了两个转化枚举类型的typeHandler给用户使用。

  • org.apache.ibatis.type.EnumTypeHandler
  • org.apache.ibatis.type.EnumOrdinalTypeHandler

其中,EnumTypeHandler是使用枚举字符串名称作为参数传递的,EnumOrdinalTypeHandler是使用整数下标作为参数传递的。如果枚举和数据库字典项保持一致,就可以使用它们。然而这两个枚举类型应用却不是那么广泛,更多的情况下是使用自定义的typeHandler处理枚举类型。

本篇文章中就以性别为例,讲解一下怎样使用枚举类typeHandler。

定义一个性别枚举类

public enum Sex {
  MALE(1,"男"),FEMALE(2,"女");
  private int id;
  private String name;
  private 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 Sstring getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public static Sex getSex(int id) {
    if(id == 1) {
      return MALE;
    } else if(id == 2) {
      return FEMALE;
    }
    return null;
  }
}

在没有配置的情况下,MyBatis默认使用EnumOrdinalTypeHandler枚举类型处理器。为了能让EnumOrdinalTypeHandler能够处理我们自定义的枚举类,需要在MyBatis做如下配置。

<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.demo.enums.Sex" />
</typeHandlers>

这样MyBatis就可以识别我们自定义的枚举类了。当然这还不够,还需要在对应的mapper映射文件中进行响应的配置。我们自定义的枚举类是在用户信息实体类中使用,所以需要在用户实体类对应的mapper映射文件中进行配置。

<?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.demo.mapper.UserMapper">
  <resultMap type="com.demo.entity.UserEntity" id="userMap">
    <id column="id" property="id" javaType="long" jdbcType="BIGINT" />
    <result column="user_name" property="userName" />
    <result column="cnname" property="cnname" />
    <result column="birthday" property="birthday" />
    <result column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler" />
    <result column="email" property="email" />
    <result column="mobile" property="mobile" />
    <result column="note" property="note" />
  </resultMap>
  <select id="getUser" parameterType="long" resultMap="userMap">
    select id,user_name,cnname,birthday,sex,email,mobile,note from t_user where id=#{id}
  </select>
  <insert parameterType="com.demo.entity.UserEntity" id="insertUser">
    insert into t_user(user_name,cnname,birthday,sex,email,mobile,note) values(#{userName},#{cnname},#{birthday},#{sex,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},#{email},#{mobile},#{note})
   </insert>
</mapper>

UserMapper.java

public interface UserMapper {
  public User getUser(Long id);
  public int insertUser(UserEntity userEntity);
}

接下来就可以测试了

TestMyTypeHandler.java

public class TestMyTypeHandler {
  public static void main(String[] args) {
    SqlSession sqlSession=null;
    try {
      sqlSession = SqlSessionFactoryUtil.openSqlSession();
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      UserEntity userEntity = new UserEntity();
      userEntity.setUserName("liubei");
      userEntity.setCnname("刘备");
      userEntity.setMobile("18888888888888");
      userEntity.setSex(Sex.MALE);
      userEntity.setEmail("liubei@163.com");
      userEntity.setNote("测试枚举类型转换器");
      userEntity.setBirthday(new Date());
      userMapper.insertUser(userEntity);
      UserEntity userEntity2 = userMapper.getUser(1L);
      System.out.println(userEntity2.getSex());
      sqlSession.commit();
    } catch(Exception ex) {
      System.err.println(ex.getMessage());
      sqlSession.rollback();
    } finally {
      if(sqlSession != null) {
        sqlSession.close();
      }
    }
  }
}

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/mybatis-enumordinaltypehandler.html

Like (0)
Donate 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
Previous 2022年4月20日
Next 2022年10月27日

相关推荐

  • 深入理解JS内存机制

    JS的内存机制在很多前端开发者看来并不是那么重要,但是如果你想深入学习JS,并将它利用好,打造高质量高性能的前端应用,就必须要了解JS的内存机制。对于内存机制理解了以后,一些基本的…

    2019年7月14日
    1.6K
  • windows下使用Docker Desktop安装nacos与mysql,实现互通访问

    1、命令行拉取MySQL镜像 打开命令提示符,运行以下命令安装mysql 2、运行mysql镜像,启动mysql实例 3、命令行拉取nacos镜像 4、运行nacos镜像,启动na…

    2022年10月27日
    348
  • servlet学习之获取表单数据(IDEA2020.2篇)

    首先,创建一个servlet工程。 如果你不会用IDEA2020.2创建servlet工程,请打开下面链接浏览网站博文。 https://www.edu24.cn/course/j…

    2020年9月8日
    1.3K
  • 从零开始开发vue组件库

    前言 很早之前,就有开发一套vue组件库的想法,直到现在想法依旧只是想法。汗颜啊……此篇文章将讲述如何开发vue组件库,虽然文章标题为《从零开始开发vue组件库》,实际上是从搭建v…

    2024年6月23日
    414
  • MyBatis配置之typeHandler类型处理器

    typeHandler类型处理器作用 MyBatis在预处理语句(PreparedStatement)中设置一个参数时,或者从结果集(ResultSet)中取出一个值时,都会用注册…

    2022年4月20日
    954
  • STS插件mybatis-generator安装及使用

    断断续续学习Java也有好长时间了,没有师傅带,没有项目练手,学习超级慢,也很烦。视频、书籍翻看了一大推,还是没有目标。 相信滴水成海,外加条条大路通罗马,只要坚持,自己终能达成目…

    2019年12月27日
    2.1K
  • Java自学之抽象类与接口

    面向对象程序设计中,类继承的主要作用的扩充已有类的功能。子类可以根据自己的需要选择是否要覆写父类中的方法,所以一个设计完善的父类是无法对子类做出任何强制性的覆写约定。为了解决这样的…

    2020年12月7日
    1.1K
  • JavaScript中call、apply及bind的深度解析

    函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this 关键字密切相关,相当一部分人对它们的理解还是比较浅显,所谓js基础…

    2019年8月5日
    1.5K
  • css晦涩难懂的点都在这啦

    CSS大家肯定都是会的但是每个人所撑握的情况都不一样,特别是已经工作几年的前辈(这里指的是我司)很多CSS玩法都不知道,可能他们已经习惯了用组件, 但是面试的时候又不可避免问,所以…

    2021年1月20日
    1.2K
  • Angular4.x ngModel 指令详解

    用过angular的前端工程师都知道,angular数据是可以双向绑定的。但是它为什么可以使数据双向绑定?原理又是什么?阅读这篇文章,来了解一下吧。

    2019年7月3日
    1.8K