您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“MyBatis數(shù)據(jù)庫字段該如何映射Java枚舉”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MyBatis數(shù)據(jù)庫字段該如何映射Java枚舉”吧!
有時候我們需要將數(shù)據(jù)庫的字段對Java的枚舉類型進(jìn)行映射,比如說我們有一個汽車配件類型的枚舉
public enum ProductType implements Localisable {TYPE1("配件"), TYPE2("車品"); private String value; private ProductType(String value) {this.value = value; }@Override public String getValue() {return this.value; } }
該枚舉類型實(shí)現(xiàn)了一個接口
public interface Localisable { String getValue();}
有一個配件分類的實(shí)體類,包含了該枚舉字段(此處只包含部分字段屬性)
/** * 配件分類 */@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; }
而在數(shù)據(jù)庫中的表結(jié)構(gòu)如下
dao方法如下(通過id查找一個配件分類,并實(shí)例化)
@Mapperpublic interface LevelDao { ProviderProductLevel findLevel1(Long id);}
mapper映射文件如下
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.cloud.productprovider.dao.LevelDao"> <resultMap id="level1Map" type="com.cloud.productprovider.composite.ProviderProductLevel"> <id property="id" column="id" /> <result property="code" column="code" /> <result property="name" column="name" /> <result property="sort" column="sort" /> <result property="productType" column="product_type" typeHandler="com.cloud.productprovider.untils.DbEnumTypeHandler" /> </resultMap> <select id="findLevel1" resultMap="level1Map" parameterType="java.lang.Long" resultType="com.cloud.productprovider.composite.ProviderProductLevel"> select id,code,name,sort,product_type from product_level<where> id=#{id}</where> </select></mapper>
我們可以看到這里有一個映射處理器typeHandler="com.cloud.productprovider.untils.DbEnumTypeHandler"
該映射處理器的代碼如下
@AllArgsConstructorpublic class DbEnumTypeHandler extends BaseTypeHandler<Localisable> {private Class<Localisable> 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; } }
經(jīng)測試返回的結(jié)果對象的Json字符串如下
{"code":"0000001","id":1,"name":"油品","productType":"TYPE1","sort":1}
到此,相信大家對“MyBatis數(shù)據(jù)庫字段該如何映射Java枚舉”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。