扩展预编译 SQL 值处理器

Rabbit SQL 默认支持的值类型都比较少,在不同的框架中还有其特有的值类型,每次都手动处理转换比较麻烦,通过实现接口 com.github.chengyuxing.sql.plugins.StatementValueHandler配置到 BakiDao 来轻松扩展:

public class MyStatementValueHandler implements StatementValueHandler {
    @Override
    public void handle(@NotNull PreparedStatement ps, @Range(from = 1, to = Integer.MAX_VALUE) int index, @Nullable Object value, @NotNull DatabaseMetaData metaData) throws SQLException {
      // ...
      // 这是一个内部实现作为兜底的方法,除非完全自己实现
      JdbcUtil.setStatementValue(ps, index, value);
    }
}

处理 Spring boot MultipartFile ,甚至于如果您有文件服务器或其他存储文件中间件的话,可以截获处理所有文件类型,将文件存储到文件服务器,数据库仅存储文件路径即可:

if (value instanceof MultipartFile) {
   try {
        ps.setBinaryStream(index, ((MultipartFile) value).getInputStream());
        return;
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}

如果传入的值类型为 MapList ,在大多数数据库中并没有与之对应的数据类型,那么默认情况下可序列化为 JSON 较为合理:

if (value instanceof Map<?, ?> || value instanceof List<?>) {
   ps.setString(index, Jackson.toJson(value));
   return;
}

还可以根据不同的数据库来针对性的处理值:

if(metaData.getDatabaseProductName().equalsIgnoreCase("postgresql")){
  // ...
}

在信创中,面对随时更换五花八门的国产数据库,此方法显得尤为重要!