前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis数据库字段映射Java枚举 顶

MyBatis数据库字段映射Java枚举 顶

作者头像
算法之名
发布2019-08-20 10:50:05
1.7K0
发布2019-08-20 10:50:05
举报
文章被收录于专栏:算法之名算法之名

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

代码语言:javascript
复制
public enum ProductType implements Localisable {
    TYPE1("配件"),
    TYPE2("车品");

    private String value;
    private ProductType(String value) {
        this.value = value;
    }

    @Override
    public String getValue() {
        return this.value;
    }
}

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

代码语言:javascript
复制
public interface Localisable {
    String getValue();
}

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

代码语言:javascript
复制
/**
 * 配件分类
 */
@AllArgsConstructor
@NoArgsConstructor
public 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查找一个配件分类,并实例化)

代码语言:javascript
复制
@Mapper
public interface LevelDao {
    ProviderProductLevel findLevel1(Long id);
}

mapper映射文件如下

代码语言:javascript
复制
<?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"

该映射处理器的代码如下

代码语言:javascript
复制
@AllArgsConstructor
public 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;
    }
}

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档