日期:2014-05-16  浏览次数:20361 次

dbunit入门 (一)基础实例
1. 首先导入包。
在pom.xml中加入依赖

<dependency>
				<groupId>org.dbunit</groupId>
				<artifactId>dbunit</artifactId>
				<version>2.4.9</version>
				<scope>test</scope>
			</dependency>


此时会导入三个包, dbunit, slf4j和commons-collections

2.创建dbunit的数据xml文件

dbunit在创建数据库的时候是根据我们的数据xml文件的内容来创建的。
所以这个文件是必不可少的。
格式如下:
<?xml version="1.0" encoding="utf-8"?>
<dataset>
<!-- 这是基于属性的节点存储方式 -->
  <tablename column_name="data" column_name2="data2"/>
  
  <t_user id="1" username="alleni" password="123"/>
  <!-- 一个xml文件可以存放多个数据库table的内容-->

</dataset>


3. 创建dbunit的connection
dbunit需要一个连接数据库的connection,这个connection必须是当前项目的。

public class DbUtil {
	public static Connection getCon(){
		Connection con=null;
				try {
					con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","admin","123");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return con;
	}


	@Test
	public void testLoad() throws DatabaseUnitException{
		IDatabaseConnection con=new DatabaseConnection(DbUtil.getCon());
		System.out.println(con);
	}


[color=red]note: 这里可能会遇到SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
解决方法是加入dependecy

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-simple</artifactId>
	<version>1.7.5</version>
</dependency>
            
[/color]



4.通过xml数据文件获取DataSet对象。

	@Test
	public void testLoad() throws DatabaseUnitException{
		
		
		IDatabaseConnection con=new DatabaseConnection(DbUtil.getCon());
		System.out.println(con);
		
		
		
		/*
		 * FlatXmlDataSet用来获取基于属性存储的属性值
		 * 
		 */
		
		IDataSet ds=new FlatXmlDataSet(new FlatXmlProducer(new InputSource(TestDbunit.class.getClassLoader().getResourceAsStream("t_user.xml"))));
		
		System.out.println(ds);
	}



5.执行DatabaseOperation的execute,进行数据库操作。

@Test
	public void testLoad() throws DatabaseUnitException{
		
		
		IDatabaseConnection con=new DatabaseConnection(DbUtil.getCon());
		System.out.println(con);
		
		
		
		/*
		 * FlatXmlDataSet用来获取基于属性存储的属性值
		 * 
		 */
		
		IDataSet ds=new FlatXmlDataSet(new FlatXmlProducer(new InputSource(TestDbunit.class.getClassLoader().getResourceAsStream("t_user.xml"))));
		
		System.out.println(ds);
		

		//clean_insert表示先把数据库里的所有数据都清空,然后在把t_user.xml的数据插入进去
		try
		{
			DatabaseOperation.CLEAN_INSERT.execute(con, ds);
		}
		catch (SQLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

这里执行了之后,便会将t_user里的数据按照格式加入到数据库中。






=========================================
这里说一下最常见的一些问题:

1.org.dbunit.dataset.NoSuchColumnException: T_USER.USERNAME -  (Non-uppercase input column: username) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.

这种问题属于xml文件里的数据和数据库里的格式不对应。
上面的t_user.username就是xml表里的username.
而数据库里的t_user表中的column名称是name.
dbunit在数据库表中找不到username,便报错了。



2. org.dbunit.dataset.NoSuchTableException: t_user
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288)


数据库中没有该table。
dbunit是不会帮助我们建立表格的。(可以看到t_user.xml中只指定了数据库表名和列名,并没有详细的数据格式信息)

在使用dbunit进行测试之前必须手动在数据库中创建表格。或者使用hibernate来创建。



3. 一些乱七八糟的错误: 今天折腾了一下午的错误,就是因为dbunit的数据库的链接是通过我们自定义jdbc的getCon方法的连接。 和Hibernate Spring毫无