/
AbstractJsonTypeHandler.java
76 lines (71 loc) · 2.39 KB
/
AbstractJsonTypeHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package org.yipuran.mybatis.types;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
/**
* Abstract JSONタイプハンドラ.
* <PRE>
* Jackson JSON prosessor による JSON タイプハンドラ抽象クラスで継承して使用する。
* 継承先で com.fasterxml.jackson.databind.module.SimpleModule を返す抽象メソッドで
* 任意のJSONシリアライザまたは、JSONデシリアライザを設定することが可能である。
* </PRE>
* @since 4.7
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
public abstract class AbstractJsonTypeHandler<T> extends BaseTypeHandler<T> {
private ObjectMapper mapper;
private Class<T> clazz;
public abstract SimpleModule getModule();
/**
* コンストラクタ
* @param clazz JSONマッピング対象のクラス
*/
public AbstractJsonTypeHandler(Class<T> clazz) {
if (clazz==null) throw new IllegalArgumentException("Type argument cannot be null");
this.clazz = clazz;
SimpleModule module = getModule();
if (module==null) {
mapper = new ObjectMapper();
}else{
mapper = new ObjectMapper().registerModule(module);
}
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
try{
ps.setString(i, mapper.writeValueAsString(parameter));
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.toObject(rs.getString(columnName), clazz);
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.toObject(rs.getString(columnIndex), clazz);
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.toObject(cs.getString(columnIndex), clazz);
}
@SuppressWarnings("unchecked")
private T toObject(String content, Class<?> clazz) {
if (content != null && !content.isEmpty()) {
try{
return (T)mapper.readValue(content, clazz);
}catch(Exception e){
throw new RuntimeException(e);
}
}else{
return null;
}
}
}