使用java类创建数据库

时间:2010-01-20 22:26:22

标签: java mysql servlets jdbc

我正在使用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)

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

W3CSchools.com - SQL CREATE DATABASE Statement。但是你不会使用executeQuery。而是使用executeUpdate

Here就是一个简单的例子。

正如其他用户所提到的,您可能不希望从代码中创建数据库。这不是一个好习惯。

答案 2 :(得分:0)

你为什么要这样做?

我认为您需要做的是执行一些运行时命令以直接与操作系统连接以完成此功能。但是,我建议这样做。