【问题标题】:Using a java class to create a database使用java类创建数据库
【发布时间】:2011-01-07 12:14:23
【问题描述】:

我正在一个使用 servlet 和 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)

我通过授予用户创建操作来解决它。我不知道为什么,我是作为管理员这样做的。

【问题讨论】:

  • 如果你可以编写一个SELECT,为什么你不能编写CREATE TABLE/INSERT/LOAD?
  • 我不知道,如果我连接到我的一个数据库然后使用: ResultSet rs = st.executeQuery("select * from audiolist2" );那行得通。

标签: java mysql servlets jdbc


【解决方案1】:

W3CSchools.com——SQL CREATE DATABASE Statement。不过,您不会使用executeQuery。请改用executeUpdate

Here 是一个简单的例子。

正如其他用户所提到的,您可能不想从您的代码中创建数据库。这只是不好的做法。

【讨论】:

  • 我试过了,但我得到了一个错误。我已将信息添加到我的问题中。谢谢
【解决方案2】:

首先,这个问题不是特定于 servlet 的。在任何其他 Java 类中这样做/尝试这样做时,您会遇到完全相同的问题/问题;)

其次,以编程方式创建数据库/表确实很臭。在现实世界中,使用精心设计的数据模型,您通常在安装/设置相关应用程序期间只创建一次数据库/表,然后在应用程序的生命周期内永久使用它。您不需要为每个问题都创建一个新的数据库/表。当然,除非您打算开发(重新发明)基于 Web 的数据库管理器。

至于您的实际问题,这实际上取决于所使用的 JDBC 驱动程序,但其中大多数只允许执行 CREATE 或使用 Statement#executeUpdate() 的任何其他 DDL 语句。如果您不这样做,那么您需要寻找另一个允许这样做的 JDBC 驱动程序制造商或版本。您还应该考虑到有问题的 DB 用户有足够的权限,这将在 DB 级别进行配置。

【讨论】:

  • 重新。在代码之外创建数据库/表,我认为需要这样做的另一个原因可能是在某种测试套件中,其中设置和拆卸需要创建/删除数据库/表/测试数据。
  • 仍然没有明确提及为此使用 servlet ;)
  • 我不知道我在写这个问题时在想什么。现在编辑了。为混乱道歉:)
【解决方案3】:

你为什么要这样做?

我认为您需要做的是执行一些运行时命令以直接与操作系统交互来完成这一壮举。但是,我建议不要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多