基于SpringBoot自定义实现Mybatis-TypeHandler

需求:
在程序中使用枚举(enum) 来表示一些状态或选项,而在数据库中使用数字来存储。这样做的好处是在程序中使用enum更直观的可以知道每个值代表的状态及含义。

分析:
EnumTypeHandler与EnumOrdinalTypeHandler是已经有的两类TypeHandler

两者之间的区别:
EnumTypeHandler存入数据库的是枚举的name,EnumOrdinalTypeHandler存入数据库的是枚举的位置。

例子:

public enum  sexEnum implements DemoEnum {

   WOMAN(0),MAN(1);
   private int code;
   private sexEnum(int code){
       this.code =code;
   }
    @Override
    public int getValue() {
        return code;
    }
}

EnumTypeHandler转换获取到的是 WOMAN OR MAN

EnumOrdinalTypeHandler获取到的是 0 OR 1(并非我们上面代码性别枚举中WOMAN()中的数字,只是位置)

因为我们需要自定义一个TypeHandler:

话不多说直接上代码:

1、定义一个接口,作用是在从数据库中获取到值时可以转换

public interface DemoEnum {
    int getValue();
}

2、自定义基于BaseTypeHandler的公共类,目的是当你有多个枚举类时解耦,其中的get方法是上一步定义接口的作用:

public class testTypeHandler<E extends Enum<E> & DemoEnum> extends BaseTypeHandler<E> {

    private Class<E> type;
    private final E[] enums;
    public testTypeHandler(Class<E> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.type = type;
        this.enums = type.getEnumConstants();
        if (this.enums == null) {
            throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
        }
    }

    public E get(int code) {
        try {
            for(E e:enums) {
                if(e.getValue() == code) {
                    return e;
                }
            }
        } catch (Exception e) {
            throw new IllegalArgumentException("erro value!");
        }
        return null;
    }
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i,parameter.getValue());
    }
    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        int value = rs.getInt(columnName);
        if (rs.wasNull()) {
            return null;
        }else {
            return get(value);
        }
    }
    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        int value = rs.getInt(columnIndex);
        if (rs.wasNull()) {
            return null;
        }else {
            return get(value);
        }

    }
    @Override
    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        int value = cs.getInt(columnIndex);
        if (cs.wasNull()) {
            return null;
        }else {
            return get(value);
        }

    }


}

3、新建一个基于上一步基类的公用类,如果你有多个枚举属性需要转换,你可以在MappedTypes注解中增加你的枚举类,目的是不用每次实现一个TypeHandler:

@MappedTypes({sexEnum.class})
public class EnumTypeHandler<E extends Enum<E> & DemoEnum> extends testTypeHandler<E> {
    public EnumTypeHandler(Class<E> type) {
        super(type);
    }
}

4、application.properties中配置

mybatis.type-handlers-package= 你的公共类的包路径

 

 

总结:写得可能有点粗糙,希望和大家一起交流。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring BootMyBatis Plus一起使用时,可以使用TypeHandler来处理数据库中的自定义类型和Java对象之间的转换。 首先,您需要创建一个自定义TypeHandler类来处理特定类型的转换。例如,假设您有一个名为CustomType自定义类型,您可以创建一个CustomTypeHandler类来处理它的转换。 ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class CustomTypeHandler extends BaseTypeHandler<CustomType> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, CustomType customType, JdbcType jdbcType) throws SQLException { preparedStatement.setString(i, customType.toString()); } @Override public CustomType getNullableResult(ResultSet resultSet, String s) throws SQLException { return CustomType.fromString(resultSet.getString(s)); } @Override public CustomType getNullableResult(ResultSet resultSet, int i) throws SQLException { return CustomType.fromString(resultSet.getString(i)); } @Override public CustomType getNullableResult(CallableStatement callableStatement, int i) throws SQLException { return CustomType.fromString(callableStatement.getString(i)); } } ``` 在这个例子中,CustomTypeHandler继承自MyBatis中的BaseTypeHandler,并重写了一些方法来实现类型转换。setNonNullParameter方法用于将Java对象转换为数据库中的值,getNullableResult方法用于将数据库中的值转换为Java对象。 接下来,在您的实体类中使用@TableField注解来指定字段使用自定义TypeHandler。例如: ```java public class MyEntity { @TableField(typeHandler = CustomTypeHandler.class) private CustomType customType; // 其他字段和方法... } ``` 最后,您需要在MyBatis的配置文件中注册自定义TypeHandler。在application.properties或application.yml中添加以下配置: ```yaml mybatis-plus: configuration: map-underscore-to-camel-case: true type-handlers-package: com.example.typehandler ``` 这里的`com.example.typehandler`是您自定义TypeHandler类的包路径。 通过这些步骤,您就可以在Spring Boot中使用MyBatis Plus的TypeHandler来处理自定义类型和Java对象之间的转换了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值