文章目录

  • 概述
  • 提问
  • 回答
  • 一、枚举类型的类型处理器如何使用?
  • 二、这两种枚举类型的类型处理器有什么区别?


概述

  通过文章[mybatis 自定义 TypeHandler]可以对typeHandler进行一定的了解,这个章节主要是说说枚举类型的类型处理。该处理器主要包括两种:

  • EnumTypeHandler
  • EnumOrdinalTypeHandler

提问

  1. 枚举类型的类型处理器如何使用?
  2. 这两种枚举类型的类型处理器有什么区别?

回答

一、枚举类型的类型处理器如何使用?

  关于类型处理器typeHandler的使用,在typeHandler的章节中已经说的比较清楚了,这里就不进行过多的赘述了。以下是枚举类型的typeHandler的简单使用案例:

package org.loulan.application.function.mybatis.org.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
import org.apache.ibatis.type.EnumTypeHandler;
import org.loulan.application.function.mybatis.org.typeHandler.UserSex;
import org.loulan.application.function.mybatis.org.typeHandler.UserStatus;

/**
 * 用户信息表
 * @TableName dm_user
 */
@TableName(value ="dm_user",autoResultMap = true)
@Data
public class DmUser implements Serializable {
    
    /**
     * 用户状态(可使用用户字典是否可用)
     *
     */
    @TableField(value = "STATUS",typeHandler = EnumOrdinalTypeHandler.class,javaType = true)
    private UserStatus status;
    
    /**
     * 性别(可使用字典1男2女)(男女)
     */
    @TableField(value = "SEX",typeHandler = EnumTypeHandler.class)
    private UserSex sex;
}

  如上代码是对两种枚举类型的typeHandler使用的案例,和普通的typeHandler使用方式是一样的,如下展示这两个字段在数据库的类型:


类型

长度

注释

STATUS

CHAR

1

用户状态

SEX

CHAR

6

性别

  如下我们再看看这两个字段的数据是什么样子的:

STATUS

SEX

1

MALE

  看了上面的数据以及类型处理器,但是一直没有看到枚举类,因为我们这个类型处理器是枚举类型的类型处理器,所以枚举类如下:

package org.loulan.application.function.mybatis.org.typeHandler;

/*********************************************************
 ** Description: EnumTypeHandler测试使用的枚举类型
 ** <br><br>
 ** Date: Created in 2021/10/19  19:25
 ** @author loulan
 ** @version 0.0.0
 *********************************************************/
public enum UserStatus {
    ERROR(0, "停用"),
    SUCCESS(1, "正常");
    private int status;
    private String statusName;

    UserStatus(int status, String statusName) {
        this.status = status;
        this.statusName = statusName;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getStatusName() {
        return statusName;
    }

    public void setStatusName(String statusName) {
        this.statusName = statusName;
    }
}
package org.loulan.application.function.mybatis.org.typeHandler;

/*********************************************************
 ** Description: 用户性别的枚举类型
 ** <br><br>
 ** Date: Created in 2021/10/20  10:28
 ** @author loulan
 ** @version 0.0.0
 *********************************************************/
public enum UserSex {
    MALE(0, "男"),
    FEMALE(1, "女");

    private int sex;
    private String sexName;

    UserSex(int sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getSexName() {
        return sexName;
    }

    public void setSexName(String sexName) {
        this.sexName = sexName;
    }
}

二、这两种枚举类型的类型处理器有什么区别?

  通过以上的代码和数据的展示我们可以看出一问题来,在数据表中status和sex都是枚举类型,但是EnumOrdinalTypeHandler展示的数字,EnumTypeHandler展示的是字符串。

  EnumOrdinalTypeHandler展示的数字实际上是枚举类的角标数字(角标就是顺序值,类似数组的角标)。这里有一个比较容易犯错的地方就是把角标数字当成是枚举里面设置的值,这里使用的是UserStatus,刚开始我以为数据表里面的数据对应就是那个int类型的status的值,后来才发现不是,而是谁在最上面谁是第一位的0,然后是1,顺序向后排序。

  EnumTypeHandler展示的字符串就是枚举名称,这个枚举类型处理器是直接将枚举名称直接写进数据的方式来和枚举数据对应的。