• Mybaits 自定义TypeHandler 处理枚举


    1、定义枚举基类

    package com.ne.scrm.content.constant;
    
    
    import org.springframework.util.ReflectionUtils;
    
    import java.lang.reflect.Field;
    
    public interface BaseDBEnum {
         String DEFAULT_VALUE_NAME = "value";
         String DEFAULT_DESC_NAME = "desc";
    
         default Integer getValue() {
              Field field = ReflectionUtils.findField(this.getClass(), DEFAULT_VALUE_NAME);
              if (field == null) {
                   return null;
              }
              try {
                   field.setAccessible(true);
                   return Integer.parseInt(field.get(this).toString());
              } catch (IllegalAccessException e) {
                   throw new RuntimeException(e);
              }
         }
    
         default String getDesc() {
              Field field = ReflectionUtils.findField(this.getClass(), DEFAULT_DESC_NAME);
              if (field == null) {
                   return null;
              }
              try {
                   field.setAccessible(true);
                   return field.get(this).toString();
              } catch (IllegalAccessException e) {
                   throw new RuntimeException(e);
              }
         }
    }
    

      

    2、基类子类实现

      

    package com.ne.scrm.content.enums;
    
    import com.fasterxml.jackson.annotation.JsonValue;
    import com.ne.scrm.content.constant.BaseDBEnum;
    import lombok.Getter;
    
    /**
     * @author Yungui.Zheng
     * @date 2020/12/01
     */
    @Getter
    public enum PublishTypeDBEnum implements BaseDBEnum {
        /**
         * 0-立即发布、1-定时发布
         */
    
        INSTANT_PUB(0, "立即发布"),
        TIMING_PUB(1, "定时发布");
    
        Integer value;
        @JsonValue
        String desc;
    
        PublishTypeDBEnum(Integer value, String desc) {
            this.value = value;
            this.desc = desc;
        }
    
    }
    

      

    3、自定义TypeHandler处理类

      

    package com.ne.scrm.content.persist.mybatis.handler;
    
    import com.ne.scrm.content.constant.BaseDBEnum;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * 通用枚举转化handler
     * 用于转化BaseDBEnum子类
     *
     * @author : Yungui.zheng
     * @date : 20201202
     **/
    @MappedJdbcTypes(value = JdbcType.TINYINT, includeNullJdbcType = true)
    public class DefaultEnumTypeHandler extends BaseTypeHandler<BaseDBEnum> {
    
        private Class<BaseDBEnum> type;
    
        public DefaultEnumTypeHandler() {
            System.out.println("init DefaultEnumTypeHandler no args");
        }
    
        public DefaultEnumTypeHandler(Class<BaseDBEnum> type) {
            System.out.println("init DefaultEnumTypeHandler with args");
            if (type == null) {
                throw new IllegalArgumentException("Type argument cannot be null");
            }
            this.type = type;
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, BaseDBEnum parameter, JdbcType jdbcType) throws SQLException {
            ps.setInt(i, parameter.getValue());
        }
    
        @Override
        public BaseDBEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return convert(rs.getInt(columnName));
        }
    
        @Override
        public BaseDBEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return convert(rs.getInt(columnIndex));
        }
    
        @Override
        public BaseDBEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return convert(cs.getInt(columnIndex));
        }
    
        private BaseDBEnum convert(int status) {
            BaseDBEnum[] objs = type.getEnumConstants();
            for (BaseDBEnum em : objs) {
                if (em.getValue() == status) {
                    return em;
                }
            }
            return null;
        }
    }
    

      

    4、注册Typehandler

      4.1、springBoot注册方式1(configuration)

        

    mybatis:
      configuration:
        default-enum-type-handler: com.ne.scrm.content.persist.mybatis.handler.DefaultEnumTypeHandler
    

      

      4.2、springBoot 注册方式2(推荐

      

    mybatis:
      type-handlers-package: com.ne.scrm.content.persist.mybatis.handler
    

      

  • 相关阅读:
    #Laravel 笔记# 多语言化 App::setLocale() 持久化。
    thinkphp 3.2 发送邮件(Phpmailer)
    深度学习的注意力机制
    图像检索引擎vearch安装与测试使用
    word2vector
    GPU环境搭建
    ImportError: libSM.so.6: cannot open shared object file: No such file or dir
    shell中&&和||的用法
    Linux 远程连接sftp与ftp
    mysql-connector-java各版本及与mysql、JDK版本的对应
  • 原文地址:https://www.cnblogs.com/irobotzz/p/14073127.html
Copyright © 2020-2023  润新知