Spring DAO


Spring DAO

连接池

使用JDBC访问数据库是,频繁的打开连接和关闭连接,造成性能影响,所以有了连接池。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,这项技术能明显提高对数据库操作的性能。

数据源(DataSource)

数据的来源,是提供某种所需要数据的器件或原始媒体。在数据源中存储了所有建立数据库连接的信息。通过提供正确的数据源名称,你可以找到相应的数据库连接。最终,我们通过DataSource来获取连接池(Connection Pool)中的Connection对象。

常见的开源连接池:Proxool Druid

Proxool

Proxool是一种Java数据库连接池技术。sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。

Proxool的常用属性:

driver: 驱动类
driverUrl: 连接字符串
user: 数据库登录名
password: 数据库登录密码
maximumConnectionCount: 最大连接数
minimumConnectionCount: 最小连接数
statistics: 连接池使用状况统计,值形如:1m,15m,1h,1d
simultaneousBuildThrottle:可一次建立的最大连接数
trace: 是否记录执行的sql语句

DataSource类:

DataSource代理: LazyConnectionDataSourceProxy
Proxool DataSource: ProxoolDataSource

示例:
















JdbcDaoSupport

JdbcDaoSupport作为DAO的父类。它与特定的数据源相关联。这个类最重要的功能就是使子类可以使用JdbcTemplate对象,而无需创建DriverManagerDataSource对象。
getJdbcTemplate()方法用于获取JdbcTemplate对象

示例:

<?xml version="1.0" encoding="UTF-8"?>
























resources.properties文件

资源属性文件
通常我们将数据的配置信息保存在properties文件中,方便阅读和修改。

示例:

db.driver.class=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
db.username=scott
db.password=tiger
proxool.maxConnCount=10
proxool.minConnCount=5
proxool.statistics=1m,15m,1h,1d
proxool.simultaneousBuildThrottle=30
proxool.trace=false

该类能让Spring读取到properties

示例:


	
		
			classpath:db-resource.properties
		
	

在Spring的xml配置文件中读取properties,和EL相同,${name}

示例:


	
		
			
			
			
			
			
			
			
			
			
		
	

Druid

Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池。

配置方式跟Proxool无太大差别

示例:


	
		
			
			
			
			
			
			
			

			
			

			
			

			
			

			
			
			

			
			
			

			
			
			
		
	

事务

是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

四个特征(ACID)原子性 一致性 隔离性 持久性

示例:

配置事务管理器

	
		
	

启用事务注解

@Transactional
修饰类或方法
常用属性
readOnly 只读,用于查询,提高效率
rollbackFor 抛出指定异常才会回滚
示例

@Transactional(rollbackFor = { Exception.class }, readOnly = true)

零配置

DAO不能继承自JdbcDaoSupport类,而是将JdbcTemplate注入进来
DAO使用@Repository标注
Service使用@Service标注
使用@Autowired自动注入

示例:

<?xml version="1.0" encoding="UTF-8"?>

	
	
    
     
	
		
			
				
				
				
				
				
				
				
				
				
			
		
	

	
		
			
				
				
				
				
				
				
				

				
				

				
				

				
				

				
				
				

				
				
				

				
				
				
			
		
	
	
	
		
	

	
	
		
			
		
	
	
	
	





package com.trkj2.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.trkj.pojos.Dept;

@Repository
public class DeptDAO {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	/**
	 * 新增部门
	 * 
	 * @param deptNo
	 * @param dname
	 * @param loc
	 */
	public void addNew(int deptNo, String dname, String loc) {
		String sql = "insert into dept values(?,?,?)";
		jdbcTemplate.update(sql, deptNo, dname, loc);
	}

	/**
	 * 修改部门信息
	 * 
	 * @param deptNo
	 * @param dname
	 * @param loc
	 */
	public void update(int deptNo, String dname, String loc) {
		String sql = "update dept set dname=?, loc=? where deptno=?";
		jdbcTemplate.update(sql, dname, loc, deptNo);
	}

	/**
	 * 删除部门
	 * 
	 * @param deptNo
	 */
	public void delete(int deptNo) {
		String sql = "delete from dept where deptno=?";
		jdbcTemplate.update(sql, deptNo);
	}

	/**
	 * 分页查询
	 * 
	 * @param curpage
	 *            当前页
	 * @param pagesize
	 *            页大小
	 * @return
	 */
	public List queryByPage(int curpage, int pagesize) {
		int start = (curpage - 1) * pagesize;
		int end = curpage * pagesize;
		String sql = "select deptno, dname, loc from (select rownum as rn," 
				+ " deptno, dname, loc from dept)"
				+ " where rn > ? and rn <= ?";
		return jdbcTemplate.query(sql, 
				new Object[] { start, end }, 
				new RowMapper() {
			@Override
			public Dept mapRow(ResultSet rs, int rowNum) throws SQLException {
				return new Dept(rs.getInt(1), rs.getString(2), rs.getString(3));
			}
		});
	}
}





package com.trkj2.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.trkj2.dao.DeptDAO;
import com.trkj2.pojos.Dept;

/**
 * 业务类
 * @author Administrator
 *
 */
@Service
public class DeptService {
	@Autowired
	private DeptDAO deptDAO;
	
	public void setDeptDAO(DeptDAO deptDAO) {
		this.deptDAO = deptDAO;
	}
	
	/**
	 * 批量添加部门
	 * @param list
	 */
	@Transactional(rollbackFor = {Exception.class})
	public void batchAddNew(List list){
		for(Dept dept: list){
			deptDAO.addNew(dept.getDeptNo(), 
					dept.getDname(), 
					dept.getLoc());
		}
	}
	
	public int query(){
		return 10;
	}
}

JUnit4注解

JUnit4常用的注解
@Before 修饰setUp()方法,在每个测试方法之前执行
@After 修饰tearDown()方法,在每个测试方法之后执行
@BeforeClass 在所有方法执行之前执行
@AfterClass 在所有方法执行之后执行
@Test 要测试的方法
@Ignore 不被测试的方法