Mybatis TypeHandler 的使用
1,列舉類
public enum GenderEnum implements CodeDescEnum {
/**
* 0未知,1男,2女
*/
UNKNOWN(0, "未知"),
MALE(1, "男"),
FEMALE(2, "女");
private Integer code;
private String desc;
GenderEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
@Override
public String getDesc() {
return desc;
}
@Override
public Integer getCode() {
return code;
}
}
2,編寫Hanlder 繼承CodeIdentifyEnumHandler
public class GenderEnumHandler extends CodeIdentifyEnumHandler<GenderEnum> {
public GenderEnumHandler() {
super(GenderEnum.class);
}
}
3,CodeIdentifyEnumHandler
public abstract class CodeIdentifyEnumHandler<T extends Enum<T> & CodeDescEnum> extends BaseTypeHandler<T> {
private Class<T> type;
/**
* 設定配置檔案設定的轉換類以及列舉類內容,供其他方法更便捷高效的實現
*
* @param type 配置檔案中設定的轉換類
*/
public CodeIdentifyEnumHandler(Class<T> type) {
if (type == null)
throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
return CodeDescEnum.getFromCodeOrThrow(type, rs.getInt(columnName));
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return CodeDescEnum.getFromCodeOrThrow(type, rs.getInt(columnIndex));
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return CodeDescEnum.getFromCodeOrThrow(type, cs.getInt(columnIndex));
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getCode());
}
}
4 , 看一下CodeDescEnum
public interface CodeDescEnum {
Map<Class, Map<String, CodeDescEnum>> descEnumCache = new HashMap<>();
Map<Class, Map<Integer, CodeDescEnum>> codeEnumCache = new HashMap<>();
@SuppressWarnings(value = {"unchecked"})
static <Y extends CodeDescEnum> Optional<Y> getFromDescOpt(Class<Y> clazz, String desc) {
Map<String, CodeDescEnum> clazzEnumMap = descEnumCache.get(clazz);
// 初始化enumMap
if (clazzEnumMap == null) {
clazzEnumMap = new HashMap<>();
for (Y type : clazz.getEnumConstants()) {
clazzEnumMap.put(type.getDesc(), type);
}
descEnumCache.put(clazz, clazzEnumMap);
}
return Optional.ofNullable((Y) clazzEnumMap.get(desc));
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromDescOrNull(Class<T> clazz, String desc) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromDescOpt(clazz, desc);
return (T) codeIdentifyEnumOpt.orElse(null);
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromDescOrThrow(Class<T> clazz, String desc) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromDescOpt(clazz, desc);
if (codeIdentifyEnumOpt.isPresent()) {
return (T) codeIdentifyEnumOpt.get();
}
throw new CommonException(CommonErrorCode.UNKNOWN_ERROR, "不存在的" + clazz.getSimpleName() + "型別", "不存在的" + clazz.getSimpleName() + "型別desc=" + desc);
}
@SuppressWarnings(value = {"unchecked"})
static <Y extends CodeDescEnum> Optional<Y> getFromCodeOpt(Class<Y> clazz, Integer code) {
Map<Integer, CodeDescEnum> clazzEnumMap = codeEnumCache.get(clazz);
// 初始化enumMap
if (clazzEnumMap == null) {
clazzEnumMap = new HashMap<>();
for (Y type : clazz.getEnumConstants()) {
clazzEnumMap.put(type.getCode(), type);
}
codeEnumCache.put(clazz, clazzEnumMap);
}
return Optional.ofNullable((Y) clazzEnumMap.get(code));
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromCodeOrNull(Class<T> clazz, Integer code) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromCodeOpt(clazz, code);
return (T) codeIdentifyEnumOpt.orElse(null);
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromCodeOrThrow(Class<T> clazz, Integer code) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromCodeOpt(clazz, code);
if (codeIdentifyEnumOpt.isPresent()) {
return (T) codeIdentifyEnumOpt.get();
}
throw new CommonException(CommonErrorCode.UNKNOWN_ERROR, "不存在的" + clazz.getSimpleName() + "型別", "不存在的" + clazz.getSimpleName() + "型別code=" + code);
}
String getDesc();
Integer getCode();
}
5,po中的配置
public class UserPO implements Serializable {
...
@ColumnType(typeHandler = GenderEnumHandler.class)
private GenderEnum gender;
6,mapper.xml中的配置
<resultMap id="BaseResultMap" type="com.yiwise.core.dal.entity.UserPO">
...
<result column="gender" jdbcType="INTEGER" property="gender"
typeHandler="com.yiwise.core.model.enums.handler.GenderEnumHandler"/>
</resultMap>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4422/viewspace-2821260/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MyBatis TypeHandler的初次接觸MyBatis
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- mybatis-自定義TypeHandler 的坑MyBatis
- MyBatis(九):MyBatis型別處理器(TypeHandler)詳解MyBatis型別
- 兩個案例輕鬆理解MyBatis中的TypeHandler!MyBatis
- MyBatis(三) mybatis-config.xml元素說明、型別處理器typeHandler的使用MyBatisXML型別
- 面試官問:Mybatis中的TypeHandler你用過嗎?面試MyBatis
- 【Mybatis系列】從原始碼角度理解Mybatis的資料轉換器TypeHandlerMyBatis原始碼
- springboot~mybatis-plus中使用TypeHandler做型別對映Spring BootMyBatis型別
- mybatis原始碼解析(五) --- typehandler註冊和處理的查詢結果物件的型別轉換MyBatis原始碼物件型別
- mybatis的基本使用MyBatis
- Mybaitis之自定義TypeHandlerAI
- Mybatis的使用詳解MyBatis
- 如何優雅的使用MyBatis?MyBatis
- MyBatis的新增使用者MyBatis
- 01-MyBatis的基本使用MyBatis
- 如何使用MyBatisMyBatis
- MyBatis-05-MyBatis使用流程簡讀MyBatis
- 初學者Mybatis的初級使用MyBatis
- myBatis——註解,#{}與${},resultMap的使用MyBatis
- MyBatis 使用手冊MyBatis
- MyBatis Generator配置使用MyBatis
- mybatis關於list的foreach的使用MyBatis
- spring-mybatis與原生mybatis使用對比SpringMyBatis
- ibatis和myBatis的逆向工程使用MyBatis
- Mybatis和其他主流框架的整合使用MyBatis框架
- 使用 MyBatis 操作 Nebula Graph 的實踐MyBatis
- Mybatis在Spring中的使用(三)MyBatisSpring
- MyBatis刪除多行,in語句的使用MyBatis
- 使用MyBatis的注意事項有哪些MyBatis
- MyBatis 完全使用指南MyBatis
- Mybatis學習筆記 1:一個Mybatis使用例子MyBatis筆記
- 學習MyBatis必知必會(2)~MyBatis基本介紹和MyBatis基本使用MyBatis
- 大白話講解Mybatis的plugin(Interceptor)的使用MyBatisPlugin
- 總結:使用MyBatis Generator時遇到的坑MyBatis
- Mybatis的 foreach 標籤使用方法.MyBatis
- Mybatis 的使用(整合Spring、SpringBoot)MyBatisSpring Boot
- MyBatis學習——foreach標籤的使用MyBatis