2010-01-20 4 views
4

Я работаю в приложении, которое использует сервлеты и mysql.Использование класса java для создания базы данных

Я хотел бы создать файл .jar, способный создать базу данных, которую будет использовать приложение. Это будет сделано только один раз, чтобы создать db.

У меня нет никаких проблем в получении доступа к базе данных, делать что-то вроде этого:

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection conexion = (Connection)DriverManager.getConnection("jdbc:mysql://localhost/test","admin","admin"); 
if (!conexion.isClosed()) 
{ 
    Statement st = (Statement) conexion.createStatement(); 
    ResultSet rs = st.executeQuery("select * from table_name"); 
} 
conexion.close(); 

Это нормально, но то, что мне нужно сделать, чтобы создать новую базу данных (и его таблицы) из класса java, возможно ли это?

Благодаря

Я пытаюсь это:

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection conexion = (Connection)DriverManager.getConnection("jdbc:mysql://localhost/mysql","admin","admin"); 

Statement st = (Statement) conexion.createStatement();  
st.executeUpdate("CREATE DATABASE hrapp"); 

, но я получаю следующее сообщение об ошибке:

Исключение в потоке "основной" com.mysql.jdbc.exceptions.jdbc4 .MySQLSyntaxErrorException: доступ запрещен для пользователя 'admin' @ 'localhost' в базу данных 'hrapp' at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) at sun.reflect.NativeConstructorAccessorImpl.newInstance (Неизвестно S сходный код) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance (Unknown Source) в java.lang.reflect.Constructor.newInstance (Unknown Source) в com.mysql.jdbc.Util.handleNewInstance (Util.java:406) в com.mysql.jdbc.Util.getInstance (Util.java:381) at com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1030) at com.mysql.jdbc.SQLError.createSQLException (SQLError.java: 956) на com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3491) на com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3423) в com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1936) at com.mysql.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:2060) at com.mysql.j dbc.ConnectionImpl.execSQL (ConnectionImpl.java:2536) на com.mysql.jdbc.StatementImpl.executeUpdate (StatementImpl.java:1564) на com.mysql.jdbc.StatementImpl.executeUpdate (StatementImpl.java:1485) на BaseDatosSetup.BaseDatosSetup.main (BaseDatosSetup.java:18)

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

+0

Если вы можете запрограммировать SELECT, почему вы не можете запрограммировать CREATE TABLE/INSERT/LOAD? – gary

+0

Не знаю, если я подключусь к одной из моих баз данных, а затем использую: ResultSet rs = st.executeQuery («select * from audiolist2»); Это работает. – dedalo

ответ

2

W3CSchools.com - SQL CREATE DATABASE Statement. Однако вы не использовали бы executeQuery. Вместо этого используйте executeUpdate.

Here - простой пример.

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

+0

Я пробовал это, но у меня есть ошибка. Я добавил информацию к моему вопросу. Спасибо – dedalo

3

Во-первых, эта проблема не связана с сервлетом. Вы будете бороться с точно такой же проблемой/вопросом при выполнении/попытке в любом другом классе Java;)

Во-вторых, создание баз данных/таблиц программно честно пахнет. В реальном мире с хорошо продуманными моделями данных вы обычно создаете базы данных/таблицы только один раз во время установки/установки рассматриваемого приложения, а затем используете его навсегда во время работы приложения. Вам не нужно создавать новую таблицу DB/для каждого икота. Если вы не намерены разрабатывать (переосмысливать) веб-менеджер баз данных, конечно.

Что касается вашего фактического вопроса, это фактически зависит от используемого драйвера JDBC, но большинство из них просто позволяет выполнять CREATE или любые другие заявления DDL с использованием Statement#executeUpdate(). Если у вас этого нет, вам нужно искать другую версию или версию драйвера JDBC, которая позволяет это. Вы также должны учесть, что у пользователя БД есть достаточные права, он должен быть настроен на уровне БД.

+0

re. создание баз данных/таблиц за пределами кода, еще одна причина, по которой я мог видеть необходимость в этом, возможно, в каком-то тестовом наборе, где для установки и удаления требуется создание/удаление данных базы данных/таблицы/теста. –

+0

Но тогда я бы не стал упоминать об использовании сервлета для этого;) – BalusC

+0

Я не знал, о чем думал, когда писал вопрос. Теперь он отредактирован. Извинения за беспорядок :) – dedalo

0

Почему вы хотите это сделать?

Я думаю, что вам нужно будет выполнить некоторые команды Runtime для непосредственного взаимодействия с ОС, чтобы выполнить этот подвиг. Тем не менее, я бы порекомендовал не делать это так.

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