Spring DAO

发布时间:2022-06-28 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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

示例:

<bean id="dataSource_proxool"
class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<proPErty name="targetDataSource">
<bean class="org.LOGicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="driverUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
<property name="user" value="scott" />
<property name="password" value="tiger" />
<property name="maximumConnectionCount" value="10" />
<property name="minimumConnectionCount" value="5" />
<property name="statistics" value="1m,15m,1h,1d" />
<property name="simultaneousBuildThrottle" value="30" />
<property name="trace" value="false" />
</bean>
</property>
</bean>

JdbcDaoSupport

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

示例:

<?XMl version="1.0" encoding="UTF-8"?>
<beans xMLns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd   
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">


<bean id="dataSource_proxool"
class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource">
<bean class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="driverUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
<property name="user" value="scott" />
<property name="password" value="tiger" />
<property name="maximumConnectionCount" value="10" />
<property name="minimumConnectionCount" value="5" />
<property name="statistics" value="1m,15m,1h,1d" />
<property name="simultaneousBuildThrottle" value="30" />
<property name="trace" value="false" />
</bean>
</property>
</bean>

<bean id="deptDAO" class="com.trkj.dao.DeptDAO">
<property name="dataSource" ref="dataSource_proxool"></property>
</bean>
</beans>

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

示例:

<bean
	class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations">
		<list>
			<value>classpath:db-resource.properties</value>
		</list>
	</property>
</bean>

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

示例:

<bean id="dataSource_proxool"
		class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
	<property name="targetDataSource">
		<bean class="org.logicalcobwebs.proxool.ProxoolDataSource">
			<property name="driver" value="${db.driver.class}" />
			<property name="driverUrl" value="${db.url}" />
			<property name="user" value="${db.username}" />
			<property name="password" value="${db.password}" />
			<property name="maximumConnectionCount" value="${proxool.maxConnCount}" />
			<property name="minimumConnectionCount" value="${proxool.minConnCount}" />
			<property name="statistics" value="${proxool.statistics}" />
			<property name="simultaneousBuildThrottle" value="${proxool.simultaneousBuildThrottle}" />
			<property name="trace" value="${proxool.trace}" />
		</bean>
	</property>
</bean>

Druid

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

配置方式跟Proxool无太大差别

示例:

<bean id="dataSource_druid"
		class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
	<property name="targetDataSource">
		<bean class="com.alibaba.druid.pool.DruidDataSource">
			<property name="url" value="${db.url}" />
			<property name="username" value="${db.username}" />
			<property name="password" value="${db.password}" />
			<!-- 配置初始化大小、最小、最大 -->
			<property name="inITialSize" value="1" />
			<property name="minidle" value="10" />
			<property name="maxActive" value="30" />

			<!-- 配置获取连接等待超时的时间 -->
			<property name="maxWait" value="60000" />

			<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
			<property name="timeBetweenEvictionRunsMillis" value="60000" />

			<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
			<property name="minEvictableidleTimeMillis" value="300000" />

			<property name="testWhileIdle" value="false" />
			<property name="testOnBorrow" value="false" />
			<property name="testOnReturn" value="false" />

			<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
			<property name="poolPreparedstatements" value="false" />
			<property name="maxpoolPreparedStatementPerConnectionSize"
				value="20" />

			<property name="defaultAutoCommit" value="true" />
			<property name="ValidationQueryTimeout" value="60000" />
			<property name="validationQuery" value="select 1" />
		</bean>
	</property>
</bean>

事务

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

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

示例:

配置事务管理器
<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource">
		<ref bean="dataSource_druid" />
	</property>
</bean>
启用事务注解
<tx:annotation-driven transaction-manager="transactionManager" />

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

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

零配置

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

示例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	
	<context:annotation-config />
    <context:component-scan base-package="com.trkj2" />
     
	<bean id="dataSource_proxool"
		class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
		<property name="targetDataSource">
			<bean class="org.logicalcobwebs.proxool.ProxoolDataSource">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
				<property name="driverUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
				<property name="user" value="scott" />
				<property name="password" value="tiger" />
				<property name="maximumConnectionCount" value="10" />
				<property name="minimumConnectionCount" value="5" />
				<property name="statistics" value="1m,15m,1h,1d" />
				<property name="simultaneousBuildThrottle" value="30" />
				<property name="trace" value="false" />
			</bean>
		</property>
	</bean>

	<bean id="dataSource_druid"
		class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
		<property name="targetDataSource">
			<bean class="com.alibaba.druid.pool.DruidDataSource">
				<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
				<property name="username" value="scott" />
				<property name="password" value="tiger" />
				<!-- 配置初始化大小、最小、最大 -->
				<property name="initialSize" value="1" />
				<property name="minIdle" value="10" />
				<property name="maxActive" value="30" />

				<!-- 配置获取连接等待超时的时间 -->
				<property name="maxWait" value="60000" />

				<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
				<property name="timeBetweenEvictionRunsMillis" value="60000" />

				<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
				<property name="minEvictableIdleTimeMillis" value="300000" />

				<property name="testWhileIdle" value="false" />
				<property name="testOnBorrow" value="false" />
				<property name="testOnReturn" value="false" />

				<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
				<property name="poolPreparedStatements" value="false" />
				<property name="maxPoolPreparedStatementPerConnectionSize"
					value="20" />

				<property name="defaultAutoCommit" value="true" />
				<property name="ValidationQueryTimeout" value="60000" />
				<property name="validationQuery" value="select 1" />
			</bean>
		</property>
	</bean>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource_druid"></property>
	</bean>

	<!-- 事务管理器,这是一个切面,定义的是环绕通知 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref bean="dataSource_druid" />
		</property>
	</bean>
	
	<!-- 启用事务注解 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
</beans>




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<Dept> 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<Dept>() {
			@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<Dept> 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 不被测试的方法

脚本宝典总结

以上是脚本宝典为你收集整理的Spring DAO全部内容,希望文章能够帮你解决Spring DAO所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。