DBUnit有没有办法自动创建表?

时间:2009-10-07 12:25:16

标签: java dataset create-table dbunit

我刚刚意识到DBUnit不会自己创建表(参见How do I test with DBUnit with plain JDBC and HSQLDB without facing a NoSuchTableException?)。

DBUnit有没有办法从数据集或dtd自动创建表?

编辑:对于像HSQLDB这样的内存数据库的简单测试,可以使用原始方法自动创建表:

private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException {
    String[] tableNames = dataSet.getTableNames();

    String sql = "";
    for (String tableName : tableNames) {
      ITable table = dataSet.getTable(tableName);
      ITableMetaData metadata = table.getTableMetaData();
      Column[] columns = metadata.getColumns();

      sql += "create table " + tableName + "( ";
      boolean first = true;
      for (Column column : columns) {
        if (!first) {
          sql += ", ";
        }
        String columnName = column.getColumnName();
        String type = resolveType((String) table.getValue(0, columnName));
        sql += columnName + " " + type;
        if (first) {
          sql += " primary key";
          first = false;
        }
      }
      sql += "); ";
    }
    PreparedStatement pp = connection.prepareStatement(sql);
    pp.executeUpdate();
}

private String resolveType(String str) {
  try {
    if (new Double(str).toString().equals(str)) {
      return "double";
    }
    if (new Integer(str).toString().equals(str)) {
      return "int";
    }
  } catch (Exception e) {}

  return "varchar";
}

5 个答案:

答案 0 :(得分:16)

不是真的。正如您所链接的答案所指出的那样,dbunit xml文件包含数据,但不包含列类型。

你真的不想这样做; 你冒着用测试工件污染你的数据库的风险,开辟了生产代码意外地依赖于测试过程创建的表的可能性。

强烈建议您没有充分定义和编写数据库创建和维护过程。

答案 1 :(得分:4)

没有。您必须使用表中的表定义执行SQL脚本。

正如我在另一个帖子中发布的那样,XML没有足够的数据来创建表。我猜你可以做一些可怕的事情,比如解析这些值,试图弄清楚它包含哪些值,但这样做会非常脆弱。这与Hibernate的不同之处在于带注释的类确实包含有关数据库外观的大量信息。注释的一部分和Java类型字段中的一部分。

http://www.dbunit.org/faq.html#ddl

答案 2 :(得分:3)

Spring Boot / Spring JDBC可以使用普通JDBC初始化数据库。

  

Spring JDBC具有DataSource初始化程序功能。 Spring Boot启用   它默认情况下从标准位置schema.sql加载SQL   data.sql(在类路径的根目录中)。另外Spring Boot会   加载schema-${platform}.sqldata-${platform}.sql文件(如果   现在),其中platform是spring.datasource.platform的值,   例如您可以选择将其设置为数据库的供应商名称   (hsqldb,h2,oracle,mysql,postgresql等)。

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

答案 3 :(得分:2)

如果您使用的是JPA,通常可以配置JPA提供程序,以便在初始化时创建/更新表。

E.g。对于hibernate,指定属性 hibernate.hbm2ddl.auto 并将其值设置为create-drop(应该可以用于测试)。

另请参阅:Hibernate Documentation, Chapter 3 Configuration

但是,请确保JPA提供程序是第一个访问数据库的;)

答案 4 :(得分:0)

我只想插话并说这对我很有帮助。我需要连接到Oracle数据库并将其导出到XML文件,然后将其作为测试HSQL数据库导入并使用Hibernate访问它。在执行

之前,我使用此代码创建表
DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);. 

但请注意,此代码将每个表的第一列设置为主键,因此在使用关系表时要小心,因为导入时可能会出现“主键约束违规”。感谢您的代码段!