mybatis自定义数组类型解析器
准备mybatis pluspostgresql问题最近使用pgsql时使用了数组类型,但是在插入数据或查询的时候不像mysql那么方便,需要特别指定类型。解决方法1.首先先自定义一个TypeHandlerpublic class ArrayTypeHandler extends BaseTypeHandler {private static final String TYPE_NAME_VARC
·
准备
- mybatis plus
- postgresql
问题
最近使用pgsql时使用了数组类型,但是在插入数据或查询的时候不像mysql那么方便,需要特别指定类型。
解决方法
1.首先先自定义一个TypeHandler
public class ArrayTypeHandler extends BaseTypeHandler {
private static final String TYPE_NAME_VARCHAR = "varchar";
private static final String TYPE_NAME_INTEGER = "integer";
private static final String TYPE_NAME_BOOLEAN = "boolean";
private static final String TYPE_NAME_NUMERIC = "numeric";
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
String typeName = null;
if (parameter instanceof Integer[]) {
typeName = TYPE_NAME_INTEGER;
} else if (parameter instanceof String[]) {
typeName = TYPE_NAME_VARCHAR;
} else if (parameter instanceof Boolean[]) {
typeName = TYPE_NAME_BOOLEAN;
} else if (parameter instanceof Double[]) {
typeName = TYPE_NAME_NUMERIC;
}
if (typeName == null) {
throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
}
// 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
Connection conn = ps.getConnection();
Array array = conn.createArrayOf(typeName, parameter);
ps.setArray(i, array);
}
@Override
public Object[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
return getArray(resultSet.getArray(s));
}
@Override
public Object[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
return getArray(resultSet.getArray(i));
}
@Override
public Object[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return getArray(callableStatement.getArray(i));
}
private Object[] getArray(Array array) {
if (array == null) {
return null;
}
try {
return (Object[]) array.getArray();
} catch (Exception e) {
}
return null;
}
}
2.指定字段插入时的数据映射类型
3.mybatis plus 提供的字段注解 @TableField,源码如下
@Override
@Insert("INSERT INTO sys_resource(name,level,status,parentid,type,fromapp) VALUES(#{name},#{level},#{status},#{parentId},#{type},#{fromapp,typeHandler=com.360.cloudservice.typehandler.ArrayTypeHandler})")
void insert(Resource resource);
4.我们来时间操作一把:

![]()
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)