Member.java - 멤버의 상태를 가지고 있다. 성별필드(Sex)는 내부 enum으로 되어 있다.

public class Member {
    private String id;
    private String name;
    private Sex sex;
    
    public static enum Sex {
        MALE,
        FEMALE
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
//나머지 get/set 메소드 생략
}


MemberDao.java - ibatis를 이용하여 데이타베이스와 연결되어 입력, 수정, 삭제, 가져오기등의 CRUD작업을 처리하는 곳이다.
내부클래스 EventTypeHandler는 IBATIS가 set/get메소드를 호출할때 enum타입을 변환시킬 수 있도록 도와준다. 실제적인 일은 상속받은 EnumTypeHandler 클래스가 한다.

public class MemberDAO extends SqlMapClientDaoSupport {
    public Member select(String id){
        return (Member)getSqlMapClientTemplate().
queryForObject("Member.select", id);
    }
    
    public static class EventTypeHandler extends 
EnumTypeHandler<Member.Sex> {
        public EventTypeHandler() {
            super(Member.Sex.class);
        }
    }
}


EnumTypeHandler.java - enum타입으로 변환을 위해 실제적인 역할을 하는 클래스이다. 라이브러리처럼 이용하면 된다.

import java.sql.SQLException;
import java.sql.Types;

import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;

public abstract class EnumTypeHandler<E extends Enum<E>> implements 
TypeHandlerCallback {
    private Class<E> enumClass;
    
    public EnumTypeHandler(Class<E> enumClass){
        this.enumClass = enumClass;
    }

    public Object getResult(ResultGetter getter) throws SQLException {
        String result = getter.getString();
        if (getter.wasNull()) {
            return null;
        }
        return valueOf(result);
    }

    @SuppressWarnings("unchecked")
    public void setParameter(ParameterSetter setter, Object parameter)
            throws SQLException {
        if (parameter == null) {
            setter.setNull(Types.VARCHAR);
        } else {
            setter.setString(((E)parameter).name());
        }
    }

    public Object valueOf(String s) {
        return Enum.valueOf(enumClass, s);
    }
}


Member.xml - 자바객체와 sql문의 매핑파일로 주목할 곳은 typeHandler 설정부분이다. javaType="kr.pe.innerman.Member$Sex" 처럼 내부클래스는 $를 사용하여 접근한다.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" 
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Member">

    <typeAlias alias="Member" type="kr.pe.innerman.Member"/>
    <typeHandler javaType="kr.pe.innerman.Member$Sex" 
        callback="kr.pe.innerman.MemberDAO$EventTypeHandler"/>

    <resultMap id="result" class="Member">
        <result property="id" column="id" />
        <result property="name" column="name" />
        <result property="sex" column="sex" />
    </resultMap>

    <select id="select" resultMap="result">
        SELECT * FROM member WHERE id=#value#
    </select>
</sqlMap>