[Mybatis] 매개변수 타입 핸들러(Parameter Type Handler) 예제

MyBatis의 매개변수 타입 핸들러(Parameter Type Handler)는 매개변수나 인자 값을 데이터베이스 컬럼 타입으로 변환하거나, 반대로 데이터베이스 컬럼 값을 Java 타입으로 변환하는 데 사용됩니다. 이것은 커스텀 데이터 타입을 처리하거나 특정한 데이터 타입 변환 로직을 적용할 때 유용합니다.

아래는 MyBatis에서 매개변수 타입 핸들러를 사용하는 예제입니다.

예제: 매개변수 타입 핸들러

  1. 매개변수 타입 핸들러 클래스 생성:

    먼저 매개변수 타입 핸들러 클래스를 생성합니다. 이 클래스는 MyBatis의 TypeHandler 인터페이스를 구현하고, 데이터베이스 컬럼 타입과 Java 타입 간의 변환 로직을 정의합니다.

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;

public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, LocalDateTime localDateTime, JdbcType jdbcType) throws SQLException {
        preparedStatement.setTimestamp(i, Timestamp.valueOf(localDateTime));
    }

    @Override
    public LocalDateTime getNullableResult(ResultSet resultSet, String s) throws SQLException {
        Timestamp timestamp = resultSet.getTimestamp(s);
        if (timestamp != null) {
            return timestamp.toLocalDateTime();
        }
        return null;
    }

    @Override
    public LocalDateTime getNullableResult(ResultSet resultSet, int i) throws SQLException {
        Timestamp timestamp = resultSet.getTimestamp(i);
        if (timestamp != null) {
            return timestamp.toLocalDateTime();
        }
        return null;
    }

    @Override
    public LocalDateTime getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        Timestamp timestamp = callableStatement.getTimestamp(i);
        if (timestamp != null) {
            return timestamp.toLocalDateTime();
        }
        return null;
    }
}` 
  1. 매개변수 타입 핸들러 등록:

    매개변수 타입 핸들러를 MyBatis 설정에 등록합니다. 이를 위해 MyBatis 설정 파일 (예: mybatis-config.xml)에 typeHandlers 요소를 추가합니다.

<configuration>
    <!-- ... -->
    
    <!-- 매개변수 타입 핸들러 등록 -->
    <typeHandlers>
        <typeHandler handler="com.example.LocalDateTimeTypeHandler"/>
    </typeHandlers>
</configuration>` 
  1. 매퍼 XML 파일 작성:

    매개변수 타입 핸들러를 사용하여 데이터베이스 컬럼과 Java 타입 간의 변환을 설정합니다.

<!-- EventMapper.xml -->
<mapper namespace="com.example.EventMapper">
    <select id="getEventsAfterDateTime" resultType="com.example.Event">
        SELECT id, name, event_time
        FROM events
        WHERE event_time > #{dateTime, typeHandler=com.example.LocalDateTimeTypeHandler}
    </select>
</mapper>` 
  1. Java 코드에서 매개변수 사용:

    Java 코드에서는 매개변수로 LocalDateTime을 전달하며, MyBatis는 매개변수 타입 핸들러를 사용하여 데이터베이스 쿼리로 전달할 때 변환을 처리합니다.

@SpringBootApplication
public class MybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisApplication.class, args);
    }

    @Autowired
    private SqlSession sqlSession;

    public void queryEventsAfterDateTime(LocalDateTime dateTime) {
        List<Event> events = sqlSession.selectList("com.example.EventMapper.getEventsAfterDateTime", dateTime);

        for (Event event : events) {
            System.out.println("Event ID: " + event.getId());
            System.out.println("Event Name: " + event.getName());
            System.out.println("Event Time: " + event.getEventTime());
        }
    }
}` 

위의 예제에서는 LocalDateTimeTypeHandler를 사용하여 LocalDateTime 타입을 데이터베이스의 TIMESTAMP 타입으로 변환하고, 매개변수로 전달할 때 자동으로 변환되도록 설정했습니다. MyBatis는 설정된 매개변수 타입 핸들러를 사용하여 변환 작업을 수행