205. 타입핸들러 (typeHandler)

2012. 4. 19. 14:44공부/MYBATIS

마이바티스가 파라미터를 PreparedStatement에 세팅하거나, ResultSet으로부터 값을 추적할 때마다, 타입핸들러는 알맞은 자바 타입의 값을 추적하기 위해 씌여. 다음 테이블은 타입핸들러 기본값을 보여주지

타입핸들러

자바타입

JDBC 타입
BooleanTypeHandlerjava.lang.BooleanbooleanBOOLEAN과 호환되는 모든것
ByteTypeHandlerjava.lang.Byte, byteNUMERIC 이나 BYTE와 호환되는 모든것
ShortTypeHandlerjava.lang.ShortshortNUMERIC 이나 SHORT INTEGER 와 호환되는 모든것
IntegerTypeHandlerjava.lang.IntegerintNUMERIC 이나 INTEGER와 호환되는 모든것
LongTypeHandlerjava.lang.LonglongNUMERIC 이나 
LONG INTEGER와 호환되는 모든것
FloatTypeHandlerjava.lang.Float, floatNUMERIC 이나 
FLOAT와 호환되는 모든것
DoubleTypeHandlerjava.lang.DoubledoubleNUMERIC 이나 
DOUBLE과 호환되는 모든것
BigDecimalTypeHandlerjava.math.BigDecimalNUMERIC 이나 DECIMAL과 호환되는 모든것
StringTypeHandlerjava.lang.StringCHARVARCHAR
ClobTypeHandlerjava.lang.StringCLOBLONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHARNCHAR
NClobTypeHandlerjava.lang.StringNCLOB
ByteArrayTypeHandlerbyte[]

byte stream 타입과 호환되는 모든것

BlobTypeHandlerbyte[]BLOBLONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER, 혹은 기술되지 않은
EnumTypeHandlerEnumeration TypeVARCHAR

 코드가 저장된것 같은 문자열과 호환되는 (인덱스 아님).

EnumOrdinalTypeHandlerEnumeration TypeNUMERIC 이나 
DOUBLE과 호환되는 위치가 저장되는것과 같은 (코드 그 자체는 아님) 

지원되지 않거나 표준타입이 아닌 녀석들을 다루기 위해 기존 타입을 오버라이드 하거나 새로 만들 수 있어. 그렇게 함으로써, 간단하게 org.apache.ibatis.type.BaseTypeHandler 클래스를 확장하고, 선택적으로 새로 만든 타입핸들러를 JDBC Type으로 매핑할수 있어. 예를 들면.

// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter);
  }

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

  @Override
  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getString(columnIndex);
  }

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getString(columnIndex);
  }
}
<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

이런 타입핸들러를 사용함으로써, 이미 존재하는 자바 스트링 프라퍼티, VARCHAR 파라미터와 results를 위한 타입 핸들러를 오버라이드 할거야. 마이바티는 타입을 결정하기 위해 데이터베이스 메타데이터를 introspect(자체검사?)하지 않는다는 점에 유의해. 그러므로, 정확한 타입핸들러를 연결하기 위해 파라미터의 VARCHAR 필드와 results 매핑을 반드시 기술해야 하지. 이는 마이바티스가 구문이 실행되기 전까지 데이터타입을 알지 못한다는사실에 기인해.

마이바티스는 일반타입을 자체검사하는 이 타입핸들러를 통해 네가 다루고자 하는 자바타입을 알게 될거야. 하지만 두가지 방법으로 이 행위를 오버라이드할 수 있어.

- javatype 속성을 타입핸들러 엘리먼트에 추가 ( 예를들면 : javaType="String")

- @MappedTypes 어노테이션을 관계된 JDBC타입의 리스트를 기술한 타입핸들러 클래스에 추가. 이 어노테이션은 jdbcType 속성이 이미 기술되어 있으면 무시될 것임.

마지막으로 마이바티스가 타입핸들러를 찾도록 할 수 있어

<!-- mybatis-config.xml -->
<typeHandlers>
  <package name="org.mybatis.example"/>
</typeHandlers>

자동탐색 기능을 사용할 때 JDBC 타입은 오로지 어노테이션으로만 기술될 수 있음을 유의하도록 해