Spring DAO 对JDBC的改进

简化了DAO 实现类组件的编写  对jdbc的操作步骤 做了简化和封装 
提供了基于AOP的事务管理  
对JDBC中的异常 做了封装   把原来的检查异常 封装成了继承自 运行异常的一个异常类  `DataAccessException` 

SpringDAO的核心类

  • JdbcTemplate Jdbc模板类
    自动加载驱动 自动获取连接 自动获取sql执行环境 以及 自动释放资源
    • JdbcDaoSupport JdbcDAO 的支持类
      这个类 可以提供模板对象

不继承JdbcDaoSupport

不继承JdbcDaoSupport的方式 完成对数据库的访问
和之前的不同在于 需要我们自己在容器中创建一个模板对象
(模板对象依赖于 dataSource)
再把模板 注入给 DAO 的实现类 使用自己的模板完成对应的操作

Spring 的声明式事务
通过Spring 的配置 讲操作纳入到事务管理之中
解除了事务管理代码 和 业务代码的耦合度
当不需要事务管理时 可以从配置文件中将其移除

Spring 声明式事务的实现步骤

  1. 开启声明式事务
    tx:annotation-driven transaction-manager=”事务管理器id”
    proxy-target-class=”false” />
    proxy-target-class 如果是false 代表优先使用sun公司的代理机制生成代理
    proxy-target-class 如果是true 代表使用CGLIB的代理机制生成代理

  2. 在Spring 容器中创建一个事务管理器对象—- 依赖于dataSource

  3. 在需要事务管理的类或者方法上加事务管理标注
    @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>


11月      Java

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!