如何向SQL表对应XML插入Date类型并解决DBUnit识别为String的问题
DBUnit XML数据集Date字段识别为String问题解决方案
DBUnit默认加载FlatXml格式数据集时,默认将所有字段按String类型处理,不会自动匹配数据库表的字段类型,可通过以下三种方法解决:
- 关联数据库元数据自动匹配类型
初始化DBUnit连接时,配置对应数据库的DataTypeFactory,让DBUnit主动读取数据库表结构的元数据,自动匹配字段类型,示例代码:import org.dbunit.database.DatabaseConfig; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; import org.dbunit.ext.mysql.MySqlDataTypeFactory; import org.dbunit.operation.DatabaseOperation; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; public class DataImport { public static void main(String[] args) throws Exception { // 获取原生JDBC连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456"); // 封装为DBUnit连接 IDatabaseConnection dbConn = new DatabaseConnection(conn); // 配置对应数据库的类型工厂,按实际使用的数据库选择即可,例如Oracle用OracleDataTypeFactory dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory()); // 加载XML数据集 IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File("user_data.xml")); // 执行导入 DatabaseOperation.CLEAN_INSERT.execute(dbConn, dataSet); } } - 手动定义表元数据强制指定类型
不依赖数据库元数据的情况下,可以手动构造表结构,显式指定BDAY字段为Date类型:import org.dbunit.dataset.Column; import org.dbunit.dataset.DefaultTable; import org.dbunit.dataset.datatype.DataType; public class CustomTableMeta { public static void main(String[] args) throws Exception { // 自定义USERS表的字段结构 DefaultTable usersTable = new DefaultTable("USERS", new Column[]{ new Column("ID", DataType.INTEGER), new Column("FIRSTNAME", DataType.VARCHAR), new Column("LASTNAME", DataType.VARCHAR), new Column("LOGIN", DataType.VARCHAR), new Column("PASSWORD", DataType.VARCHAR), new Column("EMAIL", DataType.VARCHAR), new Column("BDAY", DataType.DATE), // 强制指定为Date类型 new Column("ROLEID", DataType.INTEGER) }); // 后续将XML数据填充到该表对象中再执行导入即可 } } - 通过DTD文件定义字段类型
新增DTD文件定义数据集的字段类型,在XML中引入DTD后DBUnit会按DTD指定的类型处理字段:- 新建
user_schema.dtd文件,内容如下:
<!ELEMENT dataset (ROLE*, USERS*)> <!ELEMENT ROLE EMPTY> <!ATTLIST ROLE ID CDATA #REQUIRED ROLENAME CDATA #REQUIRED > <!ELEMENT USERS EMPTY> <!ATTLIST USERS ID CDATA #REQUIRED FIRSTNAME CDATA #REQUIRED LASTNAME CDATA #REQUIRED LOGIN CDATA #REQUIRED PASSWORD CDATA #REQUIRED EMAIL CDATA #REQUIRED BDAY DATE #REQUIRED ROLEID CDATA #REQUIRED >- 修改原XML数据集头部,引入DTD文件:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE dataset SYSTEM "user_schema.dtd"> <dataset> <ROLE ID="1" ROLENAME = "Admin"/> <ROLE ID="2" ROLENAME="Guest"/> <USERS ID = '1' FIRSTNAME="Barack" LASTNAME="Obama" LOGIN="12312414" PASSWORD = "121121212" EMAIL="ob@" BDAY='1999-04-04' ROLEID='1'/> <USERS ID = '2' FIRSTNAME="Hack" LASTNAME="Fill" LOGIN="Bold" PASSWORD = "99999999" EMAIL="BLACk" BDAY = '1991-03-02' ROLEID='2'/> </dataset> - 新建
注意:配置完成后需确认XML中的BDAY日期格式与数据库支持的Date格式匹配,避免出现格式转换异常。
内容的提问来源于stack exchange,提问作者Dudka Dima
相关产品推荐
相关产品推荐

