springJDBC 事物隔离
五.Spring-jdbc的实现
第一步:导jar包 pom.xml
<!--引入spring-beans节点-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<!--引入Spring-context节点-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<!--引入Spring-JDBC节点-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.wisdom-framework</groupId>
<artifactId>MySQL-connector-Java</artifactId>
<version>5.1.34_1</version>
</dependency>
第二步:实体层
public class User {
private Integer bookid;
private String bookname;
private Integer bookprice;
public Integer getBookid() {
return bookid;
}
public void setBookid(Integer bookid) {
this.bookid= bookid;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname= bookname;
}
public Integer getBookprice() {
return bookprice;
}
public void setBookprice(Integer bookprice) {
this.bookprice= bookprice;
}
}
第三步:搭建分层
A:dao层
接口:
//01.查询素有图书
public List<User> findAll();
接口实现:需要实现接口,继承JdbcDaoSupport 植入jdbcTemplate:简化jdbc操作
public class userdaoimpextends JdbcDaoSupport implements userdao {
// 需要植入 jdbcTemplate
publicList<User> findAll() {
String sql="select * from book";
//接口的一个实现类 匿名内部类
List<User> list=this.getJdbcTemplate().query(sql,new RowMapper<User>() {
public User mapRow(ResultSet rs,int i) throwsSQLException {
User book=new User();
book.setBookid(rs.getInt("bookid"));
book.setBookname(rs.getString("bookname"));
book.setBookprice(rs.getInt("bookprice"));
return book;
}
});
return list;
}
}
第四步:applicationContext.xml
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--00.识别jdbc.properties文件-->
<context:property-placeholderlocation="jdbc.properties"></context:property-placeholder>
<!--01.建立数据源 Spring 内置的一个数据源 DriverManager-->
<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<propertyname="driverClassName"value="${jdbc.driverClassName}"></property>
<propertyname="url"value="${jdbc.url}"></property>
<propertyname="username"value="${jdbc.user}"></property>
<propertyname="password"value="${jdbc.password}"></property>
</bean>
<!--02.jdbcTemplate 配置-->
<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
<propertyname="dataSource"ref="dataSource"></property>
</bean>
<!--03.dao配置-->
<beanid="bookDao"class="cn.dao.imp.userdaoimp">
<propertyname="jdbcTemplate"ref="jdbcTemplate"></property>
</bean>
<!--04.service bookService-->
<beanid="bookService"class="cn.service.impl.BookDAOImpl">
<propertyname="dao"ref="bookDao"></property>
</bean>
</beans>
第五步:service层
实现层:
public class BookDAOImplimplements IBookService {
//植入dao
privateuserdao dao;
public List<User> findAll() {
return dao.findAll();
}
public userdao getDao() {
return dao;
}
public void setDao(userdao dao) {
this.dao= dao;
}
}
接口层:
//01.查询素有图书
public List<User> findAll();
第六步:单测类
@Test
// 01.jdbctemplate
public void test02(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
IBookService service = (IBookService) ctx.getBean("bookService");
List<User> list = service.findAll();
for (User item:list) {
System.out.println(item.getBookname());
}
}
事务
七:事务实现(买股票案例)
A:dao层
a:接口层
Account类:
public interface Accountdao {
//开户方法
public boolean add(Account account);
//修改账户金额 为true
public boolean update(int aid,double blance,boolean isbuy);
}
股票接口:
Account接口实现类:
public interface Stockdao {
public boolean addstock(stock st);
public boolean update(int sid,int count,boolean isUser);
}
b:接口实现层:
public class Accountimp extends JdbcDaoSupport implements Accountdao
{
public boolean add(Account account) {
return false;
}
public boolean update(int aid, double blance, boolean isbuy) {
boolean flag=false;
String sql=null;
if (isbuy){ //购买股票
sql="update acount set blance=blance-? where aid=?";
}else{
sql="update account set blance=blance+? where aid=?";
}
int count = this.getJdbcTemplate().update(sql, blance, aid);
if (count>0){
flag=true;
}
return flag;
}
}
股票接口实现类 stock:
public class Stockdaoimp extends JdbcDaoSupport implements Stockdao{
public boolean addstock(stock st) {
return false;
}
public boolean update(int sid, int count, boolean isUser) {
boolean flag=false;
String sql=null;
if (isUser){
sql="update stock set count=count+? where sid=?";
}else{
sql="update stock set count=count-? where sid=?";
}
int str = this.getJdbcTemplate().update(sql, count, sid);
if (str>0){
flag=true;
}
return flag;
}
Service层:
接口:
public interface Accountdaoservicedao {
//开户方法
public boolean add(Account account);
public boolean addstock(stock st);
public void stock(int aid,double blance,int sid,int count) throws Exception;
}
接口实现:
public class Accountserviceimp implements Accountdaoservicedao {
private Accountdao accountDAO;
private Stockdao stockDAO;
public void stock(int aid, double blance, int sid, int count) throws Exception {
//默认是购买股票
boolean isBuy=true;
accountDAO.update(aid,blance,isBuy);
//编译时异常 SPring处理 方式
//编译时 SPring事务自动提交
//运行时 SPring 自动回滚
if(1==1) {
throw new StockException();
}
//02.股票表
stockDAO.update(sid,count,isBuy);
}
public Accountdao getAccountDAO() {
return accountDAO;
}
public void setAccountDAO(Accountdao accountDAO) {
this.accountDAO = accountDAO;
}
public Stockdao getStockDAO() {
return stockDAO;
}
public void setStockDAO(Stockdao stockDAO) {
this.stockDAO = stockDAO;
}
public boolean add(Account account) {
return false;
}
public boolean addstock(stock st) {
return false;
}
异常类:
public class StockException extends Exception {
public StockException() {
}
public StockException(String message) {
super(message);
}
}
实体类:
Xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--00.识别jdbc.properties文件-->
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--03.dao配置-->
<bean id="Accountdao" class="Spring01tx.cn.dao.imp.Accountimp">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="Stockdao" class="Spring01tx.cn.dao.imp.Stockdaoimp">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--04.service bookService-->
<bean id="bookService" class="Spring01tx.cn.service.imp.Accountserviceimp">
<property name="accountDAO" ref="Accountdao"></property>
<property name="stockDAO" ref="Stockdao"/>
</bean>
<!--事务管理器-->
<bean id="transcationManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务 拦截器业务方法-->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="bookService"></property>
<property name="transactionManager" ref="transcationManger"></property>
<!--增强-->
<property name="transactionAttributes">
<props>
<prop key="buy*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop>
</props>
</property>
</bean>
</beans>
单测:
public class test {
@Test
// 01.jdbctemplate
public void test02() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext01.xml");
Accountserviceimp service = (Accountserviceimp) ctx.getBean("accountServiceProxy");
try {
//数据不匹配时的情况 一个变,一个不变
service.stock(1,1000,1,8);
} catch (Exception e){
e.printStackTrace();
}
}
springJDBC 事物隔离的更多相关文章
- SQL事物隔离级别
标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...
- spring事物传播机制 事物隔离级别
Spring事务类型详解: PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PROPAGATION_SUPPORTS--支持当前事务,如 ...
- 07: mysql锁和事物隔离
MySQL其他篇 目录: 1.1 MySQL中的事物 1.2 mysql中锁 1.1 MySQL中的事物返回顶部 1.InnoDB事务原理 1. 事务(Transaction)是数据库区别于文件系统的 ...
- Spring事物隔离级别及事物传播行为@Transactional实现
阅读本篇文章前,请先阅读如下文章: 四种事物隔离级别详解 先看下@Transactional可以配制那些参数及以其所代表的意义. isolation 枚举org.springframework.tra ...
- MySQL数据库的事物隔离级别
一. 查看数据库的事物隔离级别 mysql> show variables like '%isolation'; +-----------------------+--------------- ...
- MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的
MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...
- Oracle中事物处理--事物隔离级别
n 事物隔离级别 概念:隔离级别定义了事物与事物之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同) ...
- MySQL是如何实现事物隔离?
前言 众所周知,MySQL的在RR隔离级别下查询数据,是可以保证数据不受其它事物影响,而在RC隔离级别下只要其它事物commit后,数据都会读到commit之后的数据,那么事物隔离的原理是什么?是通过 ...
- Hibernate 事物隔离级别 深入探究
目录 一.数据库事务的定义 二.数据库事务并发可能带来的问题 三.数据库事务隔离级别 四.使用Hibernate设置数据库隔离级别 五.使用悲观锁解决事务并发问题 六.使用乐观锁解决事务并发问题 Hi ...
随机推荐
- observer远程监控服务器
因为需要监控服务器的状况,所以要使用工具observer.但是observer是采用wxWidget开发的,远程机器没有此环境.于是在windows机器上装了虚拟机ubuntu,又折腾erlang和w ...
- 记录用到的一些linux命令和疑难解决
1. 用gedit打开.bashrc larry@larry-Rev:~$ sudo gedit ~/.bashrc 2. ubuntu里安装软件有点像iOS里的Cydia,要添加软件源来在Ubunt ...
- [ZJOI 2012] 网络
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2816 [算法] 对每种颜色的边建一棵LCT , 维护联通性即可 时间复杂度 : O( ...
- SP8093 JZPGYZ - Sevenk Love Oimaster
传送门 广义后缀自动机-- 其实也不是很难理解,就是每次SAM插入一个串之后,插入新的串的时候,要把last重新调到1的位置,共用一些节点. 这个题我们首先要预处理出来每个状态被多少个串共用.挺暴力的 ...
- 单次目标检测器-SSD简介
SSD 是使用 VGG19 网络作为特征提取器(和 Faster R-CNN 中使用的 CNN 一样)的单次检测器.我们在该网络之后添加自定义卷积层(蓝色),并使用卷积核(绿色)执行预测. 同时对类别 ...
- MTK touchscreen 流程
1. kernel-3.18/drivers/input/touchscreen/mediatek/tpd_common_probe.c static int __init tpd_probe_ini ...
- eclispe的使用
1.eclipse 有的时候,子类包都已经写了,这时候要添加一个父类包,如果在包结构下是添加不了的,这时候需要切换格式:
- 20个Flutter实例视频教程-第04节: 不规则底部工具栏制作-2
视频地址: https://www.bilibili.com/video/av39709290/?p=4 博客地址: https://jspang.com/post/flutterDemo.html# ...
- JAVA实现DIJKSTRA算法
import java.util.Queue; import java.util.LinkedList; public class dijkstra{ public static void main( ...
- jquery文档内容的获取和设置