Spring入门知识 ———— 学习事务前的准备工作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38111957/article/details/83957500

一、引言

在我们学习事物之前呢,肯定需要准备一个使用事务的场景,方便后面学习事务做准备。这个案例非常简单,在我们生活随处可见,也方便大家理解。

我相信大家肯定拿过爸妈给的零花钱,去买零食。在我们拿零花钱在购买的时候,是不是零花钱要减少,并且你购买的零食的商品库存也要减少是吧。 举个例子,注意这不是打广告。 小编手里面有10块钱零花钱,这个时候小编口馋了,想来一包乐事的薯片。薯片的价格为3块,小编就购买了一包,这时候小编就只剩下7元,并且薯片的库存减少了1,因为被小编买走了。

这个场景应该都能理解吧~~~~

二、数据库结构

表一:账户表,就是钱包,一个用户对应一个钱包。

CREATE TABLE `tb_account` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编码',
  `moeny` int(11) DEFAULT NULL COMMENT '账户金额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

表二:商品表如下

CREATE TABLE `tb_commodity` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品编码',
  `name` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '商品名称',
  `price` int(11) DEFAULT NULL COMMENT '商品价格',
  `stock` int(12) DEFAULT NULL COMMENT '商品库存',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

 

三、代码实现

持久层:其中有三个方法需要用到,Commodity对应的商品表的Java实体类。

public interface DataBaseDao {

    /**
     * 修改账户资金
     * @param id 用户的账户id
     * @param money 购买商品的金额
     * @return
     */
     int updateAccount(int id,int money);

    /**
     * 修改商品库存
     * @param id 商品id
     * @return
     */
     int updateStory(int id);

    /**
     * 通过id查询商品
     * @param id
     * @return
     */
     Commodity selectCommodityByid(int id);

}
@Repository
public class DataBaseDaoImpl implements DataBaseDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public int updateAccount(int id, int money) {
        String sql = "update tb_account set moeny = moeny - ? where id = ?";
        return jdbcTemplate.update(sql, money, id);
    }

    public int updateStory(int id) {
        String sql = "update tb_commodity set stock = stock - 1 where id = ?";
        return jdbcTemplate.update(sql, id);
    }

    public Commodity selectCommodityByid(int id) {
        String sql = "select * from tb_commodity where id = ?";
        RowMapper<Commodity> rowMapper = new BeanPropertyRowMapper<Commodity>(Commodity.class);
        Commodity commodity = jdbcTemplate.queryForObject(sql,rowMapper,id);
        return commodity;
    }
}

业务层:先通过商品编码查询具体商品,通过用户编码减去用户对应的账户金额,最后更新商品库存操作。

@Service
public class DataBaseService {

    @Autowired
    private DataBaseDao dataBaseDao;

    /**
     * 购物操作
     * @param userid 用户编码,减去该用户账户相对应的购买商品金额
     * @param cid 商品编码,查询该商品的价格,以及购买成功是库存-1
     * @return
     */
    public int goShopping(int userid,int cid){

        //查询商品
        Commodity commodity =  dataBaseDao.selectCommodityByid(cid);

        //减去用户账户金额
        dataBaseDao.updateAccount(userid,commodity.getPrice());

        //减去该商品的库存
        dataBaseDao.updateStory(cid);

        return 1;
    }
}

XML配置文件:都学习到这一章节了,小编应该不需要把配置文件贴出来了,小伙伴最好动手写一写,上一个章节也有讲到。

<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-4.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--引入外部属性文件-->
    <context:property-placeholder location="db.properties"></context:property-placeholder>

    <!--扫描注解的包-->
    <context:component-scan base-package="com.spring.five"></context:component-scan>

    <!--配置阿里巴巴连接池-->
    <bean id="DruidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="driverClassName" value="${jdbc.driver}"></property>
    </bean>

    <!--配置JdbcTemp laTemplate-->
    <bean class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="DruidDataSource"></property>
    </bean>
</beans>

最后测试测试:经小编测试,最后用户1的账户金额减去了商品1的金额,并且商品库存也减少了1。

如果效果不是小编上述所说,那就是存在问题的,可以留言,有我小编专业人士为您解答,哈哈哈哈啊哈~!

  public static void main(String[] args) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext-five.xml");
        DataBaseService baseService = beanFactory.getBean(DataBaseService.class);
        //用户编码为1、商品编码为1
        System.out.println(baseService.goShopping(1,1));
    }

猜你喜欢

转载自blog.csdn.net/weixin_38111957/article/details/83957500