mybatisPlus对于pgSQL中UUID和UUID[]类型的交互

在PGSQL中,有的类型是UUID和UUID[]这种类型,在mybatis和这些类型交互的时候,Java中的类型可以设置为UUID和List(好像也不行,后续看一下),这是兼容的,可以正常读取和更新,但是在使用mybatis-Plus框架时就不行(UUID是好像不报错但是拿不到数据,记不清了),需要手动设置类型处理器才可以,这里记录一下类型处理器的设置

/**
 * UUID类型处理器
 */
public class UUIDTypeHandler extends BaseTypeHandler<UUID> {

    /**
     * 获取结果
     *
     * @param resultSet  resultSet
     * @param columnName 列名
     * @return UUID结果
     * @throws SQLException SQL异常
     */
    @Override
    public UUID getNullableResult(ResultSet resultSet, String columnName)
            throws SQLException {
        return getValue(resultSet.getString(columnName));
    }


    /**
     * 获取结果
     *
     * @param rs          结果集
     * @param columnIndex 列下标
     * @return UUID结果
     * @throws SQLException SQL异常
     */
    @Override
    public UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getValue(rs.getString(columnIndex));
    }


    /**
     * 获取结果
     *
     * @param cs          cs
     * @param columnIndex 列下标
     * @return 返回UUID结果
     * @throws SQLException SQL异常
     */
    @Override
    public UUID getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        return getValue(cs.getString(columnIndex));
    }


    /**
     * 设置参数
     *
     * @param ps        ps
     * @param i         i
     * @param parameter 参数
     * @param jdbcType  jdbc类型
     * @throws SQLException SQL异常
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, UUID parameter, JdbcType jdbcType) throws SQLException {
        if (null != parameter) {
            ps.setObject(i, parameter);
        }
    }


    /**
     * 获取结果
     *
     * @param str 传参字符串
     * @return 返回UUID结果
     */
    private UUID getValue(String str) {
        return notNull(str) ? UUID.fromString(str) : null;
    }


    /**
     * 非空判断
     *
     * @param arg 参数
     * @return 判断是否不为空
     */
    private boolean notNull(String arg) {
        return (null != arg && !arg.isEmpty());
    }
}
/**
 * UUID数组类型处理器
 */
public class UUIDArrTypeHandler extends BaseTypeHandler<List<UUID>> {

    /**
     * 设置参数
     *
     * @param ps        PreparedStatement 对象
     * @param i         参数索引
     * @param parameter UUID 列表
     * @param jdbcType  JDBC 类型
     * @throws SQLException SQL异常
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<UUID> parameter, JdbcType jdbcType) throws SQLException {
        if (parameter != null) {
            Array array = ps.getConnection().createArrayOf("uuid", parameter.toArray());
            ps.setArray(i, array);
        } else {
            ps.setNull(i, Types.ARRAY);
        }
    }


    /**
     * 获取结果
     *
     * @param resultSet 结果集
     * @param columnName 列名
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    @Override
    public List<UUID> getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        return getUUIDList(resultSet.getArray(columnName));
    }


    /**
     * 获取结果
     *
     * @param rs          结果集
     * @param columnIndex 列索引
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    @Override
    public List<UUID> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getUUIDList(rs.getArray(columnIndex));
    }


    /**
     * 获取结果
     *
     * @param cs          CallableStatement 对象
     * @param columnIndex 列索引
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    @Override
    public List<UUID> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return getUUIDList(cs.getArray(columnIndex));
    }


    /**
     * 获取 UUID 列表
     *
     * @param array SQL 数组对象
     * @return UUID 列表
     * @throws SQLException SQL异常
     */
    private List<UUID> getUUIDList(Array array) throws SQLException {
        if (array == null) {
            return null;
        }
        Object[] uuidArray = (Object[]) array.getArray();
        List<UUID> result = new ArrayList<>();
        for (Object obj : uuidArray) {
            result.add((UUID) obj);
        }
        return result;
    }
}

配置完之后需要在实体类的对应属性上添加注解以使其生效

@TableField(typeHandler = UUIDTypeHandler.class)
private UUID uuid;
@TableField(typeHandler = UUIDArrTypeHandler.class)
private List<UUID> memberBenefitUuids;
MybatisPlus是一个增强版的Mybatis框架,它在Mybatis的基础上提供了很多便利的功能。对于调用PostgreSQL数据库的存储过程,MybatisPlus也支持通过映射文件或者注解的方式来进行调用。 使用MybatisPlus调用PostgreSQL存储过程的步骤通常包括以下几个方面: 1. **创建存储过程**:首先需要在PostgreSQL数据库创建你需要调用的存储过程。这通常通过SQL语句来完成,如使用`CREATE PROCEDURE`语句。 2. **配置MybatisPlus**:在MybatisPlus的配置文件,确保已经配置了与PostgreSQL数据库连接的相关信息,如数据库URL、用户名、密码等。 3. **编写映射文件或注解**:在MybatisPlus的映射文件添加对存储过程的调用配置,或者使用MybatisPlus的注解来实现调用。这通常涉及到`<selectKey>`、`<insert>`、`<update>`、`<delete>`或`<select>`标签的`statementType`属性,将其设置为`CALLABLE`。 下面是一个简单的例子,展示如何在MybatisPlus通过映射文件调用存储过程: ```xml <mapper namespace="com.example.mapper.UserMapper"> <!-- 假设已经有一个名为'findUserById'的存储过程 --> <select id="callFindUserById" statementType="CALLABLE"> {call findUserById(#{userId, jdbcType=INTEGER, mode=IN})} </select> </mapper> ``` 然后在业务代码,你可以这样调用这个映射方法: ```java UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> parameters = new HashMap<>(); parameters.put("userId", 1); userMapper.callFindUserById(parameters); ``` 在这个例子,你需要确保传递给`callFindUserById`方法的参数与存储过程期望的参数匹配,并且处理好返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值