마이바티스를 이용하여 자바 객체와 데이터베이스 테이블을 매핑할 때 서로 완전히 다른 타입의 것들을 사용할 때가 있습니다.
그 예로 대표적인 예가 자바의 Boolean 과 데이터베이스의 플래그 문자입니다.
오라클 같은경우 boolean 타입이 없기 때문에 보통 CHAR(1) 잡고 Y/N 값을 많이 사용합니다.
다른 경우는 1 or 0 을 사용하여 참/거짓, 사용/미사용, 차단/허용 같은 on/off 플래그 값을 사용합니다.
값 |
자바 |
데이터베이스 | |
boolean |
CHAR(1) |
INTEGER | |
참 / 사용 |
true |
Y |
1 |
거짓 / 미사용 |
false |
N |
0 |
org.apache.ibatis.type.TypeHandler 인터페이스를 이용해서 서로 다른 타입을 연결할 수 있습니다.
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;
public class StringYnTypeHandler implements TypeHandler<Boolean> {
private Logger logger = Logger.getLogger(getClass());
public Boolean getResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
return parseBoolean(s);
}
public Boolean getResult(ResultSet rs, int columnIndex) throws SQLException {
String s = rs.getString(columnIndex);
return parseBoolean(s);
}
public Boolean getResult(CallableStatement cs, int columnIndex)
throws SQLException {
String s = cs.getString(columnIndex);
return parseBoolean(s);
}
public void setParameter(PreparedStatement ps, int i, Boolean bool,
JdbcType jdbcType) throws SQLException {
ps.setString(i, parseString(bool));
}
// "Y" or "N" -> true or false
private boolean parseBoolean(String s) {
boolean bool = false;
if (s == null) {
return false;
}
s = s.trim().toUpperCase();
if (s.length() == 0) {
return false;
}
// allow "Y" or "N"
if ("Y".equals(s) == false && "N".equals(s) == false) {
throw new PersistenceException("value must be \"Y\" or \"N\".");
}
bool = "Y".equals(s);
if (logger.isDebugEnabled()) {
logger.debug("\"" + s + "\" -> " + bool);
}
return bool;
}
// true or false -> "Y" or "N"
private String parseString(Boolean bool) {
String s = (bool != null && bool == true) ? "Y" : "N";
if (logger.isDebugEnabled()) {
logger.debug(bool + " -> " + "\"" + s + "\"");
}
return s;
}
}
이 클래스를 이용하면 자바에서는 boolean 타입을 사용하면 데이터베이스에서는 Y or N 값이 들어가게 됩니다.
위 샘플은 메이븐 프로젝트 구조입니다.
샘플을 만드는 도중에 sqlite3 는 이상한게 TIMESTAMP 타입을 java.util.Date 클래스와 매핑 하면 들어갈 때는 그대로 들어가는데 조회할 때는 java.util.String 이 나오는군요....
그래서 TIMESTAMP 에 대한 핸들러 하나 더 만들었습니다.
테스트는 com.tistory.antop.mybatis.TypeHandlerTest 클래스 입니다. JUnit 입니다.
실행시 Run Configurations 중 VM 옵션에 이래와 같이 "-Dlog4j.configuration=config/properties/log4j.properties" 를 추가해 줘야 로그를 볼 수 있습니다.
'Java+ > Example' 카테고리의 다른 글
LOGBack Configurator with JMX (0) | 2014.07.20 |
---|---|
현지어로 언어명 보여주기 (0) | 2014.02.09 |
2014년 도로명 주소 사용에 따른 우편번호 준비 (2) | 2013.12.22 |
JSTL Custom Tag using Spring Beans (0) | 2013.12.01 |
Spring Message Source from Database (1) | 2013.03.03 |
Infinite Routing DataSource (1) | 2013.01.13 |
Using AUTO_INCREMENT keys (0) | 2011.03.01 |