博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring 事务管理的简单配置
阅读量:5288 次
发布时间:2019-06-14

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

1:事务的优点

  事务管理对平时的业务逻辑的健壮性帮助很大,它保证了一个动作的原子性

  本例中主要体现在,购票或者购书中,业务逻辑如下:

    1:根据商品的ID查询该商品的价格,

    2:根据商品的价格去扣除用户的余额,但余额不足时,主动抛出异常

    3:当用户付款成功后,扣除商品库存,单库存不足时,主动抛出异常

   当3个步骤都操作成功后,数据库才会真正的持久化,即数据发生改变

  项目路径保存在     D:\海同\spring\9.14\9.14   中

  额外jar包:

    aopalliance.jar 和 aspectjweaver.jar  和 spring-aspects-4.2.0.RELEASE.jar 切面必须包

    c3p0-0.9.2.1.jar 和 commons-logging-1.1.1.jar  和  mysql-connector-java-5.1.7-bin.jar    数据库必须包

2:注解配置事务流程

    比较方便

  Repository层接口:

public interface GoodDao {    //查找商品价格    public int findPriceById(String id);    //修改商品数量每次-1    public void updateGoods(String id);    //修改用户的余额    public void updateBalance(String username,int price);}

  Repository层实体:

/声明并装配到spring容器中去@Repository("goodDao")public class GoodDaoImpl implements GoodDao {//    配置属性,从spring容器中取出 JdbcTemplate 对象    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Override    public int findPriceById(String id) {        String sql = "select price from goods where id = ?";//        返回值为Integer的类类型        return jdbcTemplate.queryForObject(sql,Integer.class,id);    }    @Override    public void updateGoods(String id) {        String select = "SELECT NUMBER FROM good_numbers WHERE id = ?";        int number = jdbcTemplate.queryForObject(select,Integer.class,id);        if (number < 1){
//      该异常为自定义异常,仅继承了 RunTimeException 不贴上代码 throw new GoodException("商品数量不足"); } String sql = "update good_numbers set number = number-1 where id = ?"; jdbcTemplate.update(sql,id); } @Override public void updateBalance(String username, int price) { String select = "SELECT balance FROM users WHERE username = ?"; int balance = jdbcTemplate.queryForObject(select,Integer.class,username); if (balance < price){
//      该异常为自定义异常,仅继承了 RunTimeException 不贴上代码
        throw new UserException("用户余额不足"); }      String sql = "update users set balance = balance - ? where username = ?";      jdbcTemplate.update(sql,price,username);  } }

  Service层的接口和实现:

  

//接口public interface GoodService {    public void buyGood(String username,String id);}//实现类@Service("goodService")public class GoodServiceImpl implements GoodService {    @Resource(name = "goodDao")    private GoodDao goodDao;    @Transactional    @Override    public void buyGood(String username, String id) {        int price = goodDao.findPriceById(id);        goodDao.updateGoods(id);        goodDao.updateBalance(username,price);    }}

   测试类

public class TestGoodService {    private GoodService goodService;    @Test    public void test(){        ApplicationContext applicationContext =new  ClassPathXmlApplicationContext("application.xml");        this.goodService = (GoodService) applicationContext.getBean("goodService");        goodService.buyGood("aa","1");    }}

 

 

  XML的配置方式:

  xml中仅仅是在配置文件中不同,和实体类中取出了所有的注解,故,只将xml文件帖出:

  xml文件的声明头很重要,错误将导致意外的异常,建议不要改动

  

 

 配置文件  db.propertys

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:///springjdbc.user=rootjdbc.password=123456

 

转载于:https://www.cnblogs.com/yuwenhui/p/7522392.html

你可能感兴趣的文章
hdu 1028 Ignatius and the Princess III(母函数入门+模板)
查看>>
Ubuntu下配置安装telnet server
查看>>
Codeforces 235 E Number Challenge
查看>>
ubuntu 常见命令整理
查看>>
EJBCA安装教程+postgresql+wildfly10
查看>>
(五十四)涂鸦的实现和截图的保存
查看>>
配置EditPlus使其可以编译运行java程序
查看>>
java中的占位符\t\n\r\f
查看>>
MySQL通过frm 和 ibd 恢复数据过程
查看>>
SRS源码——Listener
查看>>
Java面向对象抽象类案例分析
查看>>
对SPI、IIC、IIS、UART、CAN、SDIO、GPIO的解释
查看>>
Thymeleaf模板格式化LocalDatetime时间格式
查看>>
庖丁解“学生信息管理系统”
查看>>
Pyltp使用
查看>>
其他ip无法访问Yii的gii,配置ip就可以
查看>>
php做的一个简易爬虫
查看>>
x的x次幂的值为10,求x的近似值
查看>>
jquery获取html元素的绝对位置和相对位置的方法
查看>>
ios中webservice报文的拼接
查看>>