隨筆-112  評(píng)論-73  文章-0  trackbacks-0

          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>

          a.xml文件格式如下:

          <?xml version='1.0' encoding='UTF-8'?>
          <dataset>
          <a="1" b="1" c="1"/>
          <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>
          <a="1" b="1" c="1"/>
          <a="2" b="2" >
          </dataset>

          表示第二行c字段為空。如果第一為空的時(shí)候XML文件變成這樣

          <?xml version='1.0' encoding='UTF-8'?>
          <dataset>
          <a="1" b="1" />
          <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>

          這樣就可以指定為空的字段了。

          用起來(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>
          <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>

          現(xiàn)在就可以自由的導(dǎo)入導(dǎo)出了.

          posted on 2008-12-09 21:10 Libo 閱讀(2682) 評(píng)論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          評(píng)論:
          # re: dbunit支持多種格式導(dǎo)入導(dǎo)出 2008-12-09 22:54 | rocket
          呵呵,dbunit還有更有意思的呢,可以導(dǎo)出相關(guān)的依賴表。不過(guò)可惜的是這這種方法不支持部分sql查詢,我現(xiàn)在在做一個(gè)dbunit的export extension.可以支持?jǐn)?shù)據(jù)庫(kù)主外鍵依賴的表導(dǎo)出。希望還可以支持業(yè)務(wù)邏輯的關(guān)聯(lián)關(guān)系。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 桦川县| 沐川县| 肥西县| 屯门区| 南投市| 万盛区| 盐边县| 兴化市| 剑河县| 甘谷县| 合作市| 孝感市| 阳春市| 墨玉县| 宁德市| 兴宁市| 丹江口市| 阿克| 观塘区| 九龙坡区| 桃园市| 威远县| 南丰县| 繁峙县| 大同市| 新丰县| 孝昌县| 塘沽区| 公安县| 柯坪县| 沅陵县| 内丘县| 许昌市| 饶河县| 和平县| 海口市| 营山县| 莎车县| 兰坪| 涟水县| 吉安县|