Какие есть альтернативы драйверу JDBC для доступа к базе данных PostgreSQL? - PullRequest
5 голосов
/ 04 февраля 2011

Я использую официальный драйвер JDBC для PostgreSQL, но я застрял со следующими проблемами:

  • Нет поддержки структур данных PostgreSQL-ish, таких как UUID.
  • Распространенная странность JDBC, такая как:
    • Нет функции для экранирования значений для потребления PostgreSQL.
    • Ограниченная поддержка выполнения гетерогенных операторов в пакете.
    • Нет переписывания нескольких операторов вставкив одном операторе вставки при вставке множества строк в одну таблицу.

Итак, вопрос - существует ли какой-либо драйвер базы данных PostgreSQL, который может использовать всю мощь PostgreSQL без большого количества шаблонов?Я также использую язык Scala для разработки, поэтому, если драйвер разработан специально для Scala, это будет очень круто.

Ответы [ 5 ]

9 голосов
/ 04 февраля 2011

Некоторые из них, кажется, (если я не понимаю) ошибка пользователя при использовании JDBC.JDBC - довольно уродливый API, поэтому никогда не спрашивайте, можете ли вы сделать это элегантно, просто спросите, можете ли вы сделать это вообще.

Экранирование и вставка нескольких строк должны обрабатываться, как указали @ColinD и @a_horse, с подготовленными выписками и пакетными операциями.Под капотом я бы ожидал, что хорошая реализация 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);
    }
}

Тогда следующий код выполнится успешно:

 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();
4 голосов
/ 04 февраля 2011

Драйвер поддерживает пакетные операторы для ускорения массовых вставок.

И использование пакетных операторов намного более переносимо, чем использование проприетарного синтаксиса INSERT (и, насколько я могу судить, между многострочными и пакетными вставками нет большой разницы)

Изучите PreparedStatement.addBatch ()

Причина, по которой UUID не поддерживается, вероятно, состоит в том, что UUID не является частью ядра Postgres, а является просто модулем contrib.

Редактировать Относительно выполнения гетерогенных операторов

Драйвер Postgres поддерживает различные типы операторов в пакете.

Следующее работает отлично:

Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "foo", "bar");
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("create table foo (id integer, data varchar(100))");
stmt.addBatch("insert into foo values (1, 'one')");
stmt.addBatch("insert into foo values (2, 'two')");
stmt.addBatch("update foo set data = 'one_other' where id = 1");
stmt.executeBatch();
con.commit();

Хотя вы теряете автоматическое экранирование, которое дает вам PreparedStatement.

3 голосов
/ 21 февраля 2012

Я понимаю, что это не отвечает на весь ваш вопрос, но, надеюсь, все равно будет полезно.

Я использую Java 6 и Postgres 8.4. Драйвер, который я использую, находится в моем файле Maven POM как:

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>8.4-702.jdbc4</version>
</dependency>

Я использую PreparedStatement.getObject() и PreparedStatement.setObject() с классом Java java.util.UUID для извлечения и хранения UUID.

Например:

pstm.setObject(1, guid); //where pstm is a PreparedStatement and guid is a UUID

и

//where rs is a ResultSet
UUID myGuid = (UUID) rs.getObject("my_uuid_column_name"); 

Работает нормально.

Для более новых драйверов также поддерживается следующее

UUID myGuid = rs.getObject("my_uuid_column_name", UUID.class); 
1 голос
/ 28 июня 2013

Нет поддержки таких структур данных PostgreSQL, как UUID.

Напротив, текущий драйвер JDBC (9.2-1002 JDBC 4) для Postgres 9.x действительно поддерживает UUID с помощью команд setObject и getObject .Вы не можете получить ничего более прямого или более простого, чем это (в любой базе данных, Postgres или любой другой), потому что JDBC не распознает UUID как тип данных.

Насколько я могу судить, нет необходимости создаватьвспомогательный класс, как это было предложено в другом ответе Ишая.

Нет необходимости выполнять кастинг или просматривать строки.

enter image description here

См. мое сообщение в блоге для дополнительного обсуждения и примера кода.

Пример кода:

java.util.UUID uuid = java.util.UUID.randomUUID();
…
preparedStatement.setObject( nthPlaceholder++, uuid ); // Pass UUID to database.
0 голосов
/ 29 апреля 2011

Взгляните на O / R Broker , библиотеку Scala JDBC для доступа к реляционной базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...