Создание базы данных Java DB и связанных таблиц в основной проверке, чтобы увидеть, существуют ли они?

Я создаю приложение на Netbeans 7! Я хотел бы, чтобы мое приложение имело небольшой код в main, чтобы оно могло создать соединение Java DB, проверяющее, существуют ли база данных и ассоциированные таблицы, если не создать базу данных и таблицы в ней. Если бы вы могли предоставить пример кода, это было бы так же здорово! Я уже просмотрел http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/, но я до сих пор не знаю, как проверить существующую базу данных перед ее созданием!


person Sam    schedule 12.10.2011    source источник


Ответы (4)


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

Вы можете добавить create=true свойство в URL-адрес JDBC. Это создает экземпляр базы данных Derby, если база данных, указанная databaseName, не существует во время подключения. Выдается предупреждение, если база данных уже существует, но насколько я знаю, SQLException не будет выброшено.

Что касается создания таблиц, то это лучше всего делать при запуске приложения, прежде чем вы получите доступ к базе данных для типичной транзакционной деятельности. Вам потребуется запросить системную таблицу SYSTABLES в Derby/JavaDB, чтобы убедиться, что ваши таблицы существуют.

Connection conn;
try
{
    String[] tableNames = {"tableA", "tableB"};
    String[] createTableStmts = ... // read the CREATE TABLE SQL statements from a file into this String array. First statement is for the tableA, and so on.
    conn = DriverManager.getConnection("jdbc:derby:sampleDB;create=true");
    for(int ctr =0 ; ctr < tableNames.length; ctr++)
    {
        PreparedStatement pStmt = conn.prepareStatement("SELECT t.tablename FROM sys.systables t WHERE t.tablename = ?");
        pStmt.setString(1, tableNames[ctr]);
        ResultSet rs = pStmt.executeQuery();
        if(!rs.next())
        {
            // Create the table
            Statement stmt = conn.createStatement();
            stmt.executeUpdate(createTableStmts[ctr]);
            stmt.close();
        }
        rs.close();
        pStmt.close();
    }
}
catch (SQLException e)
{
    throw new RuntimeException("Problem starting the app...", e);
}

После этого могут быть созданы любые несуществующие таблицы. Это, конечно, не очень хорошая практика, если ваше приложение имеет несколько версий, а схема варьируется от одной версии приложения к другой. Если вы должны справиться с таким сценарием, вы должны сохранить версию приложения в отдельной таблице (которая обычно не меняется между версиями), а затем применить дельта-скрипты базы данных, характерные для более новой версии, чтобы перенести вашу базу данных из более старой версии. . Использование инструментов управления изменениями базы данных, таких как DbDeploy или LiquiBase. Под капотом инструменты выполняют ту же операцию, сохраняя номер версии приложения в таблице и выполняя дельта-скрипты, версии которых больше, чем версия в базе данных.

И наконец, нет существенной разницы между JavaDB и Apache Derby.

person Vineet Reynolds    schedule 12.10.2011

Я не знаю, насколько Oracle изменил Derby до его ребрендинга, но если они не изменились слишком сильно, вам может помочь Delete все таблицы в базе данных Derby. Ответы на этот вопрос перечисляют несколько способов проверить, какие таблицы существуют в базе данных.

Вы укажете базу данных при создании соединения с БД; в противном случае соединение не будет успешно создано. (Точный синтаксис этого зависит от того, как вы подключаетесь к своей БД, но логика такая же, как и в ответе Шри.)

person Community    schedule 12.10.2011

Свойство create=true создаст новую базу данных, если она не существует. Вы можете использовать метод DatabaseMetadata.getTables() для проверки существования Tables.

Connection cn=DriverManager.getConnection("jdbc:derby://localhost:1527/testdb3;create=true", "testdb3", "testdb3");

ResultSet mrs=cn.getMetaData().getTables(null, null, null, new String[]{"TABLE"});

while(mrs.next())
 {
  if(!"EMP".equals(mrs.getString("TABLE_NAME")))
   {
    Statement st=cn.createStatement(); 
    st.executeUpdate("create table emp (eno int primary key, ename varchar(30))");
    st.close();;
   }
}
mrs.close();
cn.close();
person kv-prajapati    schedule 12.10.2011
comment
Я выполнил приведенный выше код, однако получил следующее исключение: java.sql.SQLNonTransientConnectionException: java.net.ConnectException: ошибка подключения к серверу localhost через порт 1527 с сообщением Отказ в подключении: подключение. - person Sam; 12.10.2011
comment
@Sam - URL-адрес подключения, который я разместил, предназначен для справки. Выберите свой собственный URL-адрес (Создайте новую строку коллекции). - person kv-prajapati; 12.10.2011
comment
Я знаю, и вот как я изменил его на Connection cn = DriverManager.getConnection(jdbc:derby:myDB;create=true, myDB, myDB); и, конечно, изменен остальной код! - person Sam; 12.10.2011

person    schedule
comment
Создание базы данных и таблиц Derby для перехвата SQLException не является хорошей практикой. В идеале это следует делать при запуске приложения, а не при выполнении запросов, связанных с доступом к данным. И регистрация сообщений типа Exist/Not Exist не отвечает на вопрос. - person Vineet Reynolds; 12.10.2011