在和前端開發(fā)對接接口過程中經(jīng)常發(fā)現(xiàn)需要一些枚舉類的字典參數(shù),雖然可以通過swagger在線文檔給前端開發(fā),不過可以直接返回枚舉的編碼和字典值就可以更直觀,所以在項目里怎么實(shí)現(xiàn)?可以通過Mybatis的一些接口,自定義枚舉類的處理器實(shí)現(xiàn)
環(huán)境準(zhǔn)備
-
開發(fā)環(huán)境
- JDK 1.8
- SpringBoot2.2.1
- Maven 3.2+
-
開發(fā)工具
- IntelliJ IDEA
- smartGit
- Navicat15
定義一個接口
先定義一個IEnum接口,@JsonFormat
格式為對象返回
package com.example.springboot.mybatis.common.enumhandler;
import com.fasterxml.jackson.annotation.JsonFormat;
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public interface IEnum {
String getCode();
String getName();
}
枚舉工具類
寫一個枚舉工具類,根據(jù)code和name返回對應(yīng)枚舉類,根據(jù)反射獲取getEnumConstants
,循環(huán)匹配
package com.example.springboot.mybatis.common.enumhandler;
public class EnumUtils {
public static <T extends Enum<?> & IEnum> T codeOf(Class<T> enumCls , String code) {
T[] enumConstants = enumCls.getEnumConstants();
for (T t : enumConstants) {
if (t.getCode().equals(code)) return t;
}
return null;
}
public static <T extends Enum<?> & IEnum> T nameOf(Class<T> enumCls , String name) {
T[] enumConstants = enumCls.getEnumConstants();
for (T t : enumConstants) {
if (t.getName().equals(name)) return t;
}
return null;
}
}
自定義類型轉(zhuǎn)換器
自定義Mybatis的類型轉(zhuǎn)換器類,繼承BaseTypeHandler
,里面有幾個需要實(shí)現(xiàn)的方法
-
void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
用于定義設(shè)置參數(shù)時把Java類型的參數(shù)轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)庫類型 -
T getNullableResult(ResultSet rs, String columnName)
用于定義通過字段名稱獲取字段數(shù)據(jù)時把數(shù)據(jù)庫類型轉(zhuǎn)換為對應(yīng)的Java類型 -
T getNullableResult(ResultSet rs, int columnIndex)
用于定義通過字段索引獲取字段數(shù)據(jù)時把數(shù)據(jù)庫類型轉(zhuǎn)換為對應(yīng)的Java類型 -
T getNullableResult(CallableStatement cs, int columnIndex)
用定義調(diào)用存儲過程把數(shù)據(jù)庫類型轉(zhuǎn)換為對應(yīng)的Java類型
package com.example.springboot.mybatis.common.enumhandler;
import cn.hutool.core.lang.Assert;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MybatisEnumCodeTypeHandler<E extends Enum<E> & IEnum> extends BaseTypeHandler<E>{
private final Class<E> type;
public MybatisEnumCodeTypeHandler(Class<E> type) {
Assert.notNull(type , "type argument can not be null");
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i , e.getCode());
}
@Override
public E getNullableResult(ResultSet resultSet, String s) throws SQLException {
String code = resultSet.getString(s);
return resultSet.wasNull() ? null : EnumUtils.codeOf(this.type , code);
}
@Override
public E getNullableResult(ResultSet resultSet, int i) throws SQLException {
String code = resultSet.getString(i);
return resultSet.wasNull() ? null : EnumUtils.codeOf(this.type , code);
}
@Override
public E getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
String code = callableStatement.getString(i);
return callableStatement.wasNull() ? null : EnumUtils.codeOf(this.type , code);
}
}
yaml配置類型處理器
在application.yml
里配置default-enum-type-handler
,加上自定義的MybatisEnumCodeTypeHandler
mybatis:
# 指定sql映射文件位置
mapper-locations: classpath:mybatis/mapper/*.xml
configuration:
default-enum-type-handler: com.example.springboot.mybatis.common.enumhandler.MybatisEnumCodeTypeHandler
map-underscore-to-camel-case: true
項目中使用
需要的枚舉類就繼承IEnum接口文章來源:http://www.zghlxwxcb.cn/news/detail-439468.html
package com.example.springboot.mybatis.bean;
import com.example.springboot.mybatis.common.enumhandler.IEnum;
public enum Sex implements IEnum {
MAN("1","男"),
WOMAN("2","女");
private String code;
private String name;
Sex(String code, String name) {
this.code = code;
this.name = name;
}
@Override
public String getCode() {
return code;
}
@Override
public String getName() {
return name;
}
}
寫個接口,參數(shù)返回json:文章來源地址http://www.zghlxwxcb.cn/news/detail-439468.html
{"userId":"1","username":"admin","sex":{"code":"1","name":"男"},"password":"11"}
到了這里,關(guān)于Mybatis自定義枚舉類處理器優(yōu)雅地使用枚舉的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!