mybatis自定义数组类型解析器

准备

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

猜你喜欢

转载自blog.csdn.net/lchmyhua88/article/details/118268357