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日

相关推荐

  • px、em和rem实战经验

    在自适应布局或者移动端网页开发时,我们经常会用到em和rem两个长度单位。接下来我们讨论一下这两个单位和px之间的区别,以及他们的使用场景等。 px px,像素(计算机屏幕上的一个…

    2018年9月11日
    2.1K
  • js数组去重(区分object、“NaN”、NaN)

    数组去重在前端面试中比较常见,今天来复习复习。 对这样一个数组进行去重,我尝试了几种方法,大多数不能对对象去重,或者不能区分true和”true”、NaN和…

    2021年2月23日
    1.3K
  • 创建vue3 + typescript项目说明

    创建项目 选择Manually select features【手动配置】 如上图选择配置项,并在下一步,选择3.x 接下来,按照推荐设置,进行选择【推荐设置都已英文字母大写的形式…

    2023年11月23日
    631
  • MyBatis配置之typeHandler类型处理器

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

    2022年4月20日
    1.2K
  • spring boot练习篇之用户登录系统【接口篇】

    写在前面 抛弃JSP,只做纯粹的前后端分离项目。 作为一个资深前端工作者,想要转JavaWeb开发,无论是书籍,还是网上视频、资料,竟然没有一篇能清楚明白地讲解怎样搭建一个前后端分…

    2021年5月25日
    1.7K
  • Java自学之异常的捕获与处理

    在程序开发中,程序的编译与运行是两个不同的阶段,编译主要针对的是语法检测,而在程序运行时却有可能出现各种各样的错误导致程序中断执行,那么这些错误在Java中统一称为异常。 异常处理…

    2020年12月11日
    1.4K
  • windows下使用Docker Desktop安装nacos与mysql,实现互通访问

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

    2022年10月27日
    472
  • css布局基础总结

    前端css布局知识繁杂,实现方式多种多样。想写出高效、合理的布局,必须以深厚的css基础为前提。为了方便记忆和复习,将css布局要点记录如下。内容较多,应用方面说的不太详细,但都是…

    2018年9月13日
    2.4K
  • Java自学之类结构扩展

    面向对象中的核心组成是类与接口,在项目中会利用【包】进行一组相关类的管理,这样适合于程序代码的部分更新,也更加符合面向对象封装性的概念,同时合理地使用封装也可以方便地实现实例化对象…

    2020年12月10日
    1.4K
  • JavaScript基础知识八问

    JavaScript是前端开发中非常重要的一门语言,浏览器是他主要运行的地方。JavaScript是一个非常有意思的语言,但是他有很多一些概念,大家经常都会忽略。比如说,原型,闭包…

    2020年12月30日
    1.0K