天天看点

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

今天是刘小爱自学Java的第125天。

感谢你的观看,谢谢你。

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

今天学习内容安排如下:

  • JdbcTemplate在spring中的配置和使用。
  • Spring的事务管理机制。
  • 写了一个转账案例,并用xml配置事务。

一、Spring的JdbcTemplate配置

1最原始的测试

即不使用spring框架时代码编写:

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

①配置数据源

无外乎就是数据库四大参数的设置。

我们以前都是使用C3p0或者德鲁伊,这里使用的是内置的数据源。

②创建jdbcTemplate对象

使用数据库初始化jdbcTemplate对象,再通过它实现对数据库的增删改查。

当然上述都是最原始的测试方法,我们现在学了spring框架,看到new这个关键字,就要想到spring的使用。

2spring配置信息

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

①数据源的配置

也就是将DriverManagerDataSource交由spring容器管理,同时设置四大参数属性。

②jdbcTemplate的配置

一样的道理,以前需要new一个对象,现在都可以在spring中配置成一个bean。

其中该对象需要一个数据源作为参数,所以需要使用到DI依赖注入。

3spring的Junit测试

测试代码会自动开启注解扫描,所以就算我们没有在spring配置文件中配置也可以使用注解,这个我们昨天就说明过。

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

其测试代码注解都是固定的格式。

  • @RunWith:使用junit整合spring。
  • @ContextConfiguration:指定spring的位置。
  • @Autowired注解:注入需要测试的对象。

运行代码也能查询到数据库中的数据。

3使用德鲁伊数据源

我们可以将数据库四大参数设置到properties配置文件中,再引入外部文件即可。

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

①引入外部文件

  • property-placeholder:翻译就是属性占位符的意思,通过其引入外部文件。
  • location:说明外部文件路径。

②配置德鲁伊连接池

以${}的格式引入配置文件中的属性。

③配置jdbcTemplate对象

将德鲁伊连接池注入jdbcTemplate对象。

二、Spring的JdbcTemplate使用

使用spring配置后,在dao层中测试使用。

1dao层代码编写及配置

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

①xml配置

将jdbcTemplate对象注入userDao,如果用注解的话这里用@Autowired也是可以的。

xml和注解都使用下,加深对它们的理解。

②根据id查询用户

无外乎就是增删改查,这里使用根据id查询作为例子说明,查询结果是一个user对象。

2测试方法

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

测试方法中直接使用userDao对象调用方法即可,这里使用注解@Autowired完成注入。

运行代码能够得到对应id的user数据。

3dao层代码优化

为了方便Dao中注入JdbcTemplate,Spring为每一个持久化技术都提供了支持类。

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

①JdbcDaoSupport类

继承Spring框架封装的JdbcDaoSupport类获得jdbctemplate对象操作数据库。

通过getJdbcTemplate方法可以获取对象。

②注入数据源

在xml文件中给userDao对象注入数据源后即可获取jdbctemplate对象了。

为什么会这样呢?

我们看下JdbcDaoSupport的源码:

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

它有一个setDataSource方法,那么通过注入数据源,即可获取一个jdbcTemplate对象。

三、Spring的事务管理机制

Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:

1PlatformTransactionManager

事务管理器,主要用于平台相关事务的管理,不要看其名字很长,其实很好记:

  • Platform:平台的意思。
  • Transaction:事务的意思。
  • Manager:管理器的意思。

Spring为不同的持久化框架提供了不同的事务管理器接口实现。

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

DataSourceTransactionManager是我们使用的事务管理器,使用Connection控制 :

  • 开启事务:connection.setAutoCommit(false)
  • 提交事务:connection.commit()
  • 回滚事务:connection.rollback()

2TransactionDefinition

事务定义信息,用来定义事务相关的属性的,给事务管理器用。

该接口主要提供的方法:

  • getIsolationLevel:隔离级别获取。
  • getPropagationBehavior:传播行为获取。
  • getTimeout:获取超时时间。
  • isReadOnly:是否只读。

关于隔离级别一共有四种:读未提交、读已提交、可重复读和串行化。

在学事务时的笔记中详细说明过,不再赘述。

关于传播行为获取,主要有三大类:

  • REQUIRED:只有一个事务(默认,推荐)
  • REQUIRES_NEW:存在两个事务,如果事务存在,挂起事务,重新开启一个新事务。
  • NESTED:嵌套事务,事务可以设置保存点,回滚到保存点,选择提交或者回滚。

3TransactionStatus

事务具体运行状态,事务管理过程中,每个时间点事务的状态信息。

四、xml配置事务管理

上述都是概念性的知识点,比较难记,还是直接用一个转账案例说明:

1service层代码编写

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

既然是转账,那么要明确三个参数:出钱方是谁?收钱方是谁?钱是多少?

①先将钱转出

即从出钱方将对应的钱转出来。

②再将钱转入

即将转出的钱转入给收钱方。

2dao层代码编写

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

继承jdbcDaoSupport这个类,通过父类获取jdbcTemplat对象,这个前面刚说过

③钱转入

即将收钱人对应账户上的金钱增加,增加的钱数为转账的钱数。

④钱转出

即将收钱人对应账户上的金钱减少,减少的数量为转账的钱数。

3xml配置事务

我们将上述两层的对象交给spring容器,但是这样的代码是有问题的:转入和转出要么同时成功要么同时失败,需要使用事务管理。

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

①配置事务管理器

选择对应框架的事务管理器即可,并将其交由spring容器管理,同时注入数据源。

②配置事务管理

通过tx:advice标签配置事务通知,通过属性transaction-manager说明事务管理器。

其子标签tx:method,对应了上述TransactionDefinition接口中的四大方法:

  • read-only:对应isReadOnly()。
  • timeout:对应getTimeout()。
  • propagation:对应getPropagationBehavior()。
  • isolation:对应getIsolationLevel()。

③aop的配置

配置切入点,*Service表示以service为结尾的id或name都被拦截。

配置切面,将对应的切入点增加配置的事务通知,即给切入点增加了一个事务功能。

4测试

junit 引入spring 注解管理_spring框架最后一天,学完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事务管理机制四、xml配置事务管理最后

在转入业务中设置一个运行异常作为测试。

如果没有配置事务的话:

  • 转出业务成功,对应账户钱减少了。
  • 转入业务失败,对应账户钱并没有增加。

如果配置事务了的话,只要一方失败了,全部都算失败,数据并不发生变化。

最后

关于注解,会使用xml了注解就很简单了,以后有类似需求时使用注解说明,就不专门写一篇文章了,明天开始学springMVC框架了。

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。