生活随笔
收集整理的這篇文章主要介紹了
MyBatis对于Java对象里的枚举类型处理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
平時咱們寫程序?qū)嶓w類內(nèi)或多或少都會有枚舉類型屬性,方便嘛。但是mybatis里怎么處理他們的增刪改查呢?
要求:
插入的時候,會用枚舉的定義插入數(shù)據(jù)庫,我們希望在數(shù)據(jù)庫中看到的是數(shù)字或者其他東西;
查詢的時候,數(shù)據(jù)庫的值可以自動轉(zhuǎn)換為我們對應(yīng)的枚舉值。
舉例,我有一個這樣的枚舉類型:
Java Code復(fù)制內(nèi)容到剪貼板package?cn.com.shuyangyang.domain;????public?enum?UserStatus?{??????????????DISABLED(0),????????????AVAILABLE(1);????????????private?int?status;????????????UserStatus(int?status){??????????this.status?=?status;??????}????????public?int?getStatus()?{??????????return?status;??????}????????}??我們插入數(shù)據(jù)庫中,數(shù)據(jù)庫應(yīng)該為我們保存0或者1
我們可以使用mybatis自帶的枚舉類型EnumOrdinalTypeHandler
舉例如下:
Java Code復(fù)制內(nèi)容到剪貼板<insert?id="addUser"?parameterType="User">??????INSERT?INTO?t_user(USER_ID,USER_NAME,LOGIN_NAME,??????LOGIN_PASSWORD,USER_STATUS,CREATE_TIME,UPDATE_TIME)??????VALUES(??????????#{user_id},??????????#{user_name},??????????#{login_name},??????????#{login_password},??????????#{user_status,?typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},??????????#{create_time},??????????#{update_time}??????)??</insert>??我們的UserStatus插入的時候是UserStatus.AVAILABLE
執(zhí)行完畢后,看結(jié)果:
看,是不是結(jié)果是我們期望的那樣。
但是問題來了?
我們查詢的時候報錯了:Error querying database. ?Cause: java.lang.IllegalArgumentException: No enum constant cn.com.shuyangyang.mybatis.UserStatus.1
我們可以自定義這樣的一個EnumStatusHandler:
Java Code復(fù)制內(nèi)容到剪貼板package?cn.com.shuyangyang.mybatis;????import?java.sql.CallableStatement;??import?java.sql.PreparedStatement;??import?java.sql.ResultSet;??import?java.sql.SQLException;????import?org.apache.ibatis.type.BaseTypeHandler;??import?org.apache.ibatis.type.JdbcType;?????????????public?class?EnumStatusHandler?extends?BaseTypeHandler<UserStatus>?{????????????private?Class<UserStatus>?type;?????????????private?final?UserStatus[]?enums;??????????????????public?EnumStatusHandler(Class<UserStatus>?type)?{??????????if?(type?==?null)??????????????throw?new?IllegalArgumentException("Type?argument?cannot?be?null");??????????this.type?=?type;??????????this.enums?=?type.getEnumConstants();??????????if?(this.enums?==?null)??????????????throw?new?IllegalArgumentException(type.getSimpleName()??????????????????????+?"?does?not?represent?an?enum?type.");??????}????????@Override??????public?void?setNonNullParameter(PreparedStatement?ps,?int?i,??????????????UserStatus?parameter,?JdbcType?jdbcType)?throws?SQLException?{????????????????????ps.setInt(i,?parameter.getStatus());????????????????}????????@Override??????public?UserStatus?getNullableResult(ResultSet?rs,?String?columnName)??????????????throws?SQLException?{????????????????????int?i?=?rs.getInt(columnName);?????????????????????if?(rs.wasNull())?{??????????????return?null;??????????}?else?{????????????????????????????return?locateEnumStatus(i);??????????}??????}????????@Override??????public?UserStatus?getNullableResult(ResultSet?rs,?int?columnIndex)??????????????throws?SQLException?{????????????????????int?i?=?rs.getInt(columnIndex);??????????if?(rs.wasNull())?{??????????????return?null;??????????}?else?{????????????????????????????return?locateEnumStatus(i);??????????}??????}????????@Override??????public?UserStatus?getNullableResult(CallableStatement?cs,?int?columnIndex)??????????????throws?SQLException?{????????????????????int?i?=?cs.getInt(columnIndex);??????????if?(cs.wasNull())?{??????????????return?null;??????????}?else?{????????????????????????????return?locateEnumStatus(i);??????????}??????}??????????????????????private?UserStatus?locateEnumStatus(int?code)?{??????????for(UserStatus?status?:?enums)?{??????????????if(status.getStatus()==(Integer.valueOf(code)))?{??????????????????return?status;??????????????}??????????}??????????throw?new?IllegalArgumentException("未知的枚舉類型:"?+?code?+?",請核對"?+?type.getSimpleName());??????}????}??mapper.xml里這樣配置:
XML/HTML Code復(fù)制內(nèi)容到剪貼板<resultMap?type="User"?id="userResult">??……省略其他屬性配置??????????<result?column="USER_STATUS"?property="user_status"?typeHandler="cn.com.shuyangyang.mybatis.EnumStatusHandler"/>??……省略其他屬性配置??????</resultMap>??現(xiàn)在來看看結(jié)果:
?[User [user_id=782cba19-559f-41c3-a1b0-25fcac4cf118, user_name=系統(tǒng)管理員, login_name=admin, login_password=admin,user_status=AVAILABLE, create_time=Mon Jan 26 21:17:09 CST 2015, update_time=Mon Jan 26 21:17:09 CST 2015]]
?
完美結(jié)果。
來源:?http://www.shuyangyang.com.cn/jishuliangongfang/Javabiancheng/2015-01-26/229.html
來自為知筆記(Wiz)
總結(jié)
以上是生活随笔為你收集整理的MyBatis对于Java对象里的枚举类型处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。