Dbutils | JdbcTemplate |
操作的是核心对象QueryRunner | 操作的是核心对象JdbcTemplate |
调用update接口(增、删、改) | 调用update接口(增、删、改) |
调用query接口(查询) | 调用queryForObject(查询单个值/单个对象) |
调用query接口(查询集合) |
<dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-jdbcartifactId> <version>5.0.2.RELEASEversion>dependency><dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-txartifactId> <version>5.0.2.RELEASEversion>dependency> |
<?xml version="1.0" encoding="UTF-8"?>
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
AccountDaoImpl.java 方式二:继承JdbcDaoSupport类 注意:相比于方式一,不需要引入额外的jar 玩法二和玩法一的区别在于:dao层实现类中jdbcTemplate对象的获取方式 玩法二中 Dao 层实现类直接继承 JdbcDaoSupport 父类,从父类中获取 JdbcTemplate 对象 注意: 推荐使用方式一 ,继承JdbcDaoSupport类的方式只支持Dao层实现类使用xml配置定义为对象,不支持使用注解的方式将Dao层实现类定义为对象 如下:必须在xml中定义dao实现类对象 dao实现类中继承JdbcDaoSupport父类 Spring内置数据源 Spring的声明式事务控制 编程式事务:事务控制代码添加在业务逻辑代码中,这种方式叫做编程式事务 声明式事务:就是通过xml配置或者注解即可完成事务控制的方式/机制,叫做声明式事务
关于事务
l 事务基本特性(ACID,是针对单个事务的一个完美状态)
n 原子性:指的是在一个事务内的操作,要么都成功,要么都失败,案例比如转账,要么汇款和收款都成功,要么都失败。
n 一致性:一致性和原子性描述的是同一件事情,只是角度不一样。原子性从一个事务内的操作角度来说的,要成功都成功要失败都失败;一致性是从数据的角度来说的,比如转账A,B账户初始状态(1000,1000),A转账B100块,那么对于事务外部来说,能够看到的数据状态要么是(1000,1000),要么是(900,1100),不能够出现(900,1000)或者(1000,1100)这种异常/中间数据状态
n 隔离性:比如给员工涨工资2000元,但是事务还有提交,员工就查询到已经涨了2000元(脏读),需要隔离性处理(后面隔离级别模块说明)
n 持久性:事务一旦提交即生效,即使数据库服务器宕机重启,重启后数据也应该是事务提交之后的状态,不应该是未提交时的状态
l 事务并发问题
n 脏读
u 场景
1、 财务人员状态不好,误发起事务1,给员工A涨了1w工资,但是尚未提交事务
2、 员工A此时发起了事务2,查询当月工资,发现涨了1w,好happy
3、 财务人员发现搞错了,赶紧撤销操作(回滚事务1)
整个过程中,员工A的事务2读取到了财务人员事务1中未提交的数据,这叫脏读
n 幻读(针对的insert和delete)
u 场景
1、 发现事务1,查询工资表中工资为1w的员工的总数,查询出来了10个人,此时事务1不关闭
2、 2名新员工入职,工资也都是1w,财务人员发起事务2向工资表中插入了两条工资为1w的记录,并且提交事务
3、事务1再次查询工资表中工资为1w的员工的总数,查询出来了12个人,不是10个人吗?见鬼了
n 不可重复读(针对的update)
u 场景
1、 员工A发起了事务1查询当月工资为1w,此时事务1也不关闭
2、 财务人员发起事务2给员工A涨了2000元工资,并且提交事务
3、事务1再次查询当月工资,发现工资为1.2w。原来的1w那条数据读不到了(不可重复读)
l 事务隔离级别(解决是事务并发问题的)
n 读未提交(极端情况):Read Uncommitted,什么问题也解决不了,效率最高,风险最大,不要使用这种隔离机制
n 读已提交:Read Committed,可以解决脏读问题,不能解决幻读和不可重复读问题(因为已经提交事务了)
n 可重复读:Read Repeatable:可以解决脏读和不可重复读问题,解决不了幻读问题
n 串行化(极端情况):Serializable,可以解决脏读、幻读和不可重复读,最安全但是效率最差
n 默认,default,数据库都有自己的默认隔离机制,mysql默认可重复读,oracle默认读已提交
l 事务传播行为
事务往往添加在service层方法上,比如service层A方法调用了service层B方法,那么A和B本身都有事务控制,那么在调用的时候需要进行一些协商(关于事务),这种事务协商机制就叫做事务的传播行为。
A调用B,在研究事务的传播行为的时候,我们要站在B的角度来认识
Spring声明式事务配置
pom.xml<dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-jdbcartifactId> <version>5.0.2.RELEASEversion>dependency><dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-txartifactId> <version>5.0.2.RELEASEversion>dependency><dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-aopartifactId> <version>5.0.2.RELEASEversion>dependency><dependency> <groupId>org.aspectjgroupId> <artifactId>aspectjweaverartifactId> <version>1.8.9version>dependency> |
基于XML
Spring包容性很强 Spring可以支持很多的dao层数据库操作技术,对于不同的技术体系,事务操作的方式不太一样 jdbc:connection.commit();connection.rollback() jdbcTempalte Mybatis:sqlSession.commit() Hibernate:session.commit(); Spring为了统一管理,定义接口(开启事务、提交事务、回滚事务等),不同的技术体系可以进行不同的实现。 当然,实现类不需要我们自己完成,Spring已经给我们提供了(代码每步加注释)整合Spring和SpringMVC
2020-11-18
Spring框架的江湖地位以及入门案列(附代码注释)
2020-11-19
SpringIOC的注解! Spring注解和XML的选择问题
2020-11-20
动态代理回顾和SpringAOP横向抽取思想
2020-11-22
END
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。
我知道你 “在看”