Spring DAO 对JDBC的改进
简化了DAO 实现类组件的编写 对jdbc的操作步骤 做了简化和封装
提供了基于AOP的事务管理
对JDBC中的异常 做了封装 把原来的检查异常 封装成了继承自 运行异常的一个异常类 `DataAccessException`
SpringDAO的核心类
- JdbcTemplate
Jdbc
模板类
自动加载驱动 自动获取连接 自动获取sql执行环境 以及 自动释放资源- JdbcDaoSupport
JdbcDAO
的支持类
这个类 可以提供模板对象
- JdbcDaoSupport
不继承JdbcDaoSupport
不继承JdbcDaoSupport的方式 完成对数据库的访问
和之前的不同在于 需要我们自己在容器中创建一个模板对象
(模板对象依赖于 dataSource)
再把模板 注入给 DAO 的实现类 使用自己的模板完成对应的操作
Spring 的声明式事务
通过Spring 的配置 讲操作纳入到事务管理之中
解除了事务管理代码 和 业务代码的耦合度
当不需要事务管理时 可以从配置文件中将其移除
Spring 声明式事务的实现步骤
开启声明式事务
tx:annotation-driven transaction-manager=”事务管理器id”
proxy-target-class=”false” />
proxy-target-class 如果是false 代表优先使用sun公司的代理机制生成代理
proxy-target-class 如果是true 代表使用CGLIB的代理机制生成代理在Spring 容器中创建一个事务管理器对象—- 依赖于dataSource
在需要事务管理的类或者方法上加事务管理标注
@Transactional@Transactional 的属性
rollbackFor Spring 的声明式事务 默认只针对运行时异常进行事务回滚
noRollbackFor 针对指定的运行时异常 不回滚
isolation 事务隔离级别
三大读问题
脏读 一个事务读取到了另外一个事务没有提交的数据
不可重复读 一个事务在开始时 读取了一份数据 另外一个事务修改了这份数据 并进行了提交当第一个事务再次读取数据时 发现数据发了改变。
幻读 一个事务统计了整张表的所有数据 另外一个事务增加了数据 并进行了提交 当再次统计数据时 数据发生了改变
readOnly 只读事务 只有当事务语句都是查询时 才能使用这个属性的值是true默认这个属性的值是false
propagation 事务传播特性 一个方法 去调用另外一个事务方法时
事务表现
Propagation.REQUIRED 如果当前方法没有事务 则 会开启新事务 如果当前方法有事务 则将事务加入到当前事务之中
propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
applicationContext配置
如下:
<?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"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd">
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.xdl"></context:component-scan>
<!-- 配置连接池对象 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
<property name="url">
<value>jdbc:oracle:thin:@127.0.0.1:1521:xe</value>
</property>
<property name="username" value="system"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 创建一个模板对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean>
<!-- 开启声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="false"/>
<!-- 创建一个事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!