框架学习—Spring的事务管理、Spring框架的JDBC模板

1.Spring框架的AOP技术(注解方式)

1.1 案例演示

1.1.1 步骤一:引入具体的开发的jar包
    Spring框架开发的IOC包(4个):
    spring-beans-4.2.4.RELEASE.jar
    spring-context-4.2.4.RELEASE.jar
    spring-core-4.2.4.RELEASE.jar
    spring-expression-4.2.4.RELEASE.jar
    ---------------------
    日志包(2个):
    com.springsource.org.apache.log4j-1.2.15.jar
    com.springsource.org.apache.commons.logging-1.1.1.jar
    ---------------------
    Spring框架的AOP开发包(2个传统AOP开发包+2个aspectJ的开发包):
    spring-aop-4.2.4.RELEASE.jar
    com.springsource.org.aopalliance-1.0.0.jar
    spring-aspects-4.2.4.RELEASE.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

1.1.2 步骤二:创建Spring的配置文件,引入具体的AOP的约束
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>

1.1.3 步骤三:创建包结构,编写具体的接口和类
    CustomerDao 接口
    CustomerDaoImpl 实现类

1.1.4 步骤四:将目标类配置到Spring中
    <bean id="customerDao" class="pers.hdh.demo1.aop.CustomerDaoImpl" />

1.1.5 步骤五:定义切面
    添加切面和通知的注解

这里写图片描述

1.1.6 步骤六:在配置文件中定义切面类
    <bean id="myAspectAnno" class="pers.hdh.demo1.aop.MyAspectAnno" />

1.1.7 步骤七:在配置文件中开启自动代理
<aop:aspectj-autoproxy />

1.1.8 编写测试代码

这里写图片描述

1.2 通知类型

@Before:前置通知
@AfterReturning:后置通知
@Around:环绕通知(目标对象对象默认不执行,需要手动执行)
@After:最终通知
@AfterThrowing:异常抛出通知

2.Spring的JDBC模板技术

2.1 JDBC模板类的案例演示

2.1.1 步骤一:创建数据库的表结构
    create database spring_day03;
    use spring_day03;
    create table t_account(
        id int primary key auto_increment,
        name varchar(20),
        money double
    );

2.1.2 步骤二:引入开发的jar包
    Spring框架开发的IOC包(4个):
    spring-beans-4.2.4.RELEASE.jar
    spring-context-4.2.4.RELEASE.jar
    spring-core-4.2.4.RELEASE.jar
    spring-expression-4.2.4.RELEASE.jar
    ---------------------
    日志包(2个):
    com.springsource.org.apache.log4j-1.2.15.jar
    com.springsource.org.apache.commons.logging-1.1.1.jar
    ---------------------
    Spring框架的AOP开发包(2个传统AOP开发包+2个aspectJ的开发包):
    spring-aop-4.2.4.RELEASE.jar
    com.springsource.org.aopalliance-1.0.0.jar
    spring-aspects-4.2.4.RELEASE.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
    ---------------------
    JDBC模板需要的jar包(3个):
    数据库驱动jar包
    spring-jdbc-4.2.4.RELEASE.jar
    spring-tx-4.2.4.RELEASE.jar

2.1.3 编写代码

这里写图片描述

2.2 Spring框架管理模板类

2.2.1 将原本自己手动new的方式,把类交给Spring框架管理。
步骤一:Spring管理内置的连接池

这里写图片描述

步骤二:Spring JDBC模板管理类

这里写图片描述

步骤三:编写测试代码

这里写图片描述

2.3 Spring框架管理连接池

2.3.1 管理DBCP连接池
    引入DBCP的2个jar包:
    com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
    com.springsource.org.apache.commons.pool-1.5.3.jar

    编写配置文件:

这里写图片描述

2.3.2 管理C3P0连接池
    引入C3P0的Jar包
    com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
    编写配置文件:

这里写图片描述

2.4 JDBC模板的简单操作

2.4.1 添加/修改/删除操作
    JdbcTemplate.update(String sql, Object... args)

2.4.2 查询操作
    查询一条数据:JdbcTemplate.queryForObject(String sql, RowMapper<Account> rowMapper, Object... args)
    查询多条数据:JdbcTemplate.query(String sql, RowMapper<Account> rowMapper)

    补充:

这里写图片描述


3.Spring框架的事务管理

3.1 事务的基本概念

3.1.1 事务:指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败。

3.1.2 事务的特性:原子性、一致性、隔离性、持久性

3.1.3 不考虑隔离性可能引发的安全性问题
    读问题:脏读、不可重复读、虚读。
    写问题:丢失更新。

3.1.4 如何解决安全性问题
    解决读问题,设置数据库隔离级别。
    解决写问题,悲观锁或乐观锁。

3.2 事务管理相关的类与API

3.2.1 PlatformTransactionManager接口:
    平台事务管理器。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类。

3.2.2 TransactionDefinition接口:
    事务定义信息,包括事物的隔离级别、传播行为、超时、只读。

3.2.3 TransactionStatus接口:
    事务的状态。

3.2.4 总结:
    平台事务管理器管理事务对象,根据事务定义的信息TransactionDefinition进行事务管理,在管理事务中产生中一些状态,将状态记录到TransactionStatus中。

