千家信息网

MyBatis数据库字段该如何映射Java枚举

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,本篇内容主要讲解"MyBatis数据库字段该如何映射Java枚举",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"MyBatis数据库字段该如何映射Java枚
千家信息网最后更新 2024年11月22日MyBatis数据库字段该如何映射Java枚举

本篇内容主要讲解"MyBatis数据库字段该如何映射Java枚举",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"MyBatis数据库字段该如何映射Java枚举"吧!

有时候我们需要将数据库的字段对Java的枚举类型进行映射,比如说我们有一个汽车配件类型的枚举

public enum ProductType implements Localisable {TYPE1("配件"),    TYPE2("车品");    private String value;    private ProductType(String value) {this.value = value;    }@Override    public String getValue() {return this.value;    }}

该枚举类型实现了一个接口

public interface Localisable {    String getValue();}

有一个配件分类的实体类,包含了该枚举字段(此处只包含部分字段属性)

/** * 配件分类 */@AllArgsConstructor@NoArgsConstructorpublic class ProviderProductLevel {@Getter    @Setter    private Long id;    @Getter    @Setter    private String code;    @Getter    @Setter    private String name;    @Getter    @Setter    private Integer sort;    @Getter    @Setter    private Integer level;    @Getter    @Setter    private ProductType productType;    @Getter    @Setter    private String pictureUrl;}

而在数据库中的表结构如下

dao方法如下(通过id查找一个配件分类,并实例化)

@Mapperpublic interface LevelDao {    ProviderProductLevel findLevel1(Long id);}

mapper映射文件如下

                                                    

我们可以看到这里有一个映射处理器typeHandler="com.cloud.productprovider.untils.DbEnumTypeHandler"

该映射处理器的代码如下

@AllArgsConstructorpublic class DbEnumTypeHandler extends BaseTypeHandler {private Class type;    @Override    public void setNonNullParameter(PreparedStatement ps, int i, Localisable parameter, JdbcType jdbcType) throws SQLException {        ps.setString(i,parameter.getValue());    }@Override    public Localisable getNullableResult(ResultSet rs, String columnName) throws SQLException {        String value = rs.getString(columnName);        if (rs.wasNull()) {return null;        }else {return convert(value);        }    }@Override    public Localisable getNullableResult(ResultSet rs, int columnIndex) throws SQLException {        String value = rs.getString(columnIndex);        if (rs.wasNull()) {return null;        }else {return convert(value);        }    }@Override    public Localisable getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {        String value = cs.getString(columnIndex);        if (cs.wasNull()) {return null;        }else {return convert(value);        }    }private Localisable convert(String value) {        Localisable[] dbEnums = type.getEnumConstants();        for (Localisable dbEnum : dbEnums) {if (dbEnum.getValue().equals(value)) {return dbEnum;            }        }return null;    }}

经测试返回的结果对象的Json字符串如下

{"code":"0000001","id":1,"name":"油品","productType":"TYPE1","sort":1}

到此,相信大家对"MyBatis数据库字段该如何映射Java枚举"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0