天天看點

如何使用Mybatis處理枚舉值

作者:頑強小貓BX

介紹

1. 使用者管理中存儲男女對應的key值100、101

2. 定義枚舉類GenderEnum 繼承 DbEnum接口

//DbEnum:
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public interface DbEnum extends Serializable {
    public Integer getKey();

}

           
如何使用Mybatis處理枚舉值
// GenderEnum枚舉類
@AllArgsConstructor
public enum GenderEnum implements DbEnum{

    MAIL(100, "男"),
    FEMAIL(101, "女"),
    UNKNOWN(102, "未知");
    ;


    private Integer key;

    private String value;

    public String getValue() {
        return value;
    }

    @Override
    public Integer getKey() {
        return key;
    }
}

           
如何使用Mybatis處理枚舉值

3.定義枚舉類的處理器

public class EnumTypeHandler extends BaseTypeHandler<DbEnum> {

    private Class<DbEnum> enumClass;

    public EnumTypeHandler(Class<DbEnum> enumClass) {
        this.enumClass = enumClass;
    }

    /**
     * 設定存入資料庫的值
     * @param preparedStatement
     * @param i
     * @param dbEnum
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, DbEnum dbEnum, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, dbEnum.getKey());
    }

    /**
     * 從資料庫傳回的處理
     * @param resultSet
     * @param s
     * @return
     * @throws SQLException
     */
    @Override
    public DbEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int anInt = resultSet.getInt(s);
        return getEnum(anInt);
    }

    /**
     * 用來查詢操作,直接利用結果集傳回,columnName為列名
     * @param resultSet
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public DbEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return getEnum(resultSet.getInt(i));
    }

    /**
     * 用來存儲過程的查詢操作,直接利用結果集傳回,columnIndex是列索引
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public DbEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return getEnum(callableStatement.getInt(i));
    }

    private DbEnum getEnum(Integer key) {
        DbEnum[] enumConstants = enumClass.getEnumConstants();
        if (Objects.nonNull(enumConstants)) {
            for (DbEnum enumConstant : enumConstants) {
                if (Objects.equals(enumConstant.getKey(), key)) {
                    return enumConstant;
                }
            }
        }
        return null;
    }
}

           

4.在xml檔案中枚舉字段定義枚舉處理器

1)查詢

如何使用Mybatis處理枚舉值

2)插入

如何使用Mybatis處理枚舉值

5.結果

1)插入

如何使用Mybatis處理枚舉值

2) 查詢

如何使用Mybatis處理枚舉值

源碼: Mybatis閽堝鏋氫婦鍊肩殑澶勭悊: Mybatis閽堝鏋氫婦鍊肩殑澶勭悊

繼續閱讀