随笔-112  评论-73  文章-0  trackbacks-0

DbUnit测试数据库非常方便,但我更常用的功能是它的数据库导入和导出。尤其在是做一个项目初始数据的时候。

但是一直有一个问题困扰着:

有一个表T,有字段A,B,C三列。

最常见的方式是用ANT来执行任务,将数据保存到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>

这个时候如果所有字段都不为空还好办。可以正常导入导出。但是当有一个字段为空的时候就不好办了。

为分两种情况:第一行数据某字段为空和非第一行数据某字段为空

当非第一行数据某字段为空时XML文件是这样的

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

表示第二行c字段为空。如果第一为空的时候XML文件变成这样

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

可是导出到数据库这一列都为空。第二行以后的这一列的非空字段没有导入进去。

这个时候就不能使用这个文件格式,查看DBunit源才知道这个格式叫flat. dbunit还支持其他几种格式数据: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>

这样就可以指定为空的字段了。

用起来也简单,就是加一个format参数。(才知道为什么老提示format 为空,因为默认的就是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>

现在就可以自由的导入导出了.

posted on 2008-12-09 21:10 Libo 阅读(2655) 评论(1)  编辑  收藏 所属分类: 数据库

评论:
# re: dbunit支持多种格式导入导出 2008-12-09 22:54 | rocket
呵呵,dbunit还有更有意思的呢,可以导出相关的依赖表。不过可惜的是这这种方法不支持部分sql查询,我现在在做一个dbunit的export extension.可以支持数据库主外键依赖的表导出。希望还可以支持业务逻辑的关联关系。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问