【发布时间】:2016-04-16 21:00:48
【问题描述】:
我为学校项目创建了一个 Java 程序。我使用 MySQL Workbench 创建了数据库和表,但现在我需要我的程序在其他计算机上工作,因此我需要它来检查数据库和表是否存在,如果不存在则自行创建。
这是我的驱动程序类中的相关代码:
private static Connection conn;
static
{
try
{
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException exc)
{
javax.swing.JOptionPane.showMessageDialog(null, "Oops! Something seems to have gone wrong!\n\n" + exc, "Error", JOptionPane.ERROR_MESSAGE);
}
}
public static Connection getMySQLConnection() throws SQLException
{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/tournament_manager", "studentCouncil", "****");
return conn;
}
如上,我要创建的数据库,如果不存在,则称为“tournament_manager”。与数据库一起创建的表如下:
表 1 名称:密码
第 1 列:密码 ID 类型: int(11) 可以为空: 否
第 2 列:密码 类型: varchar(20) 可以为空: 是 字符集: latin1
表 2 名称:锦标赛
第 1 列:锦标赛 ID 类型: int(11) 可以为空: 否 额外: auto_increment
第 2 列:锦标赛名称 类型: varchar(20) 可以为空: 否 字符集: latin1
第 3 栏:日期 类型: 日期 可以为空: 否
第 4 列:开始时间 类型: int(11) 可以为空: 否
第 5 列:matchDuration 类型: int(11) 可以为空: 否
第 6 列:breakDuration 类型: int(11) 可以为空: 否
第 7 列:numTeams 类型: int(11) 可以为空: 否
第 8 列:numVenues 类型: int(11) 可以为空: 否
表 3 名称:团队
第 1 列:团队 ID 类型: int(11) 可以为空: 否 额外: auto_increment
第 2 列:团队名称 类型: varchar(20) 可以为空: 否 字符集: latin1
第 3 列:积分 类型: int(11) 可以为空: 否
第 4 列:tournament_tournamentID 类型: int(11) 可以为空: 否
我是堆栈溢出的新手,所以我可能没有包含所有相关信息或包含不相关的信息。如果我没有提供相关细节,请询问。
提前感谢您的支持!
【问题讨论】:
-
但是有什么问题?
-
您可以通过
getMetaData()从您的Connection对象中获取DatabaseMetaData对象。拥有该对象后,您可以查询现有表并使用标准 SQL 创建它们,如果它们不存在,则使用您的Connection对象。 -
你可以做到,但我认为用 Java 创建表是一个糟糕的设计。通常应用程序在应用程序运行之前创建一个模式,然后使用 Java 执行 CRUD 操作。你犯了那个经典的学生/初学者错误:在一个班级中混合数据库和 UI 代码。那里没有关注点分离。