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的更多相关文章

  1. 关于Hibernate在反向工程时无法选择Spring DAO Type的解决方法【更新版】

    目录(?)[+] IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结! 之前有一篇文章中(Hibernate反向工程步骤及DAO Type无法选择Spring DAO解决方法)提到, ...

  2. 学习Spring5必知必会(6)~Spring DAO

    一.Spring 对持久层技术的支持 Spring DAO 1.模板类: 2.基类: 二.spring JDBC [JDBCTemplate 模板类] 1.案例:使用jdbc 完成crud操作 (1) ...

  3. spring DAO 有什么用?

    Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一 种统一的方式工作.这使得用户容易在持久性技术之间切换.它还允许您在编写 代码时,无需考虑捕获每种技术 ...

  4. Spring DAO模块

    Spring的DAO模块提供了对JDBC.Hibernate.Mybatis等DAO层支持,本节介绍DAO模块对JDBC的支持.DAO模块依赖ommons-dbcp.jar.commons-pool. ...

  5. spring深入学习(五)-----spring dao、事务管理

    访问数据库基本是所有java web项目必备的,不论是oracle.mysql,或者是nosql,肯定需要和数据库打交道.一开始学java的时候,肯定是以jdbc为基础,如下: private sta ...

  6. Spring DAO vs Spring ORM vs Spring JDBC

    Pat 的疑惑 最近关注于 Spring 提供的数据访问技术,对于 Spring 相关的这几个项目有何不同我不是太明白: Spring-DAO (http://docs.spring.io/sprin ...

  7. SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

    SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>& ...

  8. Spring之DAO一

    前面博客把bean.aop简单了解了一下,今天主要是了解Spring中DAO层,如果使用传统的JDBC时需要创建连接.打开.执行sql.关闭连接这一系列的步骤,Spring框架对JDBC进行了封装,我 ...

  9. Spring之DAO二

    上一篇算是把JdbcDaoSupport的使用演示了一下,这篇主要是演示MappingSqlQuery.SqlUpdate.SqlFunction的使用以及Spring的事务管理. 一.Mapping ...

随机推荐

  1. Shadertoy 教程 Part 2 - 圆和动画

    Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...

  2. js fetch异步请求使用详解

    目录 认识异步 fetch(url) response.json() 结合async和await 异常处理 post请求 认识异步 首先我们得明白请求是一个异步的过程. 因为请求需要时间向服务器发送请 ...

  3. linked-list-cycle-ii leetcode C++

    Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follo ...

  4. mysql查看数据库大小

    要想知道每个数据库的大小的话,步骤如下: 1.进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2.查询所有数据的大小: s ...

  5. 『学了就忘』Linux基础命令 — 28、别名和常用快捷键

    目录 1.别名 2.常用快捷键 1.别名 别名也是Shell中的命令. 命令的别名,就是命令的小名,主要是用于照顾管理员使用习惯的. 命令格式: # 查询系统中命令别名 [root@localhost ...

  6. SpringBoot 全局异常拦截捕获处理

    一.全局异常处理 //Result定义全局数据返回对象 package com.xiaobing.demo001.domain; public class Result { private Integ ...

  7. 前端调试工具(DevTools)

    前端调试工具(DevTools) 开启:F12 布局 切换PC和移动端 页面元素的快速测试技巧 保持元素的hover等状态:选中当前行点击右键 元素状态改变的监控技巧 触发断点后元素状态不会再改变,可 ...

  8. LeetCode刷题 二分专题

    二分专题 二分的题目类型 对于满足二段性的题目的两套模板 模板一 模板如下 模板二 模板如下 解决二分题目的一般流程 LeeCode实战 LC69.x的平方根 解法思路 LC35.搜索插入位置 解法思 ...

  9. PHP create_function代码注入

    今天做ctf遇到一道题,记录一下知识点 <?php class Noteasy{ protected $param1; protected $param2; function __destruc ...

  10. LINKERD 2.11 中文实战手册

    1. 将您的服务添加到 Linkerd. 为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理注入到它们的 pod 中来进行 网格化 . 2. 自动化的金丝雀发布. 通 ...