返回介绍

9.7 在映射中使用枚举

发布于 2025-04-26 13:08:35 字数 2432 浏览 0 评论 0 收藏

在很多时候,我们希望将数据库的某些字典项转化为我们 Java 的枚举对象,这些在 MyBatis 的 typeHandler 中可以实现。而在 MyBatis 中,EnumTypeHandler 和 EnumOrdinalType Handler 并不是很好用。这个时候我们需要的是一个自定义的 typeHandler 去处理它们。现在让我们举个例子。

现在我们在系统里面定义了红、黄、蓝三种颜色可以使用。于是我们可以得到一个颜色枚举类,如代码清单 9-45 所示。

代码清单 9-45:颜色枚举类

public enum Color {
    RED(1, "红"),
    YELLOW(2, "黄"), 
    BLUE(3, "蓝色");

    Color(int code, String name) {
        this.code  = code;
        this.name = name;
    }

    private int code;
    private String name;

    public int getCode() {
        return this.code;
    }

    public static Color getEnumByCode(int code) {
        for (Color color : Color.values()) {
            if(color.code == code) {
                return color;
            }
        }
        return null;
    }    
}

那么我们还需要定义一个自定义的 typeHandler 就可以了,参见代码清单 9-46。

代码清单 9-46:颜色的 typeHandler

public class ColorEnumTypeHandler implements TypeHandler<Color>  {
    @Override
    public void setParameter(PreparedStatement ps, int i, Color color, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, color.getCode());
    }

    @Override
    public Color getResult(ResultSet rs, String name) throws SQLException {
        int result = rs.getInt(name);
        return Color.getEnumByCode(result);
    }

    @Override
    public Color getResult(ResultSet rs, int i) throws SQLException {
        int result = rs.getInt(i);
        return Color.getEnumByCode(result);
    }

    @Override
   public Color getResult(CallableStatement cs, int i) throws SQLException{
        int result = cs.getInt(i);
        return Color.getEnumByCode(result);
    }

}

我们在映射器中配置 JavaType 和 JdbcType 以及 typeHandler 便可以使用自定义的类型了,如代码清单 9-47 所示。

代码清单 9-47:自定义的类型

......
    <resultMap id="colorResultMapper" type="com.learn.chapter9.pojo. ColorBean">
        <result property="id" column="id"/>
        <result property="color" column="color" jdbcType="INTEGER"
                javaType="com.learn.chapter9.typeHandler.Color" typeHandler="com.learn.chapter9.typeHandler.ColorEnumTypeHandler"/>
        <result property="note" column="note"/>
        
    </resultMap>

    <select id="getColor" parameterType="int" resultMap="colorResultMapper">
        select id, color, note from t_color where id = #{id}
    </select>
......

注意加粗的代码的配置,这样就可以在这里使用映射为枚举,而不需要在配置文件里面添加任何的配置了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。