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异常*/@Overridepublic UUID getNullableResult(ResultSet resultSet, String columnName)throws SQLException {return getValue(resultSet.getString(columnName));}/*** 获取结果** @param rs 结果集* @param columnIndex 列下标* @return UUID结果* @throws SQLException SQL异常*/@Overridepublic UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return getValue(rs.getString(columnIndex));}/*** 获取结果** @param cs cs* @param columnIndex 列下标* @return 返回UUID结果* @throws SQLException SQL异常*/@Overridepublic 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异常*/@Overridepublic 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异常*/@Overridepublic 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异常*/@Overridepublic List<UUID> getNullableResult(ResultSet resultSet, String columnName) throws SQLException {return getUUIDList(resultSet.getArray(columnName));}/*** 获取结果** @param rs 结果集* @param columnIndex 列索引* @return UUID 列表* @throws SQLException SQL异常*/@Overridepublic List<UUID> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return getUUIDList(rs.getArray(columnIndex));}/*** 获取结果** @param cs CallableStatement 对象* @param columnIndex 列索引* @return UUID 列表* @throws SQLException SQL异常*/@Overridepublic 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;