Mybatis中自定義TypeHandler處理枚舉的示例代碼
MyBatis
枚舉類型
枚舉類型,在 Java 中屬于基本數(shù)據(jù)類型,而不是構(gòu)造數(shù)據(jù)類型,用于聲明一組命名的常數(shù)。枚舉可以根據(jù) Integer 、Long 、Short 或 Byte 中的任意一種數(shù)據(jù)類型來創(chuàng)建一種新型變量。這種變量可以設(shè)置為已經(jīng)定義的一組之中的一個(gè),有效防止用戶提供無效值,使代碼更加清晰。
簡單示例:
首先,創(chuàng)建枚舉類型 UserState
package cn.edu.MyBatisDemo.enums; //使用枚舉將實(shí)體類 User 的 state 屬性設(shè)定為三種狀態(tài) public enum UserState { //每個(gè)枚舉對象有四種值:索引值(從0開始)、名字(如 OnLine )、屬性1(如343)、屬性2(如在線) OnLine(343,"在線"), OffLine(8899,"離線"), BeBusy(1414,"忙碌"); private int code; //定義括號(hào)中第一個(gè)屬性 private String msg; //定義括號(hào)中第二個(gè)屬性 private UserState(int code,String msg){ this.code = code; this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } //通過 code 值獲取對應(yīng)的枚舉對象 public static UserState getUserStateByCode(int code){ if(code == 343){ return UserState.OnLine; } else if (code == 8899){ return UserState.OffLine; } else { return UserState.BeBusy; } } }
然后,創(chuàng)建獲取枚舉對象四種值的測試類 EnumTest
package cn.edu.MyBatisDemo.test; import cn.edu.MyBatisDemo.enums.UserState; import org.junit.Test; public class EnumTest { @Test public void enumTest(){ UserState userState = UserState.OnLine; //獲取枚舉對象的四種值 System.out.println(userState.ordinal()); //索引值 System.out.println(userState.name()); //名字 System.out.println(userState.getCode()); //屬性1 System.out.println(userState.getMsg()); //屬性2 } }
最后,測試結(jié)果,結(jié)果如圖:
typeHandler
typeHandler,是 MyBatis 中的一個(gè)接口,用于處理數(shù)據(jù)庫中的特定數(shù)據(jù)類型。MyBatis 默認(rèn)提供了兩個(gè)枚舉數(shù)據(jù)類型的 typeHandler — EnumTypeHandler 和 EnumOrdinalTypeHandler 。在 MyBatis 中,也可以通過自定義 typeHandler 來處理數(shù)據(jù)庫中的特定數(shù)據(jù)類型。另外,創(chuàng)建自定義的 typeHandler ,需要實(shí)現(xiàn) typeHandler 接口,并實(shí)現(xiàn)其中的幾個(gè)方法。下面簡單介紹創(chuàng)建自定義 typeHandler 來處理枚舉類型。
簡單示例:
首先,創(chuàng)建一個(gè)數(shù)據(jù)表 enum_user
表結(jié)構(gòu)信息如圖:
接著,通過 Generator 來根據(jù)數(shù)據(jù)庫表結(jié)構(gòu)自動(dòng)生成對應(yīng)的實(shí)體類、DAO 接口和 SQL 映射文件
然后,在自動(dòng)生成后,需要將實(shí)體類 state 屬性的類型修改為 UserState 類型,同時(shí)添加上 toString() 方法
另外,還需要將 SQL 映射文件中所有 state 指定的 jdbcType 部分去除
在創(chuàng)建自定義 typeHandler 前,先了解 typeHandler 默認(rèn)使用的是 EnumTypeHandler ,屬性 state 信息在數(shù)據(jù)庫中的值為四種值中的名字(BeBusy);而若指定使用 EnumOrdinalTypeHandler ,則屬性 state 信息在數(shù)據(jù)庫中的值為四種值中的索引值(2)
這些往往不是所需要的結(jié)果。所以,需要?jiǎng)?chuàng)建自定義 typeHandler 將屬性 state 信息在數(shù)據(jù)庫中的值設(shè)定為四種值中的屬性1(1414)。創(chuàng)建實(shí)現(xiàn) TypeHandler< T > 接口的類 CustomTypeHandler
package cn.edu.MyBatisDemo.enums; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class CustomTypeHandler implements TypeHandler<UserState> { @Override public void setParameter(PreparedStatement preparedStatement, int i, UserState userState, JdbcType jdbcType) throws SQLException { preparedStatement.setObject(i,userState.getCode()); } @Override public UserState getResult(ResultSet resultSet, String s) throws SQLException { int code = resultSet.getInt(s); return UserState.getUserStateByCode(code); } @Override public UserState getResult(ResultSet resultSet, int i) throws SQLException { int code = resultSet.getInt(i); return UserState.getUserStateByCode(code); } @Override public UserState getResult(CallableStatement callableStatement, int i) throws SQLException { int code = callableStatement.getInt(i); return UserState.getUserStateByCode(code); } }
隨之,在全局配置文件 mybatis.xml 中配置指定使用自定義的 typeHandler
<typeHandlers> <typeHandler handler="cn.edu.MyBatisDemo.enums.CustomTypeHandler" javaType="cn.edu.MyBatisDemo.enums.UserState" /> </typeHandlers>
最后,測試結(jié)果
結(jié)果如圖:
到此這篇關(guān)于Mybatis中自定義TypeHandler處理枚舉詳解的文章就介紹到這了,更多相關(guān)Mybatis自定義TypeHandler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis?typeHandler接口的定義和使用
- MyBatis中的自定義TypeHandler詳解
- Mybatis的TypeHandler實(shí)現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中TypeHandler使用小結(jié)
- SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
- Mybatis使用typeHandler加密的實(shí)現(xiàn)
- MyBatis-Plus?中?typeHandler?的使用實(shí)例詳解
- MyBatis中TypeHandler的使用教程詳解
- MyBatis類型處理器TypeHandler的作用及說明
- MyBatis自定義TypeHandler實(shí)現(xiàn)字段加密解密
相關(guān)文章
Java零基礎(chǔ)教程之Windows下安裝 JDK的方法圖解
這篇文章主要介紹了Java零基礎(chǔ)教程之Windows下安裝 JDK的方法圖解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09Java之Pattern.compile函數(shù)用法詳解
這篇文章主要介紹了Java之Pattern.compile函數(shù)用法詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Javaweb使用cors完成跨域ajax數(shù)據(jù)交互
本文由跨域、cors的概念開始,進(jìn)而向大家介紹了Javaweb使用cors完成跨域ajax數(shù)據(jù)交互的相關(guān)內(nèi)容,需要的朋友可以了解下。2017-09-09