Я создаю приложение на Netbeans 7! Я хотел бы, чтобы мое приложение имело небольшой код в main, чтобы оно могло создать соединение Java DB, проверяющее, существуют ли база данных и ассоциированные таблицы, если не создать базу данных и таблицы в ней. Если бы вы могли предоставить пример кода, это было бы так же здорово! Я уже просмотрел http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/, но я до сих пор не знаю, как проверить существующую базу данных перед ее созданием!
Создание базы данных Java DB и связанных таблиц в основной проверке, чтобы увидеть, существуют ли они?
Ответы (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.
Я не знаю, насколько Oracle изменил Derby до его ребрендинга, но если они не изменились слишком сильно, вам может помочь Delete все таблицы в базе данных Derby. Ответы на этот вопрос перечисляют несколько способов проверить, какие таблицы существуют в базе данных.
Вы укажете базу данных при создании соединения с БД; в противном случае соединение не будет успешно создано. (Точный синтаксис этого зависит от того, как вы подключаетесь к своей БД, но логика такая же, как и в ответе Шри.)
Свойство 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();
SQLException
не является хорошей практикой. В идеале это следует делать при запуске приложения, а не при выполнении запросов, связанных с доступом к данным. И регистрация сообщений типа Exist/Not Exist не отвечает на вопрос.
- person Vineet Reynolds; 12.10.2011