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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2022年4月20日
下一篇 2022年10月27日

相关推荐

  • CSS中的BFC是什么

    定义 一个块格式化上下文(block formatting context) 是Web页面的可视化CSS渲染出的一部分。它是块级盒布局出现的区域,也是浮动层元素进行交互的区域。 触…

    2022年11月5日
    601
  • JAVA学习之多线程知识点整理

    1、什么是进程?什么是线程? 进程是一个应用程序。线程是一个进程中的执行场景或者执行单元。一个进程可以启动多个线程。进程之间内存独立不共享。同一个进程中的线程之间,堆内存和方法区内…

    2020年6月19日
    1.4K
  • Webpack入门,样式预处理

    样式预处理指的是开发者在开发过程中经常会使用一些样式预编译语言,如SCSS、Less等,在项目打包过程中再将这些预编译语言转换成CSS。借助这些语言强大和便捷的特性,可以降低项目的…

    2022年11月25日
    791
  • Angular4.x ngModel 指令详解

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

    2019年7月3日
    2.0K
  • Java自学之泛型

    在Java语言中,为了方便接收参数类型的统一,提供了核心类Object,利用此类对象可以接收所有类型的数据(包括基本数据类型和引用数据类型)。但是由于其所描述的数据范围过大,所以在…

    2020年12月8日
    1.4K
  • JAVA学习路线之夯实基础

    第一章 开发环境 JDK(Java SE Development Kit),Java标准版开发包,提供编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环…

    2020年1月14日
    1.8K
  • Webpack入门,模块打包之加载其他类型的模块

    在实际开发中,开发者可能遇到其他类型的模块,比如AMD、UMD模块,虽然这些模块在目前的使用场景已经不多,但是遇到这些模块时仍然需要知道如何处理。 加载非模块化的文件 非模块化文件…

    2022年11月14日
    726
  • Webpack入门,预处理器

    一个Web工程通常会包含HTML、JS、CSS、图片、字体等多种类型的静态资源,且这些资源之间都存在着某种联系。对于Webpack来说,所有这些静态资源都是模块,开发者可以像加载一…

    2022年11月21日
    764
  • Webpack入门,模块打包原理分析

    面对工程中成百上千个模块,Webpack究竟是如何将它们有序地组织在一起,并按照开发者预想的顺序运行在浏览器上的呢?本篇文章将通过一个简单的示例。分析一下Webpack模块打包的原…

    2022年11月14日
    877