版权声明:本文为博主原创文章,未经博主允许不得转载。 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));
}