购买股票案例来
两个实体类
package Springtx.entity; public class Account { private int aid; // private String aname; // private double balance; // public int getAid(){return aid;} public void setAid(int aid){ this.aid=aid;} public String getAname(){return aname;} public void setAname(String aname){ this.aname=aname;} public double getBalance(){return balance;} public void setBalance(double balance){ this.balance=balance;} }
package Springtx.entity; public class Stock { private int sid; private String sname; private int count; public int getSid(){return sid;} public void setSid(int sid){ this.sid=sid;} public String getSname(){return sname;} public void setSname(String sname){ this.sname=sname;} public int getCount(){return count;} public void setCount(int count){ this.count=count;} }DAO 和实现
package cn.happy.spring21tx.cn.happy.dao;
import cn.happy.spring21tx.cn.happy.entity.Account;
/**
* Created by Happy on 2017-08-04.
* 账户类
*/
public interface IAccountDAO {
//开户的方法
public boolean addAccount(Account account);
//修改账户余额 金额减少true
public boolean updateAccount(int aid,double money,boolean isBuy);
}
实现
package cn.happy.spring21tx.cn.happy.dao;
import cn.happy.spring21tx.cn.happy.entity.Account;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/**
* Created by Happy on 2017-08-04.
*/
public class AccountDAOImpl extends JdbcDaoSupport implements IAccountDAO {
public boolean addAccount(Account account) {
return false;
}
public boolean updateAccount(int aid, double money, boolean isBuy) {
boolean flag=false;
String sql=null;
if (isBuy){ //购买股票
sql="update account set balance=balance-? where aid=?";
}else{
sql="update account set balance=balance+? where aid=?";
}
int count = this.getJdbcTemplate().update(sql, money, aid);
if (count>0){
flag=true;
}
return flag;
}
}
DAO 实现
package cn.happy.spring21tx.cn.happy.dao;
import cn.happy.spring21tx.cn.happy.entity.Stock;
/**
* Created by Happy on 2017-08-04.
*/
public interface IStockDAO {
public boolean addStock(Stock stock);
public boolean updateStock(int sid,int count,boolean isBuy);
}
实现
package cn.happy.spring21tx.cn.happy.dao;
import cn.happy.spring21tx.cn.happy.entity.Stock;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/**
* Created by Happy on 2017-08-04.
*/
public class StockDAOImpl extends JdbcDaoSupport implements IStockDAO {
public boolean addStock(Stock stock) {
return false;
}
public boolean updateStock(int sid, int count, boolean isBuy) {
boolean flag=false;
String sql=null;
if (isBuy){ //购买股票
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;
}
}
写一个类 来模拟错误
package cn.happy.spring21tx.cn.happy.entity;
/**
* Created by Happy on 2017-08-04.
* StockException 异常
* 编译时 编译时
*
* 依据:
*/
public class StockException extends Exception {
public StockException() {
super();
}
public StockException(String message) {
super(message);
}
}
service层
package cn.happy.spring21tx.cn.happy.service;
import cn.happy.spring21tx.cn.happy.entity.Account;
import cn.happy.spring21tx.cn.happy.entity.Stock;
import cn.happy.spring21tx.cn.happy.entity.StockException;
/**
* Created by Happy on 2017-08-04.
*/
public interface IAccountService {
//开户的方法
public boolean addAccount(Account account);
//股票初始化的方法
public boolean addStock(Stock account);
//購買股票的方法
/**
* @param sid 股票代號
* @param count 購買股數
* @param aid 賬戶代號
* @param money 賬戶支出金額
*/
public void buyStock(int sid,int count,int aid,double money) throws StockException;
}
service实现
package cn.happy.spring21tx.cn.happy.service;
import cn.happy.spring21tx.cn.happy.dao.IAccountDAO;
import cn.happy.spring21tx.cn.happy.dao.IStockDAO;
import cn.happy.spring21tx.cn.happy.entity.Account;
import cn.happy.spring21tx.cn.happy.entity.Stock;
import cn.happy.spring21tx.cn.happy.entity.StockException;
/**
* Created by Happy on 2017-08-04.
*/
public class AccountServiceImpl implements IAccountService {
//植入AccountDao對象
private IAccountDAO accountDAO;
//植入StockDAO對象
private IStockDAO stockDAO;
public boolean addAccount(Account account) {
return false;
}
public boolean addStock(Stock account) {
return false;
}
//
public void buyStock(int sid, int count, int aid, double money) throws StockException {
//默认是购买股票
boolean isBuy=true;
//01.賬戶
accountDAO.updateAccount(aid,money,isBuy);
//编译时异常 SPring处理 方式
//编译时 SPring事务自动提交
//运行时 SPring 自动回滚
if(1==1) {
throw new StockException();
}
//02.股票表
stockDAO.updateStock(sid,count,isBuy);
}
public IAccountDAO getAccountDAO() {
return accountDAO;
}
public void setAccountDAO(IAccountDAO accountDAO) {
this.accountDAO = accountDAO;
}
public IStockDAO getStockDAO() {
return stockDAO;
}
public void setStockDAO(IStockDAO stockDAO) {
this.stockDAO = stockDAO;
}
}
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///test jdbc.user=root jdbc.password=root Springtx.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:p="http://www.springframework.org/schema/p" 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 "> <context:property-placeholder location="jdbc.properties"></context:property-placeholder> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="accountDao" class="Springtx.dao.AccountDAOImpl"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="stockDao" class="Springtx.dao.StockDAOImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="accountService" class="Springtx.service.AccountServiceImpl"> <property name="accountDAO" ref="accountDao"></property> <property name="stockDAO" ref="stockDao"/> </bean> <!--事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务 拦截 业务方法 <bean id="accountSerciceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> -目标 类型 <property name="target" ref="accountService"></property> <property name="transactionManager" ref="transactionManager"></property> 增强 <property name="transactionAttributes"> <props> <prop key="buy*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop> </props> </property> </bean> 增强 --> </beans>单侧
@Test // 01.jdbctemplate public void test02() { ApplicationContext ctx = new ClassPathXmlApplicationContext("Springtx.xml"); IAccountService service = (IAccountService) ctx.getBean("accountService"); try { service.buyStock(1,2,1,1000); } catch (Exception e) { e.printStackTrace(); } }
POM层
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.2.RELEASE</version> </dependency> <!--Spring-Context架包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.2.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId> org.aspectj</groupId > <artifactId> aspectjweaver</artifactId > <version> 1.8.7</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.9.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
编译时异常
:exceptio Spring 的处理方式:自动提交
运行时异常:
Runtime Spring 的处理方式:自动回滚
事务管理器就是个bean
properties 继承 Hashtable 继承 Dictionory
数据库四种隔离级别
1.读未提交 Read_Uncommitted
2.读已经提交 Read_committed
3.可重复读 Repeatable_read
4.串行化 Serializable