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

Java DBUnit有没有办法自动创建表?,java,dataset,create-table,dbunit,Java,Dataset,Create Table,Dbunit,我刚刚意识到DBUnit不会自己创建表(请参阅) DBUnit有没有办法从数据集或dtd自动创建表 编辑:对于内存中数据库(如HSQLDB)的简单测试,可以使用粗略的方法自动创建表: private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException { String[] tableNames = dataSet.getTableNam

我刚刚意识到DBUnit不会自己创建表(请参阅)

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";
}

不可以。您必须使用中的表定义执行SQL脚本

正如我在另一个线程中发布的,XML没有包含足够的数据来创建表。我想你可以做一些可怕的事情,比如解析这些值,试图找出它包含哪些值,但这将是非常脆弱的。这与Hibernate的不同之处在于,带注释的类确实包含很多关于数据库外观的信息。注释中的部分和Java类型字段中的部分都有


不太可能。正如您链接的答案所指出的,DBUnitXML文件包含数据,但不包含列类型

你真的不想这么做;您可能会因为测试工件而污染数据库,从而导致生产代码可能会意外地依赖于测试过程创建的表


需要这样做强烈建议您没有充分定义和编写数据库创建和维护过程的脚本

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

例如,对于hibernate,指定hibernate.hbm2ddl.auto属性并将其值设置为create drop(对于测试来说应该可以)

另见:


但是,请确保JPA提供程序是第一个访问DB;)

我只是想插嘴说这对我很有帮助。我需要连接到Oracle数据库并将其导出到XML文件,然后将其导入为测试HSQL数据库并使用Hibernate访问它。在执行此操作之前,我使用此代码创建表

DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);. 

但需要注意的是,此代码将每个表的第一列设置为主键,因此如果使用关系表,请小心,因为导入时可能会出现“主键约束冲突”。谢谢你的代码片段

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

SpringJDBC具有数据源初始值设定项功能。弹簧启动启用 默认情况下,它从标准位置
schema.SQL
data.sql
(在类路径的根目录中)。此外,弹簧靴将 加载
schema-${platform}.sql
data-${platform}.sql
文件(如果 当前),其中platform是
spring.datasource.platform
的值, e、 g.您可以选择将其设置为数据库的供应商名称 (hsqldb、h2、oracle、mysql、postgresql等)


这不会创建任何表,代码只是从提供的数据集中插入数据。