Spring学习(十三)-事务准备

来源:互联网 发布:铁血战士知乎 编辑:程序博客网 时间:2024/06/14 05:32

1.BookShopDao.java接口类

package com.spring.tx;public interface BookShopDao {    //根据书号获取书的单价    public int findBookPriceByIsbn(String isbn);     //更新书的库存:使对应库存-1    public void updateBookStock(String isbn);    //更新用户账户余额:使username的balance-price    public void updateUserAccount(String isbn,int price);}

2.BookShopImpl.java实现类

package com.spring.tx;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;@Repository("bookShopDao")public class BookShopImpl implements BookShopDao {    @Autowired    private JdbcTemplate jdbcTemplate;    @Override    public int findBookPriceByIsbn(String isbn) {        String sql="select price from book where isbn=?";        return jdbcTemplate.queryForObject(sql, Integer.class, isbn);    }    @Override    public void updateBookStock(String isbn) {        //检查书的库存是否足够,若不够则抛出异常        String sql2="select stock from book_stock where isbn=?";        int stock=jdbcTemplate.queryForObject(sql2, Integer.class, isbn);        if(stock==0) {            throw new BookStockException("库存不足");        }        String sql="update book_stock set stock=stock-1 where isbn=?";        jdbcTemplate.update(sql, isbn);    }    @Override    public void updateUserAccount(String username, int price) {        //验证余额是否足够  若不足抛出异常        String sql2="select balance from account where username=?";        int balance=jdbcTemplate.queryForObject(sql2, Integer.class, username);        if(balance<price) {            throw new UserAccountException("余额不足");        }        String sql="update account set balance=balance-? where username=?";        jdbcTemplate.update(sql, price,username);    }}

3.BookShopService.java用户买书的接口

package com.spring.tx;public interface BookShopService {    public void purchase(String username,String isbn);}

4.BookShopServiceImpl.java实现类

package com.spring.tx;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Service("bookShopService")public class BookShopServiceImpl implements BookShopService {    @Autowired    public BookShopDao bookShopDao;    @Override    public void purchase(String username, String isbn) {        //1.获取书的单价        int price=bookShopDao.findBookPriceByIsbn(isbn);        //2.更新书的库存        bookShopDao.updateBookStock(isbn);        //3.更新用户余额        bookShopDao.updateUserAccount(username, price);    }}

5.异常处理类包括余额不足与库存不足

package com.spring.tx;public class BookStockException extends RuntimeException {    /**     *      */    private static final long serialVersionUID = 1L;    public BookStockException() {        super();        // TODO Auto-generated constructor stub    }    public BookStockException(String message) {        super(message);        // TODO Auto-generated constructor stub    }}
package com.spring.tx;public class UserAccountException extends RuntimeException{    /**     *      */    private static final long serialVersionUID = 1L;    public UserAccountException() {        super();        // TODO Auto-generated constructor stub    }    public UserAccountException(String message) {        super(message);        // TODO Auto-generated constructor stub    }}

6.Test实现类

package com.spring.tx;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringTransactionTest {    private ApplicationContext ctx=null;    private BookShopDao bookShopDao=null;    private BookShopService bookShopService=null;    {        ctx=new ClassPathXmlApplicationContext("springXML/applicationContext.xml");        bookShopDao=ctx.getBean(BookShopDao.class);        bookShopService=ctx.getBean(BookShopService.class);    }    @Test    public void testBookShopService() {        bookShopService.purchase("AA", "1001");    }    @Test    public void testBookShopDaoUpdateUserAccount() {        bookShopDao.updateUserAccount("AA", 100);    }    @Test    public void testBookShopDaoUpdateBookStock() {        bookShopDao.updateBookStock("1001");    }    @Test    public void testBookShopDaoFindPriceByIsbn() {        System.out.println(bookShopDao.findBookPriceByIsbn("1001"));    }}

7.ApplicationContext.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"        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">  <context:component-scan base-package="com.spring"></context:component-scan>                       <!-- 导入资源文件 -->  <context:property-placeholder location="classpath:db.properties"/>  <!-- 配置C3p0数据源 -->  <bean id="dataSource"   class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">           <property name="driverClass" value="${jdbc.driverClass}"/>           <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>          <property name="user" value="${jdbc.user}"/>              <property name="password" value="${jdbc.password}"/>           <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>           <property name="minPoolSize" value="${jdbc.minPoolSize}"/>           <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>       </bean>  <!-- 配置Spring中JdbcTemplate(Jdbc模板类) --><bean id="jdbcTemplate"     class="org.springframework.jdbc.core.JdbcTemplate">    <property name="dataSource" ref="dataSource"/></bean><!-- 配置NameParameterJdbcTemplate该对象可以使用具名参数,其没有无参构造器,必须为其指定参数 --><bean id="nameParameterJdbcTemplate"    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">    <constructor-arg ref="dataSource"></constructor-arg></bean> </beans>