Spring数据访问

Spring数据访问篇

流行词:顶层设计 事务 

参考代码:https://gitee.com/li-lixiang/lean-spring-2.0.git

在前面的blog中,已经实现Spring IOC、DI、MVC和AOP,并调试代码展示前后交互结果。接下来学习数据访问。

顶层设计

数据访问篇主要从以下几个方面学习:

1、Spring数据库事务

2、常用数据库访问工具简介

3、封装自己的数据库访问工具

详细说明

1、Spring数据库事务

 1)事务的基本概念,事务具有4个属性:原子性、一致性、隔离性、持久性。

原子性(Automicity)一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做
一致性(Consistency)事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
隔离性(Isolation)一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
持久性(Durability)持久性也称永久性(Permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响

2)基本原理

Spring数据库事务是基于数据库本身的事务的支持基础上,进行事务的管理。

实现步骤:

1、获取连接Connectioncon=DriverManager.getConnection()
2、开启事务con.setAutoCommit(true/false);
3、执行CRUD
4、提交事务/回滚事务con.commit()/con.rollback();
5、关闭连接conn.close();

Spring事务管理,主要做的是2和4步骤。

3)Spring事务的传播属性

在使用Spring提供的事务管理工具时,经常会用到Spring定义的事务传播属性,常用如下表:

PROPAGATION_REQUIRED支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是Spring默认的事务的传播
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION_MANDATORY支持当前事务,如果当前没有事务,就抛出异常

 

4)数据库的隔离级别

在使用Spring提供的事务管理时,可以指定隔离级别,隔离级别介绍如下表:

ISOLATION_DEFAULT这是个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。
ISOLATION_READ_UNCOMMITTED这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读
ISOLATION_READ_COMMITTED保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
ISOLATION_REPEATABLE_READ这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
ISOLATION_SERIALIZABLE这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

 

脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。

幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。

数据库本身隔离级别:

隔离级别隔离级别的值导致的问题
Read-Uncommitted0导致脏读
Read-Committed1避免脏读,允许不可重复读和幻读
Repeatable-Read2避免脏读,不可重复读,允许幻读
Serializable3串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重

2、常用数据库访问工具

Hibernate全自动
不需要写一句SQL语句
Spring JDBC
全手动
所有的SQL都要自己写,它帮我们设计了一套标准  模板模式
MyBatis半自动
支持简单的映射,复杂关系,需要自己写SQL
JPA全手动Java Persistence API 是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
3、封装自己的数据库访问工具

详细见代码:gupaoedu-vip-spring-orm · 李利祥/lean-spring-2.0 - 码云 - 开源中国 (gitee.com)

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值