1. 程式人生 > >mybatis處理列舉型別

mybatis處理列舉型別

前言:mybatis自帶兩種對列舉類的處理方式,分別為EnumTypeHandler(預設使用)和EnumOrdinalTypeHandler, 可以使用這兩種方式插入列舉物件的name值和序號值.但在實際的開發中我們常常希望儲存的是列舉類中自定義的一個屬性值(一般是一個int型別的value值),這種情況下我們可以通過以下方式來實現

一: 定義一個通用的泛型列舉介面

package org.power.quickbuy.enums;

public interface IntEnum<E extends Enum<E>> {
	int getIntValue();
}

二:自定義一個Handler類並繼承於BaseTypeHandler
package org.power.quickbuy.enums;

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 IntEnumTypeHandler<E extends Enum<E> & IntEnum<E>> extends BaseTypeHandler<IntEnum> {
	private Class<IntEnum> type;

	public IntEnumTypeHandler(Class<IntEnum> type) {
		if (type == null)
			throw new IllegalArgumentException("Type argument cannot be null");
		this.type = type;
	}

	private IntEnum convert(int status) {
		IntEnum[] objs = type.getEnumConstants();
		for (IntEnum em : objs) {
			if (em.getIntValue() == status) {
				return em;
			}
		}
		return null;
	}

	@Override
	public IntEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
		return convert(rs.getInt(columnName));
	}

	@Override
	public IntEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		return convert(rs.getInt(columnIndex));
	}

	@Override
	public IntEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		return convert(cs.getInt(columnIndex));
	}

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, IntEnum enumObj, JdbcType jdbcType)
			throws SQLException {
		// baseTypeHandler已經幫我們做了parameter的null判斷
		ps.setInt(i, enumObj.getIntValue());

	}
}

三:建立自己的列舉類並實現IntEnum介面
package org.power.quickbuy.enums;

public enum EmpStatus implements IntEnum<EmpStatus> {
	ON_LINE("線上", 1), OFF_LINE("下線", 0), AWAY("離開", 5);
	private String tagName;
	private Integer value;

	private EmpStatus(String tagName, Integer value) {
		this.tagName = tagName;
		this.value = value;
	}

	public String getTagName() {
		return tagName;
	}

	public Integer getValue() {
		return value;
	}

	@Override
	public int getIntValue() {
		// 該處返回的值即為我們希望在資料庫中儲存的值
		return this.value; 
	}

}

四: 在Mapper.xml檔案的插入、查詢等操作中對指定的列舉型別欄位新增typeHandler處理

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.power.quickbuy.dao.EmpMapper">

	<!--實體對映-->
	<resultMap id="empResultMap" type="org.power.quickbuy.entity.Emp">
		<id property="id" column="id" />
		<result property="name" column="name" />
		<result property="status" column="status" typeHandler="org.power.quickbuy.enums.IntEnumTypeHandler" />
	</resultMap>

	<!-- 查詢(根據主鍵ID查詢) -->
	<select id="selectByPrimaryKey" resultMap="empResultMap" parameterType="java.lang.Integer">
		 SELECT
		 	id,
			name,
			status
		 FROM emp
		 WHERE id = #{id}
	</select>

	<!-- 新增 -->
	<insert id="insert" parameterType="emp">
		INSERT IGNORE INTO emp(
			<include refid="Base_Column_List" />
		)VALUES(
			#{id},
			#{name},
			#{status, typeHandler=org.power.quickbuy.enums.IntEnumTypeHandler}
		) 
	</insert>

</mapper>