MyBatis의 매개변수 타입 핸들러(Parameter Type Handler)는 매개변수나 인자 값을 데이터베이스 컬럼 타입으로 변환하거나, 반대로 데이터베이스 컬럼 값을 Java 타입으로 변환하는 데 사용됩니다. 이것은 커스텀 데이터 타입을 처리하거나 특정한 데이터 타입 변환 로직을 적용할 때 유용합니다.
아래는 MyBatis에서 매개변수 타입 핸들러를 사용하는 예제입니다.
예제: 매개변수 타입 핸들러
-
매개변수 타입 핸들러 클래스 생성:
먼저 매개변수 타입 핸들러 클래스를 생성합니다. 이 클래스는 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;
}
}`
-
매개변수 타입 핸들러 등록:
매개변수 타입 핸들러를 MyBatis 설정에 등록합니다. 이를 위해 MyBatis 설정 파일 (예:
mybatis-config.xml
)에typeHandlers
요소를 추가합니다.
<configuration>
<!-- ... -->
<!-- 매개변수 타입 핸들러 등록 -->
<typeHandlers>
<typeHandler handler="com.example.LocalDateTimeTypeHandler"/>
</typeHandlers>
</configuration>`
-
매퍼 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>`
-
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는 설정된 매개변수 타입 핸들러를 사용하여 변환 작업을 수행