Использование Java-класса для создания базы данных - PullRequest
4 голосов
/ 21 января 2010

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

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

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

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

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

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user 'admin'@'localhost' to database 'hrapp'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at 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)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485)
    at BaseDatosSetup.BaseDatosSetup.main(BaseDatosSetup.java:18)

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

Ответы [ 3 ]

3 голосов
/ 21 января 2010

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

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

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

2 голосов
/ 21 января 2010

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

Здесь - простой пример.

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

0 голосов
/ 21 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...