3.2.5 PlatformTransactionManager接口中实现类的常用方法
    接口的实现类:
    如果使用Spring的JDBC模板或者MyBatis框架,选择DataSourceTransactionManager实现类。
    如果使用Hibernate框架,选择HibernateTransactionManger实现类。
    ---------------------
    接口的常用方法:
    void commit(TranscationStatus status);
    TransactionStatus getTransaction(TransactionDefinition definition);
    void rollback(TransactionStatus status);

3.2.6 TranscationDefinition
    事务隔离级别的常量:
    static int ISOLATION_DEFAULT
    static int ISOLATION_READ_UNCOMMITED
    static int ISOLATION_READ_COMMITED
    static int ISOLATION_REPEATABLE_READ
    static int ISOLATION_SERIALIZABLE
    ---------------------
    事务的传播行为常量(一般使用默认值):
    注:传播行为解决的是业务层之间的方法调用。
    PROPAGATION_REQUIRED(默认值) -- A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!
    PROPAGATION_SUPPORTS          -- A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.
    PROPAGATION_MANDATORY         -- A中有事务,使用A中的事务.如果A没有事务.抛出异常.

    PROPAGATION_REQUIRES_NEW(记) -- A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中)
    PROPAGATION_NOT_SUPPORTED     -- A中有事务,将A中的事务挂起.
    PROPAGATION_NEVER             -- A中有事务,抛出异常.

    PROPAGATION_NESTED(记)       -- 嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)

3.3 搭建转账案例的环境

3.3.1 步骤一:引入jar包
    Spring框架开发的IOC包(4个):
    spring-beans-4.2.4.RELEASE.jar
    spring-context-4.2.4.RELEASE.jar
    spring-core-4.2.4.RELEASE.jar
    spring-expression-4.2.4.RELEASE.jar
    ---------------------
    日志包(2个):
    com.springsource.org.apache.log4j-1.2.15.jar
    com.springsource.org.apache.commons.logging-1.1.1.jar
    ---------------------
    Spring框架的AOP开发包(2个传统AOP开发包+2个aspectJ的开发包):
    spring-aop-4.2.4.RELEASE.jar
    com.springsource.org.aopalliance-1.0.0.jar
    spring-aspects-4.2.4.RELEASE.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
    ---------------------
    Mysql驱动包
    ---------------------
    C3P0的包:
    com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
    ---------------------
    JDBC包(2个):
    spring-jdbc-4.2.4.RELEASE.jar
    spring-tx-4.2.4.RELEASE.jar
    ---------------------
    整合JUnit测试包:
    spring-test-4.2.4.RELEASE.jar

3.3.2 步骤二:引入配置文件
    log4j.properties
    applicationContext.xml

3.3.3 步骤三:创建对应的包结构和类

这里写图片描述

3.3.4 步骤四:将类配置到Spring中
    <bean id="accountService" class="pers.hdh.AccountServiceImpl"></bean>
    <bean id="accountDao" class=" pers.hdh.AccountDaoImpl"></bean>

3.3.5 步骤五:依赖注入,将JDBC模板注入Dao(注意这里看下图!),将Dao注入Service中
<bean id="accountService" class="pers.hdh.AccountServiceImpl">
    <property name="accountDao" ref="accountDao" />
</bean>
<bean id="accountDao" class=" pers.hdh.AccountDaoImpl">
    <property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>

这里写图片描述

扫描二维码关注公众号,回复: 1642933 查看本文章
3.3.6 步骤六:实现Dao和Service中的方法
3.3.7 步骤七:编写测试程序

3.4 事务管理的分类

3.4.1 Spring的编程式事务管理
    通过手动编写代码的方式完成事务的管理。
3.4.2 Spring的声明式事务管理(推荐,底层采用AOP技术)
    通过配置文件实现。

3.5 编程式的事务管理

3.5.1 步骤一:配置事务管理器,Spring使用PlatformTransactionManager接口来管理事务

这里写图片描述

3.5.2 步骤二:配置事故管理的模板类(简化开发)

这里写图片描述

3.5.3 步骤三:在需要进行事务管理的类(Service层)中注入事务管理器模板

这里写图片描述

3.5.4 步骤四:在Service层使用管理器模板对象管理事务

这里写图片描述

3.6 声明式事务管理(重点)

3.6.1 基于AspectJ的XML方式
3.6.2 基于AspectJ的注解方式

3.7 事务管理之基于AspectJ的XML方式

继续转账例子进行改造。
3.7.1 步骤一:配置事务管理器(不变)
3.7.2 步骤二:配置事务增强

这里写图片描述

3.7.3 步骤三:配置AOP的切面

这里写图片描述

3.7.4 步骤四:编写测试程序

3.8 事务管理之基于AspectJ的注解方式(最简单)

3.8.1 步骤一:配置事务管理器(同上)
3.8.2 步骤二:开启注解事务
    <tx:annotation-driven transaction-manager="transactionManager"/>
3.8.3 步骤三:在需要事务管理的类上添加注解:@Transactional
3.8.4 步骤四:编写测试程序

猜你喜欢

转载自blog.csdn.net/honhong1024/article/details/78539771