2011-02-04 3 views
5

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

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

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

+7

не должна вытекающая быть обработана для вас с помощью 'PreparedStatement' и установки значений в нем? Пакетное обновление не будет работать для вставки многих строк? – ColinD

+0

Что именно вы имеете в виду: * Нет функции для избежания значений для потребления * –

+0

@ColinD Это нормально для однородных операторов, но мне также нужно выполнять гетерогенные операторы в пакетном режиме и Statement.addBatch может принимать только SQL-выражения в виде String, а не как другое утверждение. – andreypopp

ответ

9

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

Экранирование и вставка нескольких строк должны обрабатываться, как указывалось @ColinD и @a_horse, с подготовленными операциями и пакетными операциями. Под капотом я ожидал бы, что хорошая реализация JDBC будет делать то, что вы хотите (я не знаком с реализацией PostgreSQL).

Что касается UUID,, here решение:

All that PostgreSQL can do is convert string literals to uuid. 

You can make use of this by using the data type 
org.postgresql.util.PGobject, which is a general class used to 
represent data types unknown to JDBC. 

You can define a helper class: 

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); 
    } 
} 

Then the following piece of code will succeed: 

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(); 
+0

Спасибо, что предоставили пример регистрации собственных типов дескрипторов, но для меня все еще нерешены другие вопросы. – andreypopp

4

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

И используя пакетные заявления намного более компактно, чем используя собственный синтаксис 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.

+0

Но мне также нужно работать с UUID, поэтому я спрашиваю о существовании других драйверов PostgreSQL. – andreypopp

0

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

3

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

Я использую 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.util.UUID класса Java для извлечения и хранения 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"); 

работает отлично.

+0

Я заметил, что драйвер Postgres JDBC, похоже, поддерживает 'java.util.UUID' с помощью методов' getObject() 'и' setObject() '. Это где-то документально? –

1
No support for PostgreSQL-ish data structures such as UUIDs. 

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

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

Не нужно делать какие-либо литье или проходить через струны.

enter image description here

См my blog post для более подробного обсуждения и примеров кода.

Пример кода выдержка:

java.util.UUID uuid = java.util.UUID.randomUUID(); 
… 
preparedStatement.setObject(nthPlaceholder++, uuid); // Pass UUID to database. 
+0

Отлично, но это не всегда работает: http://stackoverflow.com/questions/17969431/postgres-uuid-jdbc-not-working – user340535

+0

@ user340535 К сожалению, этот вопрос, на который вы ссылаетесь, бесполезен. Не предоставляется исходный код, детали или контекст, поэтому никакого вывода не может быть сделано. С другой стороны, вы можете запустить мой исходный код, опубликованный в этом ответе, и опубликовать его в моем связанном сообщении в блоге. Он без проблем работал для меня. –

Смежные вопросы