2015-12-21 2 views
1

У меня есть DAO слой для вставки в DERBY дб, как это,Java DAO Insert Layer в Oracle Database

try { 
    long id = dbAccess.insert(connection, 
     "INSERT INTO BOOKS(NAME, AUTHORS, PUBLISHYEAR, AVAIL) VALUES (?, ?, ?, ?)", 
     new ScalarHandler<BigDecimal>(), 
     book.getName(), 
     book.getAuthors(), 
     book.getPublishedYear(), 
     book.isAvailable() 
      ).longValue(); 
    return id; 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

return -1L; 

Как перевести это, если я использую БД Oracle в качестве источника данных?

+1

Возможно, разница в том, как вы установили соединение – OPK

+1

Вы сталкиваетесь с какой-то проблемой при попытке использовать это для базы данных Oracle? –

ответ

2

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

Кроме того, необходимы чесотки таблицы идентификатор Increment вы должны создать триггер для увеличения идентификатора таблицы после каждой операции вставки я размещу метод, выберите максимальный идентификатор из таблицы, вы можете найти триггер оракула увеличить последовательность в ссылке ниже

How to create id with AUTO_INCREMENT on Oracle?

первых нам нужно создать метод, который возвращать максимальное идентификатор из таблицы

public static int getMaxBookID(Connection connection){ 
    int id=0; 
    String sql = "SELECT NVL(MAX(ID),0)+1 FROM BOOK "; 
    try{ 
    PreparedStatement statement = connection.prepareStatement(sql); 
    if(statement!=null){ 
    try{ 
     ResultSet results = statement.executeQuery(); 
     if(results != null){ 
     try{ 
      if(results.next()){ 
      id = results.getInt(1); 
      } 
     } 
     catch(Exception resultSetException) {resultSetException.printStackTrace(); 
     } 
     results.close(); 
     } 
    } 
    catch(Exception statmentExcption){statmentExcption.printStackTrace(); 
    } 
    statement.close(); 
    } 
} catch (Exception generalException){generalException.printStackTrace(); 
} 


return id; 

} 

эти два метода используются для открытия и закрытия подключение

private static final String DB_DRIVER = "oracle.jdbc.driver.OracleDriver"; 
    private static final String DB_CONNECTION = "jdbc:oracle:thin:@//host:1526/databasename"; 
private static final String DB_USER = "username"; 
private static final String DB_PASSWORD = "passowrd"; 

public static Connection lockConnection() { 

    Connection dbConnection = null; 

    try { 

     Class.forName(DB_DRIVER); 

    } catch (ClassNotFoundException e) { 

     System.out.println(e.getMessage()); 

    } 

    try { 

     return DriverManager.getConnection(
       DB_CONNECTION, DB_USER, DB_PASSWORD); 



    } catch (SQLException e) { 

     System.out.println(e.getMessage()); 

    } 

    return dbConnection; 

} 
public static void closeMyConnection(Connection connection) { 

    try { 

     connection.close(); 


    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

} 

Теперь вы можете вставить информацию в таблицу

public int AddBook(String name,String auth,String year , String avail){ 
int id=0; 

Connection connection = lockConnection(); 
boolean ok = false; 
String sql = "INSERT INTO BOOKS(ID,NAME, AUTHORS, PUBLISHYEAR, AVAIL)" 


     + " VALUES(?,?,?,?,?)"; 


try{ 
    PreparedStatement statement = connection.prepareStatement(sql); 
    if(statement!=null){ 
    statement.setInt(1,getMaxBookID(connection)); 
    statement.setString(2,name); 
    statement.setString(3,auther); 
    statement.setString(4,year); 
    statement.setString(5,avail); 




try{ 
     int count = statement.executeUpdate(); 
     ok = count == 1; 
     if(!ok)id=0; 
    } 
    catch(Exception statmentExcption){statmentExcption.printStackTrace();statmentExcption.printStackTrace(); return 0 ; 
    } 
    statement.close(); 
    } 
} catch (Exception generalException){generalException.printStackTrace(); generalException.printStackTrace(); return 0; 
} 

closeMyConnection(connection); 


return id; 


} 
+1

Этот код не возвращает идентификатор недавно вставленной строки, которая, по моему мнению, является основной точкой вопроса (моя интерпретация в любом случае). – Andreas

+1

У меня есть ответ на мой ответ, вы можете снова проверить –

+1

Если два потока делают это параллельно, они попытаются добавить один и тот же идентификатор. Кроме того, это не очень эффективно. Использование объекта SEQUENCE для присвоения идентификатора было бы лучше, но делает SQL-запрос специфичным для Oracle, если вы не делаете это в триггере, но как вы возвращаете значение? Вы используете версию 'prepareStatement', которая может вернуть значение столбца сгенерированного значения. Таким образом, у вас есть только один поворот к базе данных. – Andreas

1

Поскольку Oracle не поддерживает IDENTITY столбцы, вы должны сделать две вещи, чтобы сделать его работу:

  • Создать триггер, чтобы присвоить значение идентификатора с использованием последовательности.
  • Задайте значение по имени столбца.

Это означает, что с помощью версии prepareStatement(String sql, String[] columnNames), а не версии , при построении PreparedStatement, потому что Oracle не знает, какой столбец «генерируется автоматически».

Использование версии имен работает для всех поставщиков СУБД, поэтому использование делает ваш код поставщика агностик:

  • Oracle: Trigger
  • MySQL: AUTO_INCREMENT
  • MSSQL: IDENTITY
  • PostgreSQL: SERIAL
  • Derby: GENERATED ALWAYS AS IDENTITY
  • ...
+1

У Oracle [12c есть поддержка] (https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1) для столбцов идентификации. –

+0

@MickMnemonic Ahh да, забыл это. Думаю, мой мозг застрял в старых версиях. Поскольку OP не указал версию, я оставлю ответ в виде решения, не зависящего от версии. – Andreas

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