博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring学习-day13
阅读量:7066 次
发布时间:2019-06-28

本文共 5735 字,大约阅读时间需要 19 分钟。

需求:

用户购买图书,购买成功,库存更新,账户余额更新,若余额或者库存不够,均不能购买成功,产生异常

数据表:

account: 账户表(包括用户名和余额)

book:图书表(id, 书名, 图书价格)
book_stock:库存表(id, 图书库存)
Spring学习-day13

代码实现:

1. 图书购买时的接口

package com.atguigu.spring.tx;public interface BookShopDao {    //根据书号获取书的单价    public int findBookPriceByIsbn(String isbn);    //更新书的库存, 使书号对应的库存 - 1    public void updateBookStock(String isbn);    //更新用户的账户余额: 使 username 的 balance - price    public void updateUserAccount(String username, int price);}
package com.atguigu.spring.tx;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;@Repository("bookShopDao")public class BookShopDaoImpl 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);    }}
package com.atguigu.spring.tx;public interface BookShopService {    public void purchase(String username, String isbn);}
package com.atguigu.spring.tx;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Service("bookShopService")public class BookShopServiceImpl implements BookShopService {    @Autowired    private BookShopDao bookShopDao;    //添加事务注解    @Transactional    @Override    public void purchase(String username, String isbn) {        //1. 获取书的单价        int price = bookShopDao.findBookPriceByIsbn(isbn);        //2. 更新书的库存        bookShopDao.updateBookStock(isbn);        //3. 更新用户余额        bookShopDao.updateUserAccount(username, price);    }}

2. 测试方法

package com.atguigu.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("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"));    }}

3. 错误则抛出异常

package com.atguigu.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, 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 com.atguigu.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, 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    }}

转载于:https://blog.51cto.com/13416247/2088698

你可能感兴趣的文章
一篇很全面的IOS面试题(下)
查看>>
极简.高性能.分布式框架,可运行于多种环境(apache/php-fpm,swoole)
查看>>
DESTOON7.0农产品B2B供应求购交易平台源码
查看>>
node js 批量处理pdf,提取关键信息,并导出excel
查看>>
05 Objective C数组的四种遍历方法总结
查看>>
少侠请重新来过 - Vue学习笔记(五) - 指令
查看>>
关闭webstorm(2017.3.5)的分号检测
查看>>
设计模式(二十三)中介者模式
查看>>
重学前端(六)-JavaScript中的class
查看>>
技术并非一切,做做 Side Project 吧
查看>>
ViewPager+seekBar的联动效果
查看>>
前端面试每日3+1(周汇总2019.05.05)
查看>>
RPA:制造业的下一个改变者
查看>>
VSCode Python开发环境配置
查看>>
208道 java 高频面试题和答案
查看>>
nginx反向代理配置
查看>>
MySQL学习笔记 初学基础篇
查看>>
一步步教你用 CSS 为 SVG 添加过滤器
查看>>
TeeChart Pro VCL/FMX教程(一):入门——构建图表
查看>>
微服务架构 SpringCloud(二)Eureka(服务注册和服务发现基础篇)
查看>>