1、首先定義接口,提供獲取數據庫存取的值得方法,以下:java
public interface BaseEnum { int getCode(); }
package com.camelot.assetcenter.sdk.orm.mybatis; import com.camelot.assetcenter.sdk.common.BaseEnum; import com.camelot.openplatform.common.log.Log; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.slf4j.Logger; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class EnumTypeHandler extends BaseTypeHandler<BaseEnum> { private final static Logger logger = Log.get(EnumTypeHandler.class); private Class<BaseEnum> type; private final BaseEnum[] enums; /** * 設置配置文件設置的轉換類以及枚舉類內容,供其餘方法更便捷高效的實現 * @param type 配置文件中設置的轉換類 */ public EnumTypeHandler(Class<BaseEnum> 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 BaseEnum getNullableResult(ResultSet rs, String columnName) throws SQLException { // 根據數據庫存儲類型決定獲取類型,本例子中數據庫中存放INT類型 logger.debug(columnName); int i = rs.getInt(columnName); if (rs.wasNull()) { return null; } else { // 根據數據庫中的code值,定位EnumStatus子類 return locateEnumStatus(i); } } @Override public BaseEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException { // 根據數據庫存儲類型決定獲取類型,本例子中數據庫中存放INT類型 logger.debug(columnIndex+""); int i = rs.getInt(columnIndex); if (rs.wasNull()) { return null; } else { // 根據數據庫中的code值,定位EnumStatus子類 return locateEnumStatus(i); } } @Override public BaseEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { // 根據數據庫存儲類型決定獲取類型,本例子中數據庫中存放INT類型 logger.debug(columnIndex+""); int i = cs.getInt(columnIndex); if (cs.wasNull()) { return null; } else { // 根據數據庫中的code值,定位EnumStatus子類 return locateEnumStatus(i); } } @Override public void setNonNullParameter(PreparedStatement ps, int i, BaseEnum parameter, JdbcType jdbcType) throws SQLException { // baseTypeHandler已經幫咱們作了parameter的null判斷 logger.debug(parameter.getCode()+"================================="); ps.setInt(i, parameter.getCode()); } /** * 枚舉類型轉換,因爲構造函數獲取了枚舉的子類enums,讓遍歷更加高效快捷 * @param code 數據庫中存儲的自定義code屬性 * @return code對應的枚舉類 */ private BaseEnum locateEnumStatus(int code) { for(BaseEnum status : enums) { if(status.getCode() ==code ) { return status; } } throw new IllegalArgumentException("未知的枚舉類型:" + code + ",請覈對" + type.getSimpleName()); } }
3、在mapper文件中的使用:
<select id="queryOverdueDetail" resultMap="assetUserIntegralDetailMap"> <include refid="selectAllColumns" /> where 1=1 <if test="entity!=null"> <if test="entity.type != null and entity.type !=''"> <![CDATA[ and asset_user_integral_detail_.type = #{entity.type,typeHandler=com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler} ]]> </if> <if test="entity.status != null and entity.status !=''"> <![CDATA[ and asset_user_integral_detail_.status = #{entity.status,typeHandler=com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler} ]]> </if> <if test="entity.createTime != null "> <![CDATA[ and asset_user_integral_detail_.create_time < #{overdueTime} ]]> </if> </if> <if test="limitCount !=null and limitCount != '' "> limit #{limitCount} </if> </select> <resultMap id="assetUserIntegralDetailMap" type="assetUserIntegralDetail"> <result property="userIntegralDetailId" column="user_integral_detail_id" /> <result property="userIntegralId" column="user_integral_id" /> <result property="integral" column="integral" /> <result property="balanceIntegral" column="balance_integral" /> <result property="type" column="type" typeHandler="com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler"/> <result property="businessType" column="business_type" typeHandler="com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler"/> <result property="businessId" column="business_id" /> <result property="source" column="source" typeHandler="com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler"/> <result property="shopId" column="shop_id" /> <result property="status" column="status" typeHandler="com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler"/> <result property="createTime" column="create_time" /> <result property="description" column="description" /> </resultMap> <if test="entity.type != null and entity.type !=''"> <![CDATA[ and asset_user_integral_detail_.type = #{entity.type,typeHandler=com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler} ]]> </if> <if test="entity.businessType != null and entity.businessType !=''"> <![CDATA[ and asset_user_integral_detail_.business_type = #{entity.businessType,typeHandler=com.camelot.assetcenter.sdk.orm.mybatis.EnumTypeHandler} ]]> </if>