mybatis处理enum类型

一直用hibernate,习惯了枚举类的使用,非常方便,现在用mybatis,发现枚举的处理,还是需要单独处理下。

如果想使用mybatis自带的枚举类处理,有2种方式,一个是EnumTypeHandler,一个是EnumOrdinalTypeHandler。
2者的区别是EnumTypeHandler直接存储name值,而EnumOrdinalTypeHandler会存储enum类里的序号值,此时数据库表字段一般用int类型的处理。

使用方式比较简单,直接在mapper文件里的字段上,加上

typeHandler=“org.apache.ibatis.type.EnumOrdinalTypeHandler”

typeHandler=“org.apache.ibatis.type.EnumTypeHandler”

然后insert或者update的地方,字段处也加上相应的typeHandler即可。

但通常的情况下,我们并不希望用序号来标记,而希望通过自定义的id值来存储,这时我们就需要自己写enum的处理类。

为了使处理类通用,我们用泛型来处理,首先定义一个接口类:

  1. public interface IntEnum<E extends Enum<E>> {

  2. int getIntValue();

  3. }

===

然后自己的枚举类,去实现这个接口,主要是实现getIntValue方法:

  1. public enum TestStatusEnum implements IntEnum<TestStatusEnum> {

  2. FAILURE(0, "failure"), SUCCESS(1, "success");

  3. private int index;

  4. private String name;

  5. //....get set

  6. private TestStatusEnum(int index, String name) {

  7. this.index = index;

  8. this.name = name;

  9. }
    ===

  10. public static String fromIndex(int index) {
    =============================================

  11. for (TestStatusEnump : TestStatusEnum.values()) {
    ===================================================

  12. if (index == p.getIndex())
    ============================

  13. return p.name;
    ================

  14. }
    ===

  15. return null;
    ==============

  16. }
    ===

  17. @Override
    ===========

  18. public int getIntValue() {
    ============================

  19. return this.index;
    ====================

  20. }
    ===

pojo类里的status字段属性,定义为 TestStatusEnum status。

然后自定义一个hanler类:

  1. public class IntEnumTypeHandler<E extends Enum<E> & IntEnum<E>> extends

  2. BaseTypeHandler<IntEnum> {

  3. private Class<IntEnum> type;

  4. public IntEnumTypeHandler(Class<IntEnum> type) {

  5. if (type == null)

  6. throw new IllegalArgumentException("Type argument cannot be null");

  7. this.type = type;

  8. }

  9. private IntEnum convert(int status) {
    =======================================

  10. IntEnum[] objs = type.getEnumConstants();
    ===========================================

  11. for (IntEnum em : objs) {
    ===========================

  12. if (em.getIntValue() == status) {
    ===================================

  13. return em;
    ============

  14. }
    ===

  15. }
    ===

  16. return null;
    ==============

  17. }
    ===

  18. @Override
    ===========

  19. public IntEnum getNullableResult(ResultSet rs, String columnName)
    ===================================================================

  20. throws SQLException {
    =======================

  21. return convert(rs.getInt(columnName));
    ========================================

  22. }
    ===

  23. @Override
    ===========

  24. public IntEnum getNullableResult(ResultSet rs, int columnIndex)
    =================================================================

  25. throws SQLException {
    =======================

  26. return convert(rs.getInt(columnIndex));
    =========================================

  27. }
    ===

  28. @Override
    ===========

  29. public IntEnum getNullableResult(CallableStatement cs, int columnIndex)
    =========================================================================

  30. throws SQLException {
    =======================

  31. return convert(cs.getInt(columnIndex));
    =========================================

  32. }
    ===

  33. @Override
    ===========

  34. public void setNonNullParameter(PreparedStatement ps, int i,
    ==============================================================

  35. IntEnum enumObj, JdbcType jdbcType) throws SQLException {
    ===========================================================

  36. // baseTypeHandler已经帮我们做了parameter的null判断
    ===========================================

  37. ps.setInt(i, enumObj.getIntValue());
    ======================================

  38. }
    ===

  39. }
    ===

===

在mapper文件里,加上typehandler的定义,比如:

insert和update的地方,同样加上#{condition.status,jdbcType=BIT,typeHandler=com.**.IntEnumTypeHandler}

最后测试下,insert后,表里会存储对应的id值,select的时候,mybatis会自动获取name值。

另外有个问题是,当使用了enum类型后,mybatis查询,是获取到的enum对象。比如我们enum里,有name属性,我们在转换到json的时候,想直接获取这个name属性

,就可以使用fastjson来转,最新版本的json已经支持读取enum的toString方法来序列化。

代码:
JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd HH:mm:ss”;
String objJson = JSON.toJSONString(results,
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.WriteEnumUsingToString);
jsonObject.put(“results”, objJson);

猜你喜欢

转载自blog.csdn.net/segegefe/article/details/124318482