java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...

Code-Apprentice

2

java

sql

junit

jdbc

我正在用Java编写数据库程序,并且想要创建一个表(如果它还不存在).我从中了解DatabaseMetaData.getTables()了如何在Java中检测SQL表的存在?而我正在尝试使用它:

private boolean tableExists() throws SQLException {

System.out.println("tableExists()");

DatabaseMetaData dbmd = conn.getMetaData();

ResultSet rs = dbmd.getTables(null, null, this.getTableName(), null);

System.out.println("TABLE_NAME: " + rs.getString("TABLE_NAME"));

return rs.getRow() == 1;

}

问题是即使在创建表之后rs.getRow()总是返回0.使用rs.getString("TABLE_NAME")抛出异常表明结果集为空.

我想到的一个可能的解决方案是执行CREATE TABLE语句并捕获抛出的任何异常.但是,我不喜欢在程序的控制流程中使用异常的想法.

FWIW,我正在使用HSQLDB.但是,我想编写独立于RDMS引擎的Java代码.有没有其他方法可以DatabaseMetaData.getTables()用来做我想要的事情?或者是否有其他解决方案来编写我的tableExists()方法?

添加:

使用这里给出的建议,我找到了一个似乎适用于我的生产代码的解决方案:

private void createTable() throws SQLException {

String sqlCreate = "CREATE TABLE IF NOT EXISTS " + this.getTableName()

+ " (brand VARCHAR(10),"

+ " year INTEGER,"

+ " number INTEGER,"

+ " value INTEGER,"

+ " card_count INTEGER,"

+ " player_name VARCHAR(50),"

+ " player_position VARCHAR(20))";

Statement stmt = conn.createStatement();

stmt.execute(sqlCreate);

}

现在我也在编写一个JUnit测试来断言表确实已经创建了:

public void testConstructor() throws Exception {

try (BaseballCardJDBCIO bcdb = new BaseballCardJDBCIO(this.url)) {

String query = "SELECT count(*) FROM information_schema.system_tables WHERE table_name = '" + bcdb.getTableName() + "'";

Connection conn = DriverManager.getConnection(this.url);

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(query);

Assert.assertTrue(rs.next());

Assert.assertEquals(1, rs.getInt(1));

Assert.assertFalse(rs.next());

}

}

此测试assertEquals()在以下消息上失败:

FAILED: expected: <1> but was: <0>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值