什么是用于访问PostgreSQL数据库的JDBC驱动程序的替代方案

and*_*opp 6 java postgresql scala jdbc

我正在为PostgreSQL使用官方JDBC驱动程序,但我遇到了以下问题:

  • 不支持PostgreSQL-ish数据结构,如UUID.
  • 常见的JDBC奇怪之处,例如:
    • 没有函数来转义PostgreSQL使用的值.
    • 批量执行异构语句的有限支持.
    • 在一个表中插入多行时,不会将多个insert语句重写为单个insert语句.

所以,问题是 - 是否有任何PostgreSQL数据库驱动程序可以利用PostgreSQL的全部功能而没有太多样板?我也使用Scala语言进行开发,所以如果驱动程序是专门为Scala设计的,那就太棒了.

Yis*_*hai 10

其中一些似乎是(除非我不理解)使用JDBC时的用户错误.JDBC是一个非常丑陋的API,所以永远不要问你是否可以优雅地做到这一点,只要问你是否可以做到这一点.

正如@ColinD和@a_horse指出的那样,应该使用Prepared语句和批处理操作来处理转义和插入多行.在引擎盖下,我希望有一个很好的JDBC实现来做你想要的事情(我不熟悉PostgreSQL的实现).

关于UUID,是一个解决方案:

PostgreSQL可以做的就是将字符串文字转换为uuid.

您可以使用数据类型org.postgresql.util.PGobject来使用它,这是一个用于表示JDBC未知的数据类型的通用类.

您可以定义一个辅助类:

public class UUID extends org.postgresql.util.PGobject {
    public static final long serialVersionUID = 668353936136517917L;
    public UUID(String s) throws java.sql.SQLException {
        super();
        this.setType("uuid");
        this.setValue(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后下面的代码将成功:

 java.sql.PreparedStatement stmt =
 conn.prepareStatement("UPDATE t SET uid = ? WHERE id = 1");
 stmt.setObject(1, new UUID("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11"));
 stmt.executeUpdate();
Run Code Online (Sandbox Code Playgroud)