通用mapper枚举字段和typehandler

枚举类:

public enum StateEnum {
    disabled,
    enabled,
}

MyBatis 提供的枚举处理器有 EnumOrdinalTypeHandler(数据库存的是枚举索引值,查询的时候根据索引值获取相对于的值)和EnumTypeHandler(数据库存的是枚举的值)

这里打算用 MyBatis 提供的 EnumOrdinalTypeHandler,也是数据库存储枚举对应的序号。

地址类:

public class Address implements Serializable {
    private static final long serialVersionUID = 1L;
    private String province;
    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        if(province != null && province.length() > 0){
            builder.append(province);
        }
        if(city != null && city.length() > 0){
            builder.append("/").append(city);
        }
        return builder.toString();
    }
}

这个类用来演示自定义类型的用法,针对该类写一个自定义的 TypeHandler

public class AddressTypeHandler extends BaseTypeHandler
{ @Override public void setNonNullParameter(PreparedStatement ps, int i, Address parameter, JdbcType jdbcType) throws SQLException { //1.对address对象进行验证 if(address == null) { return ; } //2.从address对象中取出具体数据 String province = address.getProvince(); String city = address.getCity(); String street = address.getStreet(); //3.拼装成一个字符串 //规则:各个值之间使用“,”分开 StringBuilder builder = new StringBuilder(); builder .append(province) .append(",") .append(city) .append(",") .append(street); String parameterValue = builder.toString(); //4.设置参数 ps.setString(i, parameterValue); } private Address convertToAddress(String addressStr){ if(addressStr == null || addressStr.length() == 0){ return null; } String[] strings = addressStr.split("/"); Address address = new Address(); if(strings.length > 0 && strings[0].length() > 0){ address.setProvince(strings[0]); } if(strings.length > 1 && strings[1].length() > 0){ address.setCity(strings[1]); } return address; } @Override public Address getNullableResult(ResultSet rs, String columnName) throws SQLException { return convertToAddress(rs.getString(columnName)); } @Override public Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return convertToAddress(rs.getString(columnIndex)); } @Override public Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return convertToAddress(cs.getString(columnIndex)); } }

测试数据

create table user (
  id integer NOT NULL PRIMARY KEY,
  name varchar(32),
  address varchar(64),
  state integer
);

INSERT INTO user (id, name, address, state) VALUES (1, 'abel533', 'Hebei/Shijiazhuang', 1);
INSERT INTO user (id, name, address, state) VALUES (2, 'isea533', 'Hebei/Handan', 0);

使用 ColumnType 注解指定:

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private Integer   id;
    private String    name;
    @ColumnType(typeHandler = AddressTypeHandler.class)
    private Address   address;
    private StateEnum state;

    //省略 setter 和 getter
}

 

特别提醒

默认情况下只有简单类型才会被当作表中的字段(useSimpleType=true)。
当字段有 @Column 或者 @ColumnType 注解时,也会被当作表中的字段。
默认情况下,枚举不会当作表中的字段,如果想要自动把枚举作为表中字段,需要配置 enumAsSimpleType=true,这里的例子就启用了这个配置。如果不启用这个功能,也需要加 @Column 或者 @ColumnType 注解。

在这个例子中,address 字段通过 @ColumnType 设置了 typeHandler。但是 state 却没这么设置,先看 EnumOrdinalTypeHandler 的定义:

public class EnumOrdinalTypeHandler> extends BaseTypeHandler

由于需要指定泛型,因此这里不能直接配置,除非你在创建一个针对性的 TypeHandler,例如:

public class StateEnumTypeHandler extends EnumOrdinalTypeHandler {
    public StateEnumTypeHandler(Class type) {
        super(type);
    }
}

然后配置:

@ColumnType(typeHandler = StateEnumTypeHandler.class) 
private StateEnum state;

除了用这种麻烦的方式外,还可以直接用下面的方式配置全局的 typeHandler:




    
    
        
    
    

 

全局配置

第二种就是全部在配置文件中使用 typeHandler 进行配置,实体只做简单的配置:

@Table(name = "user")
public class User2 implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private Integer   id;
    private String    name;
    @Column
    private Address   address;
    private StateEnum state;

    //省略 setter 和 getter
}

 

这里的 Address 加上 @Column 注解,只是为了把该字段当成表中的字段。

typeHandler 全局配置如下:


    

    

 

你可能感兴趣的:(Mybatis,微服务)