黑马就业班——Spring框架:part4 -- spring中的JdbcTemlate以及Spring事务控制

  • 本文参考文档:《Spring5第四天.pdf》
  • 本文代码项目:(路径:G:\idea_java_project\)
  • 本文大部分内容参考上面项目的代码!!!

今日内容

1、spring中的JdbcTemplate
	
2. 作业:spring基于AOP的事务控制

3. spring中的事务控制:基于XML的,基于注解的		

1、spring中的JdbcTemplate
  参考文档–第1章 Spring 中的 JdbcTemplate,以及视频2-6。具体解析见代码:项目 spring_day04_JdbcTemplate

Jdbc Template的作用:它就是用于和数据库交互的,实现对表的CRUD操作.
如何创建JDBCTemplate对象、对象中的常用方法:见项目 spring_day04_JdbcTemplate

  JdbcTemplate中有多个query()方法,如何选择我们需要的query?见视频4-5.30.
  根据我们要传入query的参数,比如SQL语句以及语句的参数,以及我们需要的返回结果,比如List,去选择相应的合适的query方法。
在这里插入图片描述
  JdbcTemplate使用总结:

1、如果查询结果是List<类型>,使用query方法:query(SQL语句,new BeanPropertyRowMapper<封装类型>(封装类型.class),参数)
如:
	List<Account> accounts = jt.query("select * from account where money > ?", new BeanPropertyRowMapper<Account>(Account.class) , 500f);

2、如果返回结果是某个类型的对象,使用query:query(SQL语句,new BeanPropertyRowMapper<封装类型>(封装类型.class),参数)
如返回一个Account对象,可以使用query方法返回一个List<Account>,然后list.get(0)获取这个Account。(常用)
	List<Account> accounts = jt.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), 3);
	System.out.println(accounts.isEmpty()?"没有内容":accounts.get(0));

当然,也可以直接queryForObject:queryForObject(SQL语句,new BeanPropertyRowMapper<封装类型>(封装类型.class),参数)
返回一个Account
	Account account = jt.queryForObject("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), 3);

3、如果返回结果是基本数据类型,如Integer,Long等,使用queryForObject:queryForObject(SQL语句,返回基本数据类型.class),参数)
如查询money>500f的账户个数:
	Long count = jt.queryForObject("select count(*) from account where money > ? ", Long.class, 500f);

  我们在开发过程中一般都会在DAO持久层使用JdbcTemplate。如何解决dao实现类中重复代码的问题,参考视频6.(这部分比较难),继承JdbcDaoSuppot 这个类。具体见项目spring_day04_JdbcTemplate。
  这里实际上解决的是当我妈有多个dao实现类的时候,我们需要在dao中编写多个 JdbcTemplate变量以及其setter方法,但是如果我们的 dao 实现类继承 JdbcDaoSupport,就不需要在每一个dao的实现类 编写 JdbcTemplate变量以及其setter方法。但是我们还是需要给每一个dao实现类注入 JdbcTemplate 对象或者 DataSource 对象。


2、作业:spring基于AOP的事务控制
   之前做过,我们之前项目:spring_day03_account_homework (这个项目是用XML配置的)。注意要bean.xml的配置要使用AOP的配置。
  为了区分,新建一个项目:spring_day03_AOPtx_xml,参考视频7,8的说明即可。(其实项目 spring_day03_account_homework 已经完成基于XML的AOP实现Account案例!)

  上面基于XML实现,我们下面基于注解实现,参考项目:spring_day03_AOPtx_anno 。在bean.xml 配置文件中,注意导入相应约束的名称空间,参考源码给出的约束。(有时候有的功能无法使用,注意检查是否是配置文件的约束没有正确导入)。
  注意,如果使用注解的方式配置AOP,那么配置4类通知:前置、后置、异常、最终,由于最终通知在异常/后置 通知之前执行,会导致事务无法控制。那么我们在使用注解配置 AOP的时候,应该配置环绕通知而不是其他4类通知。
  spring_day03_AOPtx_anno 项目仍然不是纯注解配置,如果想实现纯注解配置,配置一个SpringConfig.java 配置类即可!


3、spring中的事务控制:基于XML的,基于注解的
  说明:参考项目 spring_day03_AOPtx_xml 的bean.xml,以及讲义**《第2章 Spring 中的事务控制》**,为了便于区分,我们基于 spring_day03_AOPtx_xml 添加一个新的项目 spring_day03_AOPtx_xml_Test。
  我们之前是使用一个自定义的事务管理器 TransactionManager 来提供事务的提交回滚等操作,实际上spring自己也有类似于 TransactionManager 的事务管理器——DataSourceTransactionManager,我们直接拿来用就可以,这种叫做 声明式事务配置

  需要明确的

第一: JavaEE 体系进行分层开发,事务处理位于业务层service, Spring 提供了分层设计业务层的事务处理解决方案。
第二: spring 框架为我们提供了一组事务控制的接口。这组接口是在spring-tx-5.0.2.RELEASE.jar 中。因此我们可以不用写之前的事务管理器 TransactionManager ,而直接使用java提供的事务管理器。
第三: spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。 我
们学习的重点是使用配置的方式实现。

  Spring 中事务控制的 API 介绍,参考文档。

1、TransactionDefinition的 int getlsolationLevel() 用于获取事务隔离级,spring默认使用的是数据库的默认隔离级别。
2、TransactionDefinition的 int getPropagationBehavior() 获取事务传播行为,指的是什么时候必须有事务,什么时候事务可有可无。——增删改必须有事务(要提交事务),查询可以没有事务。
3、TransactionDefinition的 int getTimeout() 获取事务超时时间,指的是事务提交或者回滚后多长时间后过期。可以通过配置指定永远不过期。
4、TransactionDefinition的 boolean isReadOnly() 获取事务是否只读。查询只读,增删改读写。

声明式事务控制

  Spring的事务控制范围声明式事务以及编程式事务。不管是编程式事务还是声明式事务,都需要 配置事务管理器DataSourceTransactionManager,因为这个事务管理器提供提交和回滚的方法。

  spring基于XML的事务控制——项目:spring_day04_tx(工程模板,后面2个工程基于此模板)、spring_day04_tx_xml。
  spring基于注解的事务控制——项目:spring_day04_tx_anno。(注意,bean.xml的约束必须加入注解的约束,参考视频加入),这种注解还需要bean.xml文件。

  • 注解的名称空间就是 context,事务的名称空间是 tx,而aop的名称空间是 a op。

  spring基于纯注解的事务控制:spring_day04_tx_anno_withoutxml,参考原来的项目:spring day02_account_annoioc_withoutxml。

编程式事务控制(实际开发很少用)

  参考项目:spring_day04_tx_code

  声明式事务与编程式事务的区别:

1、不管是编程式事务还是声明式事务,都需要 配置事务管理器DataSourceTransactionManager,因为这个事务管理器提供提交和回滚的方法。

2、声明式事务还要配置事务的通知 </tx:advice>,在通知内配置各个方法的事务属性,随后通过AOP配置,将事务的通知与切入点表达式结合起来。这样就实现了事务的控制,这种方法的好处是我们不需要编写代码,完全可以通过配置就完成所有业务层方法的事务控制(也可以通过注解实现)

3、变成式事务还需要配置 事务模板对象 transactionTemplate,然后在业务层通过事务模板对象控制事务。且每一个业务层的方法,都需要通过业务模板对象来控制,很麻烦!

4、spring5的新特性
  参考视频15 以及文档——第3章 Spring5 的新特性。参考项目:spring_day04_jdk。
  关于响应式编程,参考——响应式编程资料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值