java - 使用 java 类创建数据库

标签 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)

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

最佳答案

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

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

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

关于java - 使用 java 类创建数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105501/

相关文章:

java - 使用 NavigationDrawer 在 Activity 之间导航?

javascript - 如何从 servlet 传递 javascript 对象

java - Swing 中的工具提示

java - VirtualBox:使用 SDK API 在 guest 中启动程序?

java - 如何在Spring Boot应用程序中设置变量instrumentationKey以进行a​​zure监控

java - 如何解决jsp页面中的这种错误?

java - 使用应用程序上下文感知将数据从 servlet 传递到 spring

mysql - 获取日期时间戳为 30 天或更新的 mysql 行

php - 上传图片然后使用 php 将位置保存在 MySQL 数据库中。

MySQL 需要使列不唯一。错误无法删除 'ColumnName';检查列/键是否存在