上一篇手动版https://blog.csdn.net/h785160953/article/details/103615458
自定义的TypeHandler
- 1、
JsonTypeHandler.java
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 数据库字段string - Java对象互转handler
*
* @author Leo.Xi
* @date 2019/12/18
* @since 1.0
**/
@MappedJdbcTypes({
JdbcType.VARCHAR, JdbcType.CHAR, JdbcType.NCHAR, JdbcType.LONGVARCHAR})
public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {
public static final String ID_TEMPLATE = "{\"id\":\"%s\"}";
private Class<? extends T> clazz;// clazz
private DwDaoHandler.Type type;// 序列化类型
public JsonTypeHandler(Class<? extends T> clazz) {
if (clazz == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.clazz = clazz;
this.type = DwMybatisConfig.getSingleType(clazz);
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
if (DwDaoHandler.Type.JSON.equals(type)) {
// JSON
ps.setString(i, JsonUtils.toNoNullJsonStr(parameter));
} else {
ps.setString(i, ((BaseDomain) parameter).getId());
}
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
if (DwDaoHandler.Type.JSON.equals(type)) {
// JSON
return JsonUtils.readValue(rs.getString(columnName), clazz);
} else {
return JsonUtils.readValue(String.format(ID_TEMPLATE, rs.getString(columnName)), clazz);
}
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
if (DwDaoHandler.Type.JSON.equals(type)) {
// JSON
return JsonUtils.readValue(rs.getString(columnIndex), clazz);
} else {
return JsonUtils.readValue(String.format(ID_TEMPLATE, rs.getString(columnIndex)), clazz);
}
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
if (DwDaoHandler.Type.JSON.equals(type)) {
// JSON
return JsonUtils.readValue(cs.getString(columnIndex), clazz);
} else {
return JsonUtils.readValue(String.format(ID_TEMPLATE, cs.getString(columnIndex)), clazz);
}
}
}
- 2、
JsonListTypeHandler.java
import com.fasterxml.jackson.core.type.TypeReference;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 数据库字段string - Java对象互转handler
*
* @author Leo.Xi
* @date 2019/12/18
* @since 1.0
**/
@MappedJdbcTypes({
JdbcType.VARCHAR, JdbcType.CHAR, JdbcType.NCHAR, JdbcType.LONGVARCHAR})
public class JsonListTypeHandler<T extends Object> extends BaseTypeHandler<List<T>> {
private Class<? extends T> clazz;// clazz
private DwDaoHandler.Type type;// 序列化类型
public JsonListTypeHandler(Class<? extends T> clazz) {
if (clazz == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.clazz = clazz;
this.type = DwMybatisConfig.getCollectionType(clazz);
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
if (DwDaoHandler.Type.JSON.equals(type)) {
// JSON
ps.setString(i, JsonUtils.toNoNullJsonStr(parameter));
} else {
String value = parameter.stream().map(x -> (BaseDomain) x).map(BaseDomain::getId).collect(Collectors.joining(
","));
ps.setString(i, value);
}
}
@Override
public List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
if (value == null) {
return null;
}
List<T> result = new LinkedList<>();
if (DwDaoHandler.Type.JSON.equals(type)) {
// JSON
List<T> ts = JsonUtils.readValue(value, new TypeReference<List<T>>() {
});
if (ts != null) {
ts.forEach(x -> {
T t = JsonUtils.convertValue(x, clazz);
if(null == t){
// throw RuntimeException
} else {
result.add(t);
}
});
return result;
}
} else {
String[] ids = value.split