基于XML配置:
1.准备数据库表
account表:username(用户名),balance(账户余额)
book表:isbn(书号),price(价格)
book_stock表:isbn(书号),stock(库存)
2.创建接口BookShopDao.java
public interface BookShopDao {
public int findBookPriceByIsBn(String isbn);
public void updateBookStock(String isbn);
public void updateUserAccount(String username,int price);
}
3.实现类BookShopDaoImpl Dao层方法
public class BookShopDaoImpl implements BookShopDao {
private JdbcTemplate jbdcTemplate;
public void setJbdcTemplate(JdbcTemplate jbdcTemplate) {
this.jbdcTemplate = jbdcTemplate;
}
@Override
public int findBookPriceByIsBn(String isbn) {
// TODO Auto-generated method stub
String sql = "SELECT price from book WHERE isbn = ?";
return jbdcTemplate.queryForObject(sql, Integer.class,isbn);
}
@Override
public void updateBookStock(String isbn) {
// TODO Auto-generated method stub
String sql2 = "SELECT stock from book_stock WHERE isbn = ?";
int stock = jbdcTemplate.queryForObject(sql2, Integer.class,isbn);
if(stock == 0) {
throw new RuntimeException("库存不足!");
}
String sql = "UPDATE book_stock SET stock = stock - 1 where isbn = ?";
jbdcTemplate.update(sql,isbn);
}
@Override
public void updateUserAccount(String username, int price) {
// TODO Auto-generated method stub
String sql2 = "SELECT balance FROM account WHERE username = ?";
int balance = jbdcTemplate.queryForObject(sql2, Integer.class,username);
if(balance < price) {
throw new RuntimeException("余额不足!");
}
String sql = "UPDATE account set balance = balance - ? WHERE username = ?";
jbdcTemplate.update(sql,price,username);
}
}
4.创建Service层接口 BookShopService.java
public interface BookShopService {
//有人要买书
public void purchase(String username,String isbn);
}
5.创建BookShopServiceImpl.java实现类
public class BookShopServiceImpl implements BookShopService {
private BookShopDao bookShopDao;
public void setBookShopDao(BookShopDao bookShopDao) {
this.bookShopDao = bookShopDao;
}
@Override
public void purchase(String username, String isbn) {
// TODO Auto-generated method stub
//获取单价
int price = bookShopDao.findBookPriceByIsBn(isbn);
//更新库存
bookShopDao.updateBookStock(isbn);
//更新余额
bookShopDao.updateUserAccount(username, price);
}
}
6.创建Cashier接口
public interface Cashier {
//买多本书
public void checkout(String username,List<String> isbns);
}
7.创建CashierImpl.java实现类
public class CashierImpl implements Cashier {
private BookShopService bookShopService;
public void setBookShopService(BookShopService bookShopService) {
this.bookShopService = bookShopService;
}
@Override
public void checkout(String username, List<String> isbns) {
// TODO Auto-generated method stub
for(String isbn : isbns) {
bookShopService.purchase(username, isbn);
}
}
}
8.新建配置文件applicationCoutext-tx-xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置c3p0的数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
</bean>
<!-- 配置Bean -->
<bean id="bookShopDao" class="org.spring.tx.xml.dao.BookShopDaoImpl">
<property name="jbdcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="bookShopService" class="org.spring.tx.xml.serivce.BookShopServiceImpl">
<property name="bookShopDao" ref="bookShopDao"></property>
</bean>
<bean id="cashier" class="org.spring.tx.xml.serivce.CashierImpl">
<property name="bookShopService" ref="bookShopService"></property>
</bean>
<!-- 配置jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="purchase" propagation="REQUIRES_NEW"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务切入点和事务属性关联 -->
<aop:config>
<aop:pointcut expression="execution(* org.spring.tx.xml.service.*.*(..))" id="txPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
</beans>
9.测试类
public class Text2 {
private ApplicationContext ctx;
private BookShopDao bookShopDao;
private BookShopService bookShopService;
private Cashier cashier;
{
ctx = new ClassPathXmlApplicationContext("applicationCoutext-tx-xml.xml");
bookShopDao = (BookShopDao) ctx.getBean("bookShopDao");
bookShopService = (BookShopService) ctx.getBean("bookShopService");
cashier = (Cashier) ctx.getBean("cashier");
}
@Test
public void testCheckout() {
cashier.checkout("lisi", Arrays.asList("1001","1002"));
}
@Test
public void testPurchase() {
bookShopService.purchase("lisi", "1001");
}
@Test
public void testUpdateUserAccount() {
bookShopDao.updateUserAccount("lisi", 10);
}
@Test
public void testUpdateBookStock() {
bookShopDao.updateBookStock("1001");
}
@Test
public void testFindBookPriceByIsbn() {
System.out.println(bookShopDao.findBookPriceByIsBn("1001"));
}
}