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

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值