자신 만의 TypeHandler
을 만들어야합니다. 공식 문서에서 설명하는 방법은 type handler입니다.
왜? MyBatis로는 PreparedStatement로 매개 변수를 설정 또는 는 ResultSet으로부터 값을 검색 할 때마다
을하는 TypeHandler 자바 유형에 적합한 수단에 값을 검색하는 데 사용된다. 다음 표는 기본 TypeHandlers 인 을 설명합니다.
일반적으로 일반적인 typeHandler가 구현되지만 특별한 경우 다음과 같이해야합니다.
어떻게?
지원되지 않거나 비표준 유형 인 을 처리하기 위해 유형 핸들러를 재정의하거나 직접 처리 할 수 있습니다. 이렇게하려면 인터페이스 org.apache.ibatis.type.TypeHandler를 구현하거나 편의 클래스 org.apache.ibatis.type.BaseTypeHandler를 확장하고 선택적으로 JDBC 유형에 매핑하십시오.
그리고 마지막으로, 당신은 당신의 구성에 새로운 타입의 핸들러를 추가해야합니다 : 귀하의 경우
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="your.pckg.ClobTypeHandler" />
</typeHandlers>
, 당신은 단지 바로 일반적인 Map<String, Object>
로 사용하여 기존 핸들러 BaseTypeHandler
를 확장 할 수 있습니다. 예 :
import java.io.IOException;
import java.io.StringReader;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.codehaus.jackson.map.ObjectMapper;
public class ClobJsonTypeHandler extends BaseTypeHandler<Map<String, Object>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map<String, Object> parameter, JdbcType jdbcType) throws SQLException {
final String parameterString = mapToJson(parameter);
StringReader reader = new StringReader(parameterString);
ps.setCharacterStream(i, reader, parameterString.length());
}
public Map<String, Object> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = "";
Clob clob = rs.getClob(columnName);
if (clob != null) {
int size = (int) clob.length();
value = clob.getSubString(1L, size);
}
return jsonToMap(value);
}
public Map<String, Object> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String value = "";
Clob clob = rs.getClob(columnIndex);
if (clob != null) {
int size = (int) clob.length();
value = clob.getSubString(1L, size);
}
return jsonToMap(value);
}
public Map<String, Object> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = "";
Clob clob = cs.getClob(columnIndex);
if (clob != null) {
int size = (int) clob.length();
value = clob.getSubString(1L, size);
}
return jsonToMap(value);
}
private Map<String, Object> jsonToMap(String from) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(from, HashMap.class);
} catch (IOException e) {
throw new Error();
}
}
private String mapToJson(Map<String, Object> from) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(from);
} catch (IOException e) {
throw new Error();
}
}
}