zoukankan      html  css  js  c++  java
  • Spring入门第三十课

    基于XML的方式配置事务

    直接看代码:

    package logan.study.spring.tx.xml;
    
    public interface BookShopDao {
        //根据书号获取书的单价
        public int findBookPriceIsbn(String isbn);
        
        //更新书的库存,使书号对应的库存-1
        public void updateBookStock(String isbn);
        
        
        public void updateUserAccount(String username,int price);
    
    }
    package logan.study.spring.tx.xml;
    
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class BookShopDaoImpl implements BookShopDao {
        
        
        private JdbcTemplate jdbcTemplate;
        
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        @Override
        public int findBookPriceIsbn(String isbn) {
            // TODO Auto-generated method stub
            String sql = "SELECT price FROM book WHERE isbn=?";
            return jdbcTemplate.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 = 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) {
            // TODO Auto-generated method stub
            //检查书的库存是否足够,若不够,则抛出异常
            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);
    
        }
    
    }
    package logan.study.spring.tx.xml;
    
    public interface BookShopService {
        
        public void purchase(String username, String isbn);
    
    }
    package logan.study.spring.tx.xml;
    
    
    
    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
            //1.获取书的单价
            int price = bookShopDao.findBookPriceIsbn(isbn);
            //2.更新书的库存
            bookShopDao.updateBookStock(isbn);
            //3.更新用户余额
            bookShopDao.updateUserAccount(username, price);
            
    
        }
    
    }
    package logan.study.spring.tx.xml;
    
    public class BookStockException extends RuntimeException{
    
        public BookStockException() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        public BookStockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
            // TODO Auto-generated constructor stub
        }
    
        public BookStockException(String message, Throwable cause) {
            super(message, cause);
            // TODO Auto-generated constructor stub
        }
    
        public BookStockException(String message) {
            super(message);
            // TODO Auto-generated constructor stub
        }
    
        public BookStockException(Throwable cause) {
            super(cause);
            // TODO Auto-generated constructor stub
        }
        
        
    
    }
    package logan.study.spring.tx.xml;
    
    import java.util.List;
    
    public interface Cashier {
        public void checkout(String username,List<String> isbns);
    
    }
    package logan.study.spring.tx.xml;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Isolation;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    
    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);
            }
            
        }
    
    }
    package logan.study.spring.tx.xml;
    
    import static org.junit.Assert.*;
    
    import java.util.Arrays;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class SpringTransactionTest {
        
        private ApplicationContext ctx = null;
        private BookShopDao bookShopDao = null;
        private BookShopService bookShopService = null;
        private Cashier cashier = null;
        {
            ctx = new ClassPathXmlApplicationContext("applicationContext-xml.xml");
            bookShopDao = ctx.getBean(BookShopDao.class);
            bookShopService = ctx.getBean(BookShopService.class);
            cashier = ctx.getBean(Cashier.class);
        }
        
        @Test
        public void testTransactionalPropagation(){
            cashier.checkout("AA", Arrays.asList("1001","1002"));
        }
        
        @Test
        public void testBookShopService(){
            bookShopService.purchase("AA", "1001");
        }
    
    }
    package logan.study.spring.tx.xml;
    
    public class UserAccountException extends RuntimeException{
    
        public UserAccountException() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        public UserAccountException(String message, Throwable cause, boolean enableSuppression,
                boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
            // TODO Auto-generated constructor stub
        }
    
        public UserAccountException(String message, Throwable cause) {
            super(message, cause);
            // TODO Auto-generated constructor stub
        }
    
        public UserAccountException(String message) {
            super(message);
            // TODO Auto-generated constructor stub
        }
    
        public UserAccountException(Throwable cause) {
            super(cause);
            // TODO Auto-generated constructor stub
        }
        
        
    
    }
    <?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:component-scan base-package="logan.study.spring.tx"></context:component-scan>
    
        <!-- 导入资源文件 -->
        <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="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
            <property name="driverClass" value="${jdbc.driverClass}"></property>
            
            <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
            <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
        </bean>
        
        <!-- 配置Spring的JDBCTemplate -->
        <bean id="jdbcTemplate"
        class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 配置bean -->
        <bean id="bookShopDao" class="logan.study.spring.tx.xml.BookShopDaoImpl">
            <property name="jdbcTemplate" ref="jdbcTemplate"></property>
        </bean>
        
        <bean id="bookShopService" class="logan.study.spring.tx.xml.BookShopServiceImpl">
            <property name="bookShopDao" ref="bookShopDao"></property>
        </bean>
        
        <bean id="cashier" class="logan.study.spring.tx.xml.CashierImpl">
            <property name="bookShopService" ref="bookShopService"></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(* logan.study.spring.tx.xml.BookShopService.*(..) )" 
            id="txPointCut"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
        </aop:config>
    </beans>

    db.properties

    jdbc.user=root
    jdbc.password=logan123
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.jdbcUrl=jdbc:mysql://localhost:3306/spring
    
    jdbc.initPoolSize=5
    jdbc.maxPoolSize=10
  • 相关阅读:
    ubuntu 安装 redis desktop manager
    ubuntu 升级内核
    Ubuntu 内核升级,导致无法正常启动
    spring mvc 上传文件,但是接收到文件后发现文件变大,且文件打不开(multipartfile)
    angular5 open modal
    POJ 1426 Find the Multiple(二维DP)
    POJ 3093 Margritas
    POJ 3260 The Fewest Coins
    POJ 1837 Balance(二维DP)
    POJ 1337 A Lazy Worker
  • 原文地址:https://www.cnblogs.com/LoganChen/p/6918963.html
Copyright © 2011-2022 走看看