[Mybatis] TypeHandler 개념과 예제

TypeHandler는 MyBatis에서 데이터베이스의 데이터 타입과 자바 객체의 필드 타입 간의 매핑을 커스터마이징하기 위한 인터페이스입니다. 데이터베이스의 특정 데이터 타입과 자바 객체 간에 변환 로직을 정의하여 사용할 수 있습니다. 아래는 TypeHandler의 개념과 예제입니다.

예제: Custom TypeHandler

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CustomStringTypeHandler implements TypeHandler<String> {

    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
        if (s != null) {
            preparedStatement.setString(i, s.toUpperCase());
        } else {
            preparedStatement.setNull(i, jdbcType.TYPE_CODE);
        }
    }

    @Override
    public String getResult(ResultSet resultSet, String columnName) throws SQLException {
        return resultSet.getString(columnName).toLowerCase();
    }

    @Override
    public String getResult(ResultSet resultSet, int columnIndex) throws SQLException {
        return resultSet.getString(columnIndex).toLowerCase();
    }

    @Override
    public String getResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        return callableStatement.getString(columnIndex).toLowerCase();
    }
}` 

위의 예제에서는 TypeHandler<String> 인터페이스를 구현하여 String 타입의 커스텀 매핑을 정의하고 있습니다. setParameter 메서드를 오버라이드하여 데이터베이스에 값을 설정할 때 대문자로 변환하여 저장하도록 하였고, getResult 메서드를 오버라이드하여 조회 결과를 소문자로 변환하여 반환하도록 하였습니다.

TypeHandler를 사용하기 위해서는 매퍼 XML 파일에서 해당 TypeHandler를 등록해주어야 합니다.

매퍼 XML 파일:

BookMapper.xml:

<typeHandlers>
  <typeHandler handler="com.example.CustomStringTypeHandler"/>
</typeHandlers>

<select id="selectBookTitle" resultType="String">
  SELECT title FROM books WHERE id = #{id}
</select>` 

위의 예제에서는 CustomStringTypeHandler를 등록하고, 매퍼 XML 파일에서 해당 TypeHandler를 사용하여 커스텀 타입 매핑을 적용하고 있습니다.

이렇게 하면 데이터베이스의 값과 자바 객체의 값을 변환하거나 가공하는 로직을 TypeHandler를 통해 커스터마이징할 수 있습니다.