Spring学习总结(四)——Spring单元测试和JDBCTemplate的简单使用

  Spring单元测试

    使用spring中对Junit框架的整合功能, 除了junit4和spring的jar包,还需要spring-test.jar。

 示例:

 

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	<!-- Spring容器自动装配bean,搜索的的路径配置 -->
	<context:component-scan base-package="com.springstudy" />
	
	<!-- 属性占位符加载器 加载配置文件jdbc.properties -->
	<context:property-placeholder location="jdbc.properties" />

	<!-- 使用Spring-jdbc包自带的 进行实例化数据源DriverManagerDataSource -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${jdbc.driver}" />
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />	
		<!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次 -->
		<property name="acquireRetryAttempts" value="3" />
	</bean>

	<!-- spring jdbc模板数据源设定 -->
	<bean id="jdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

    <!-- Spring JDBC 事务管理器 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

   jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springstudy?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=

   EmpTest.java(单元测试)

package com.springstudy.test;

import static org.junit.Assert.*;

import javax.annotation.Resource;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.springstudy.pojo.Employee;
import com.springstudy.service.IEmployeeService;

/*@RunWith 注释标签是 Junit 提供的,用来说明此测试类的运行者,这里用了 SpringJUnit4ClassRunner,
这个类是一个针对 Junit 运行环境的自定义扩展,用来标准化在 Spring 环境中 Junit4.5 的测试用例,例如支持的注释标签的标准化*/
@RunWith(SpringJUnit4ClassRunner.class)

/*@ContextConfiguration 注释标签是 Spring test context 提供的,
用来指定 Spring 配置信息的来源,支持指定 XML 文件位置或者 Spring 配置类名。*/
@ContextConfiguration(locations = {"classpath:beans.xml"}) 

/*@Transactional 注释标签是表明此测试类的事务启用,这样所有的测试方案都会自动的 rollback,
 即不用自己清除之前对数据库的变更了,使用@Transactional需先在xml文件中配置jdbc事务管理器*/
@Transactional 
public class EmpTest {
    
	@Resource(name="empService")
	private IEmployeeService empService;
	
	@Test
	public void testFindEmployeeByNo() {
		String empno = "1001";
		Employee emp = empService.findEmployeeByNo(empno);
		System.out.println(emp);		
	}
	
	@Test
	public void testUpdateEmployee() {
		Employee emp = new Employee();
		emp.setEmpNo("1001");
		emp.setEmpName("赵六");
		int effectLine = empService.updateEmployee(emp);
		// 使用断言
		// assertEquals 如果预期值与真实值相等,则运行success,反之Failure
	    Assert.assertEquals(1, effectLine);
	    
	}

}

@RunWith: 该注解是Junit 提供的,用来说明此测试类的运行者,这里用了 SpringJUnit4ClassRunner,
这个类是一个针对 Junit 运行环境的自定义扩展,用来标准化在 Spring 环境中 Junit4.5 的测试用例,例如支持的注释标签的标准化。

@ContextConfiguration :该注解是Spring test context 提供的,用来指定 Spring 配置信息的来源,支持指定 XML 文件位置或者 Spring 配置类名,如上面的代码所示,当在一个类中使用该注解时,该类中其实已经引用了Application,从而无需再声明ApplicationContext。

@Transactional :该注解是表明此测试类的事务启用,这样所有的测试方案都会自动的 rollback,即不用自己清除之前对数据库的变更了,使用@Transactional需先在xml文件中配置jdbc事务管理器,如:

<!-- Spring JDBC 事务管理器 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

@Transactional的属性:

属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation可选的事务传播行为设置
isolationenum: Isolation可选的事务隔离级别设置
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组

测试结果:

JDBCTemplate的简单使用示例

 1.需要在Spring的配置文件中进行相关配置,如:

<!-- Spring容器自动装配bean,搜索的的路径配置 -->
	<context:component-scan base-package="com.springstudy" />
	
	<!-- 属性占位符加载器 加载配置文件jdbc.properties -->
	<context:property-placeholder location="jdbc.properties" />

	<!-- 使用Spring-jdbc包自带的 进行实例化数据源DriverManagerDataSource -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${jdbc.driver}" />
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />	
		<!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次 -->
		<property name="acquireRetryAttempts" value="3" />
	</bean>

	<!-- spring jdbc模板数据源设定 -->
	<bean id="jdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

2.使用示例:

package com.springstudy.dao;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.springstudy.pojo.Employee;

@Repository("empDao")
public class EmployeeDaoImpl  implements IEmployeeDao{
	private JdbcTemplate jdbcTemplate;
	
	@Resource
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public Employee findEmployeeByNo(String empno) {
		String sql = "select empNo,empName from emp where empNo=?";
		Object[] argus = {empno};
		Employee result = jdbcTemplate.queryForObject(sql, argus, new RowMapper<Employee>() {
			@Override
			public Employee mapRow(ResultSet rs, int arg1) throws SQLException {
				Employee emp=new Employee();
				emp.setEmpNo(rs.getString("empNo"));
				emp.setEmpName(rs.getString("empName"));
				return emp;
			}
		});
		return result;
	}
	
	public int updateEmployee(Employee emp) {
		String sql = "update emp set empName=? where empNo=?";
		Object[] args = {emp.getEmpName(),emp.getEmpNo()};
		int effectLine = jdbcTemplate.update(sql,args);
		return effectLine;
		
	}
}

 

  

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值