准备
- 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.我们来时间操作一把: