mybatis 自定义 typeHandler 解决枚举枚举


package com.example.demo.handler;

import com.example.demo.common.BaseIntEnum;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.*;

/**
 * @Author lyr
 * @create 2020/12/19 20:48
 */
@MappedJdbcTypes(JdbcType.INTEGER)
@MappedTypes(BaseIntEnum.class)
// @Component
public  class BaseEnumTypeHandler<E extends BaseIntEnum> extends BaseTypeHandler<E> {
    
    
    /**
     * 枚举数组的 类
     */
    private final Class<E> enumClazz;
    /**
     * 枚举数组
     */
    private final E[] values;
    /**
     * 遇到空对象是否设置默认值
     */
    private E defaultEnum;

    private E codeOf(int code) {
    
    
        for (E e : values) {
    
    
            if (e.getValue() == code) {
    
    
                return e;
            }
        }
        return null;
    }


    public BaseEnumTypeHandler(Class<E> enumClazz) {
    
    
        if (enumClazz == null) {
    
    
            throw new IllegalArgumentException("base enum TypeHandler enum class cannot be null !@!!!");
        }
        this.enumClazz = enumClazz;
        values = enumClazz.getEnumConstants();
        if (values!=null && values.length>0) {
    
    
            defaultEnum = (E)values[0].getValueWhenObjectFieldNull();
            // System.out.println(defaultEnum);
        }

    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
    
    
        // preparedStatement.set
        preparedStatement.setInt(i, e.getValue());
    }

    @Override
    public void setParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
    
    
        if (parameter==null)
            parameter = defaultEnum;
        super.setParameter(ps, i, parameter, jdbcType);
    }

    /**
     * 可以空的对象
     *
     * @param resultSet
     * @param s
     * @return
     * @throws SQLException
     */
    @Override
    public E getNullableResult(ResultSet resultSet, String s) throws SQLException {
    
    
        int code = resultSet.getInt(s);

        return resultSet.wasNull() ? defaultEnum : codeOf(code);
    }

    @Override
    public E getNullableResult(ResultSet resultSet, int i) throws SQLException {
    
    
        int code = resultSet.getInt(i);
        return resultSet.wasNull() ? defaultEnum : codeOf(code);
    }

    @Override
    public E getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
    
    
        int code = callableStatement.getInt(i);
        return callableStatement.wasNull() ? defaultEnum : codeOf(code);
    }
}


通用枚举接口

package com.example.demo.common;

/**
 * @Author lyr
 * @create 2020/12/19 20:37
 */
public interface BaseIntEnum<E extends Enum<E>> {
    
    

    /**
     * 存入数据库的值
     * @return
     */
    int getValue();

    /**
     * 当遇到 field 为 null 对象时候,是否设置默认值
     * @return
     */
    E getValueWhenObjectFieldNull();

    /**
     * @return 打印的名字
     */
    String getDisplayName();
}


例子:


package com.example.demo.common;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

/**
 * @Author lyr
 * @create 2020/12/19 20:37
 */
@AllArgsConstructor
@Getter
@ToString
public enum SexIntEnum implements BaseIntEnum<SexIntEnum> {
    
    
    MAN(1,"男"),
    GIRL(0,"女生"),
    UNKNOWN(-1,"人妖");

    private Integer code;
    private String message;

    /**
     * 存入数据库的值
     *
     * @return
     */
    @Override
    public int getValue() {
    
    
        return code;
    }

    /**
     * 当遇到 null 对象时候,是否设置默认值
     *
     * @return
     */
    @Override
    public SexIntEnum getValueWhenObjectFieldNull() {
    
    
        return UNKNOWN;
    }

    /**
     * @return 打印的名字
     */
    @Override
    public String getDisplayName() {
    
    
        return toString();
    }
}

配置

<table tableName="t_student" domainObjectName="Student" >

            <generatedKey column="student_id"  sqlStatement="Mysql"  identity="true" />
            <columnOverride column="sex" javaType="com.example.demo.common.SexIntEnum"  typeHandler="com.example.demo.handler.BaseEnumTypeHandler"/>
        </table>




 

yml demo

mybatis:
  mapper-locations: classpath:/mapper/**/*.xml
  type-aliases-package: com.example.demo.pojo
  configuration:
    map-underscore-to-camel-case: true
  type-handlers-package: com.example.demo.handler.BaseEnumTypeHandler

Junit demo


  @Resource
    private StudentMapper studentMapper;

    @Test
    void iiiii() {
    
    
        studentMapper.insert(new Student());
    }

猜你喜欢

转载自blog.csdn.net/qq_43923045/article/details/111410895