DbUnit測(cè)試數(shù)據(jù)庫(kù)非常方便,但我更常用的功能是它的數(shù)據(jù)庫(kù)導(dǎo)入和導(dǎo)出。尤其在是做一個(gè)項(xiàng)目初始數(shù)據(jù)的時(shí)候。
但是一直有一個(gè)問(wèn)題困擾著:
有一個(gè)表T,有字段A,B,C三列。
最常見(jiàn)的方式是用ANT來(lái)執(zhí)行任務(wù),將數(shù)據(jù)保存到xml文件。
<target name="export" depends="set.dataBase.mysql">
<dbunit driver="${dataBase.driver}" supportBatchStatement="true" url="${dataBase.url}/${dataBase.name}" userid="${dataBase.user}" password="${dataBase.user.password}" classpathref="classpath">
<operation type="INSERT" src="${data.dir}/a.xml" />
</dbunit>
</target>
<dbunit driver="${dataBase.driver}" supportBatchStatement="true" url="${dataBase.url}/${dataBase.name}" userid="${dataBase.user}" password="${dataBase.user.password}" classpathref="classpath">
<operation type="INSERT" src="${data.dir}/a.xml" />
</dbunit>
</target>
a.xml文件格式如下:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<T a="1" b="1" c="1"/>
<T a="2" b="2" c="2"/>
</dataset>
<dataset>
<T a="1" b="1" c="1"/>
<T a="2" b="2" c="2"/>
</dataset>
這個(gè)時(shí)候如果所有字段都不為空還好辦。可以正常導(dǎo)入導(dǎo)出。但是當(dāng)有一個(gè)字段為空的時(shí)候就不好辦了。
為分兩種情況:第一行數(shù)據(jù)某字段為空和非第一行數(shù)據(jù)某字段為空
當(dāng)非第一行數(shù)據(jù)某字段為空時(shí)XML文件是這樣的
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<T a="1" b="1" c="1"/>
<T a="2" b="2" >
</dataset>
<dataset>
<T a="1" b="1" c="1"/>
<T a="2" b="2" >
</dataset>
表示第二行c字段為空。如果第一為空的時(shí)候XML文件變成這樣
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<T a="1" b="1" />
<T a="2" b="2" c="2"/>
</dataset>
<dataset>
<T a="1" b="1" />
<T a="2" b="2" c="2"/>
</dataset>
可是導(dǎo)出到數(shù)據(jù)庫(kù)這一列都為空。第二行以后的這一列的非空字段沒(méi)有導(dǎo)入進(jìn)去。
這個(gè)時(shí)候就不能使用這個(gè)文件格式,查看DBunit源才知道這個(gè)格式叫flat. dbunit還支持其他幾種格式數(shù)據(jù):xml、dtd、csv、xls。這里的xml文件的格式是這樣的:
<!DOCTYPE dataset SYSTEM "dataset.dtd">
<dataset>
<table name="TEST_TABLE">
<column>COL0</column>
<column>COL1</column>
<column>COL2</column>
<row>
<value>row 0 col 0</value>
<value>row 0 col 1</value>
<value>row 0 col 2</value>
</row>
<row>
<null/>
<value>row 1 col 1</value>
<null/>
</row>
</table>
<table name="SECOND_TABLE">
<column>COLUMN0</column>
<column>COLUMN1</column>
<row>
<value>row 0 col 0</value>
<value>row 0 col 1</value>
</row>
</table>
<table name='EMPTY_TABLE'>
<column>COLUMN0</column>
<column>COLUMN1</column>
</table>
</dataset>
<dataset>
<table name="TEST_TABLE">
<column>COL0</column>
<column>COL1</column>
<column>COL2</column>
<row>
<value>row 0 col 0</value>
<value>row 0 col 1</value>
<value>row 0 col 2</value>
</row>
<row>
<null/>
<value>row 1 col 1</value>
<null/>
</row>
</table>
<table name="SECOND_TABLE">
<column>COLUMN0</column>
<column>COLUMN1</column>
<row>
<value>row 0 col 0</value>
<value>row 0 col 1</value>
</row>
</table>
<table name='EMPTY_TABLE'>
<column>COLUMN0</column>
<column>COLUMN1</column>
</table>
</dataset>
這樣就可以指定為空的字段了。
用起來(lái)也簡(jiǎn)單,就是加一個(gè)format參數(shù)。(才知道為什么老提示format 為空,因?yàn)槟J(rèn)的就是flat)
<target name="export" depends="set.dataBase.mysql">
<dbunit driver="${dataBase.driver}" supportBatchStatement="true" url="${dataBase.url}/${dataBase.name}" userid="${dataBase.user}" password="${dataBase.user.password}" classpathref="classpath">
<operation type="INSERT" src="${data.dir}/a.xml" format="xml"/>
</dbunit>
</target>
<dbunit driver="${dataBase.driver}" supportBatchStatement="true" url="${dataBase.url}/${dataBase.name}" userid="${dataBase.user}" password="${dataBase.user.password}" classpathref="classpath">
<operation type="INSERT" src="${data.dir}/a.xml" format="xml"/>
</dbunit>
</target>
<target name="export" depends="set.dataBase.mysql">
<dbunit driver="${dataBase.driver}" supportBatchStatement="true" url="${dataBase.url}/${dataBase.name}" userid="${dataBase.user}" password="${dataBase.user.password}" classpathref="classpath">
<export dest="c:/a.xml" format="xml">
<table name="a" />
</export>
</dbunit>
</target>
<dbunit driver="${dataBase.driver}" supportBatchStatement="true" url="${dataBase.url}/${dataBase.name}" userid="${dataBase.user}" password="${dataBase.user.password}" classpathref="classpath">
<export dest="c:/a.xml" format="xml">
<table name="a" />
</export>
</dbunit>
</target>
現(xiàn)在就可以自由的導(dǎo)入導(dǎo)出了.