使用Java类创建数据库

4
我正在开发一款使用servlets和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呢? - gary
我不知道,如果我连接到我的一个数据库然后使用: ResultSet rs = st.executeQuery("select * from audiolist2" ); 那就可以了。 - dedalo
3个回答

3
首先,这个问题并不是特定于servlet的。在任何其他Java类中进行同样的操作/尝试时,您都会遇到完全相同的问题/疑问;)
其次,通过编程方式创建数据库/表实际上很奇怪。在真实世界中,有着良好设计的数据模型,您通常只需要在安装/设置所述应用程序期间创建数据库/表一次,然后在应用程序的生命周期中永久使用它。除非你打算开发(重新发明)一个基于Web的数据库管理器。
至于您实际的问题,这实际上取决于使用的JDBC驱动程序,但大多数驱动程序都允许使用{{link1:Statement#executeUpdate()}}执行CREATE或任何其他DDL语句。如果您的驱动程序不支持,则需要查找另一个允许执行该操作的JDBC驱动程序版本或制造商。您还应考虑到目标DB用户具有足够的权限,这要在DB级别进行配置。

关于在代码之外创建数据库/表,我可以看到另一个需要这样做的原因是在某种测试套件中,设置和拆卸需要创建/删除数据库/表/测试数据。 - AJ.
不过话说回来,我们也不会明确地提到要使用servlet ;) - BalusC
我写问题时不知道自己在想什么,现在已经编辑过了。对于造成的困扰表示歉意 :) - dedalo

2

W3CSchools.com -- SQL CREATE DATABASE Statement。不过,您不应该使用executeQuery,而是使用executeUpdate

这里有一个简单的示例。

正如其他用户所提到的,您可能不想从代码中创建数据库。这并不是好的实践方式。


我尝试过了,但是出现了错误。我已经将信息添加到我的问题中。 - dedalo

0

你为什么想要这样做?

我认为你需要执行一些运行时命令来直接与操作系统进行交互,以完成这个任务。然而,我建议不要用这种方式来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接