今天是刘小爱自学Java的第125天。
感谢你的观看,谢谢你。
今天学习内容安排如下:
- JdbcTemplate在spring中的配置和使用。
- Spring的事务管理机制。
- 写了一个转账案例,并用xml配置事务。
一、Spring的JdbcTemplate配置
1最原始的测试
即不使用spring框架时代码编写:
①配置数据源
无外乎就是数据库四大参数的设置。
我们以前都是使用C3p0或者德鲁伊,这里使用的是内置的数据源。
②创建jdbcTemplate对象
使用数据库初始化jdbcTemplate对象,再通过它实现对数据库的增删改查。
当然上述都是最原始的测试方法,我们现在学了spring框架,看到new这个关键字,就要想到spring的使用。
2spring配置信息
①数据源的配置
也就是将DriverManagerDataSource交由spring容器管理,同时设置四大参数属性。
②jdbcTemplate的配置
一样的道理,以前需要new一个对象,现在都可以在spring中配置成一个bean。
其中该对象需要一个数据源作为参数,所以需要使用到DI依赖注入。
3spring的Junit测试
测试代码会自动开启注解扫描,所以就算我们没有在spring配置文件中配置也可以使用注解,这个我们昨天就说明过。
其测试代码注解都是固定的格式。
- @RunWith:使用junit整合spring。
- @ContextConfiguration:指定spring的位置。
- @Autowired注解:注入需要测试的对象。
运行代码也能查询到数据库中的数据。
3使用德鲁伊数据源
我们可以将数据库四大参数设置到properties配置文件中,再引入外部文件即可。
①引入外部文件
- property-placeholder:翻译就是属性占位符的意思,通过其引入外部文件。
- location:说明外部文件路径。
②配置德鲁伊连接池
以${}的格式引入配置文件中的属性。
③配置jdbcTemplate对象
将德鲁伊连接池注入jdbcTemplate对象。
二、Spring的JdbcTemplate使用
使用spring配置后,在dao层中测试使用。
1dao层代码编写及配置
①xml配置
将jdbcTemplate对象注入userDao,如果用注解的话这里用@Autowired也是可以的。
xml和注解都使用下,加深对它们的理解。
②根据id查询用户
无外乎就是增删改查,这里使用根据id查询作为例子说明,查询结果是一个user对象。
2测试方法
测试方法中直接使用userDao对象调用方法即可,这里使用注解@Autowired完成注入。
运行代码能够得到对应id的user数据。
3dao层代码优化
为了方便Dao中注入JdbcTemplate,Spring为每一个持久化技术都提供了支持类。
①JdbcDaoSupport类
继承Spring框架封装的JdbcDaoSupport类获得jdbctemplate对象操作数据库。
通过getJdbcTemplate方法可以获取对象。
②注入数据源
在xml文件中给userDao对象注入数据源后即可获取jdbctemplate对象了。
为什么会这样呢?
我们看下JdbcDaoSupport的源码:
它有一个setDataSource方法,那么通过注入数据源,即可获取一个jdbcTemplate对象。
三、Spring的事务管理机制
Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:
1PlatformTransactionManager
事务管理器,主要用于平台相关事务的管理,不要看其名字很长,其实很好记:
- Platform:平台的意思。
- Transaction:事务的意思。
- Manager:管理器的意思。
Spring为不同的持久化框架提供了不同的事务管理器接口实现。
DataSourceTransactionManager是我们使用的事务管理器,使用Connection控制 :
- 开启事务:connection.setAutoCommit(false)
- 提交事务:connection.commit()
- 回滚事务:connection.rollback()
2TransactionDefinition
事务定义信息,用来定义事务相关的属性的,给事务管理器用。
该接口主要提供的方法:
- getIsolationLevel:隔离级别获取。
- getPropagationBehavior:传播行为获取。
- getTimeout:获取超时时间。
- isReadOnly:是否只读。
关于隔离级别一共有四种:读未提交、读已提交、可重复读和串行化。
在学事务时的笔记中详细说明过,不再赘述。
关于传播行为获取,主要有三大类:
- REQUIRED:只有一个事务(默认,推荐)
- REQUIRES_NEW:存在两个事务,如果事务存在,挂起事务,重新开启一个新事务。
- NESTED:嵌套事务,事务可以设置保存点,回滚到保存点,选择提交或者回滚。
3TransactionStatus
事务具体运行状态,事务管理过程中,每个时间点事务的状态信息。
四、xml配置事务管理
上述都是概念性的知识点,比较难记,还是直接用一个转账案例说明:
1service层代码编写
既然是转账,那么要明确三个参数:出钱方是谁?收钱方是谁?钱是多少?
①先将钱转出
即从出钱方将对应的钱转出来。
②再将钱转入
即将转出的钱转入给收钱方。
2dao层代码编写
继承jdbcDaoSupport这个类,通过父类获取jdbcTemplat对象,这个前面刚说过
③钱转入
即将收钱人对应账户上的金钱增加,增加的钱数为转账的钱数。
④钱转出
即将收钱人对应账户上的金钱减少,减少的数量为转账的钱数。
3xml配置事务
我们将上述两层的对象交给spring容器,但是这样的代码是有问题的:转入和转出要么同时成功要么同时失败,需要使用事务管理。
①配置事务管理器
选择对应框架的事务管理器即可,并将其交由spring容器管理,同时注入数据源。
②配置事务管理
通过tx:advice标签配置事务通知,通过属性transaction-manager说明事务管理器。
其子标签tx:method,对应了上述TransactionDefinition接口中的四大方法:
- read-only:对应isReadOnly()。
- timeout:对应getTimeout()。
- propagation:对应getPropagationBehavior()。
- isolation:对应getIsolationLevel()。
③aop的配置
配置切入点,*Service表示以service为结尾的id或name都被拦截。
配置切面,将对应的切入点增加配置的事务通知,即给切入点增加了一个事务功能。
4测试
在转入业务中设置一个运行异常作为测试。
如果没有配置事务的话:
- 转出业务成功,对应账户钱减少了。
- 转入业务失败,对应账户钱并没有增加。
如果配置事务了的话,只要一方失败了,全部都算失败,数据并不发生变化。
最后
关于注解,会使用xml了注解就很简单了,以后有类似需求时使用注解说明,就不专门写一篇文章了,明天开始学springMVC框架了。
谢谢你的观看。
如果可以的话,麻烦帮忙点个赞,谢谢你。