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日

相关推荐

  • JavaScript中call、apply及bind的深度解析

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

    2019年8月5日
    1.8K
  • JavaWeb入门案例之用户注册

    前言 之前把Java的基础知识系统的过了一遍,目前总算可以看懂Java代码了,接下来就是要学习Java开发框架(主要是springMVC)。 下面用一个用户注册的小案例,来总结一下…

    2021年1月13日
    1.8K
  • 如何搭建MyBatis开发环境

    进入一段时间的学习及温习,已经可以说是初步掌握了Javaweb入门开发,由于我的中心思想是抛弃JSP,做纯粹的前后端分离项目,所以接下来计划学习持久层开发,现在主流的持久层开发工具…

    2022年4月6日
    922
  • 两栏布局之左侧固定,右侧自适应的实现方法

    实现左侧固定,右侧自适应的两栏布局的方法有很多。其中经常用到的有float方法、BFC方法、CSS3的flex布局及grid布局。并非所有的布局都会在开发中使用,但是其中也会涉及一些知识点。

    2018年10月13日
    2.8K
  • Angular 4.x ngModel 双向绑定原理揭秘

    一直以来都没有去深入探究Angular,只是熟练运用。真要被问起来,很多关于angular的理论知识都回答不上来。感觉上学背书的能力已经丧失的差不多了。只能以这样的方式搜集整理出来。

    2019年7月2日
    2.1K
  • Webpack入门,项目工程配置说明

    使用npm scripts 在《Webpack入门,打包第一个工程》文章讲到,webpack打包工程命令为 npx webpack –entry=./index.js –mod…

    2022年11月9日
    630
  • Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 。 后端收到请求,验证用户名和密码,验证成功,就给…

    2019年8月8日
    5.3K
  • spring4.x学习之创建工程

    断断续续学习Java有两三个月了,目前还是处于入门阶段。关于java及spring那些的设计理念方面的理论知识,不花费大量精力及时间是看不懂的(至少对于我这么一个前端转后端的初学者…

    2019年3月19日
    2.0K
  • Java自学之类结构扩展

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

    2020年12月10日
    1.5K
  • 深入理解JS内存机制

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

    2019年7月14日
    1.9K