JavaWeb学习记录(十三)——商城购物之添加订单的数据库级联操作
一、方法实现
private JdbcTemplate jdbcTemplate = new JdbcTemplate(DBConn.getDataSource());
@SuppressWarnings("deprecation")
@Override
public boolean insertObject(Orders entity) {
String sql1 = "insert into orders(number,status,uid) values(?,?,?)";
// 保存订单
int num1 = jdbcTemplate.update(sql1, new Object[] { entity.getNumber(),
"未付款", entity.getUser().getId() });
if (num1 > 0) {
//获取订单id
int id = jdbcTemplate.queryForInt(
"select id from orders where number=?", entity.getNumber());
//设置订单id
entity.setId(id);
boolean flag = false;
// 保存订单详情
List<OrdersItem> ordersItems = entity.getOrdersItems();
String sql2 = "insert into ordersItem(gid,num,price,oid)values(?,?,?,?)";
if (ordersItems != null) {
for (OrdersItem item : ordersItems) {
// 保存订单条目
int num2 = jdbcTemplate.update(
sql2,
new Object[] { item.getGoods().getId(),
item.getNum(), item.getPrice(),
item.getOrders().getId() });
if (num2 > 0) {
} else {
flag = true;
break;
}
}
if (flag) {
System.out.println("OrdersItem 有一个插入失败");
} else {
// 查出总价格
String sql3 = "select sum(price) as sum from ordersItem where oid=?";
Double sum = jdbcTemplate.queryForObject(sql3,
new RowMapper<Double>() {
@Override
public Double mapRow(ResultSet rs, int arg1)
throws SQLException {
// TODO Auto-generated method stub
return rs.getDouble("sum");
}
}, entity.getId());
// 更新订单总价格
String sql4 = "update orders set sum=? where id=?";
int num3 = jdbcTemplate.update(sql4, new Object[] { sum,
entity.getId() });
if (num3 > 0) {
System.out.println("更新成功");
} else {
System.out.println("更新失败");
}
}
} else {
System.out.println("订单插入失败");
}
}
return false;
}
二、测试
public class OrderTest {
private OrdersDao ordersDao=new OrdersDaoImpl();
@Test
public void test1(){
Orders orders=new Orders();
orders.setNumber("0x0014");
User u=new User();
u.setId(1);
orders.setUser(u);
//创建一个订单集合
List<OrdersItem> ordersItems=new ArrayList<OrdersItem>();
Goods goods=new Goods(1, "", 5000, null, null);
OrdersItem item1=new OrdersItem(goods, 3, 3*goods.getPrice(), orders);
ordersItems.add(item1);
Goods goods1=new Goods(2, "", 11, null, null);
OrdersItem item2=new OrdersItem(goods1, 3, 3*goods1.getPrice(), orders);
ordersItems.add(item2);
orders.setOrdersItems(ordersItems);
ordersDao.insertObject(orders);
}
}
三、事务处理的方法
private JdbcTemplate jdbcTemplate = new JdbcTemplate(DBConn.getDataSource());
@Override
public boolean insertObject(final Orders entity) {
//事务处理,保证下面的语句要么全都执行,要么全都不执行
//事务管理对象
PlatformTransactionManager transactionManager=new DataSourceTransactionManager(DBConn.getDataSource());
//事务管理的模板对象
TransactionTemplate template=new TransactionTemplate(transactionManager);
//执行操作
return template.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus ts) {
String sql1 = "insert into orders(number,status,uid) values(?,?,?)";
// 保存订单
int num1 = jdbcTemplate.update(sql1, new Object[] { entity.getNumber(),
"未付款", entity.getUser().getId() });
if (num1 > 0) {
//获取订单id
@SuppressWarnings("deprecation")
int id = jdbcTemplate.queryForInt(
"select id from orders where number=?", entity.getNumber());
//设置订单id
entity.setId(id);
boolean flag = false;
// 保存订单详情
List<OrdersItem> ordersItems = entity.getOrdersItems();
String sql2 = "insert into ordersItem(gid,num,price,oid)values(?,?,?,?)";
if (ordersItems != null) {
for (OrdersItem item : ordersItems) {
// 保存订单条目
int num2 = jdbcTemplate.update(
sql2,
new Object[] { item.getGoods().getId(),
item.getNum(), item.getPrice(),
item.getOrders().getId() });
if (num2 > 0) {
} else {
flag = true;
break;
}
}
if (flag) {
System.out.println("OrdersItem 有一个插入失败");
ts.setRollbackOnly();
return false;
} else {
// 查出总价格
String sql3 = "select sum(price) as sum from ordersItem where oid=?";
Double sum = jdbcTemplate.queryForObject(sql3,
new RowMapper<Double>() {
@Override
public Double mapRow(ResultSet rs, int arg1)
throws SQLException {
// TODO Auto-generated method stub
return rs.getDouble("sum");
}
}, entity.getId());
// 更新订单总价格
String sql4 = "update orders set sum=? where id=?";
int num3 = jdbcTemplate.update(sql4, new Object[] { sum,
entity.getId() });
if (num3 > 0) {
System.out.println("更新成功");
return true;
} else {
System.out.println("更新失败");
ts.setRollbackOnly();
return false;
}
}
} else{
return true;
}
}else {
System.out.println("订单插入失败");
ts.setRollbackOnly();
return false;
}
}
});
}
JavaWeb学习记录(十三)——商城购物之添加订单的数据库级联操作的更多相关文章
- (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交
如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...
- JavaWeb学习记录(十四)——商城购物之字符串拼接实现最近浏览商品和购物车的功能
一.字符串拼接的工具类 package blank.util; import java.util.Iterator;import java.util.Map;import java.util.Set; ...
- JavaWeb学习记录(十二)——商城购物之数据库操作的接口定义
一.基本接口,该项目中所有接口都继承它 package blank.dao; import java.util.List; public interface BaseDao<T,PK> { ...
- JavaWeb学习记录(二十三)——文件上传与下载
一.导入jar包
- javaweb学习记录(1)
Java基础学习笔录 1.运行java程序,出现bad version number in.class file 编译器()的版本号高于运行环境(jre)的版本号,可以降低编译器版本号,也可以通过提升 ...
- JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能
一.分页工具类 package blank.util;import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; ...
- JavaWeb学习记录(二十一)——国际化处理
¨国际化又称为 i18n:internationalization ¨对于软件中的菜单栏.导航条.错误提示信息,状态信息等这些固定不变的文本信息,可以把它们写在一个properties文件中,并根据不 ...
- javaweb学习总结十三(dom4j方式对XML文档进行解析以及Xpath的使用)
一:dom4j方式介绍 对于xml的解析总共有三种 1:jaxp方式,是sun公司开发的,分为sax方式和dom方式 2:jdom方式,后来其中部分人员参与开发dom4j 3:dom4j方式,是现在企 ...
- JavaWeb学习总结(十三)——使用Session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
随机推荐
- [开发笔记]-Visual Studio 2012中为创建的类添加注释的模板
为类文件添加注释,可以让我们在写代码时能够方便的查看这个类文件是为了实现哪些功能而写的. 一:修改类文件模板 找到类模版的位置:C:\Program Files (x86)\Microsoft Vis ...
- iOS中实现多线程的技术方案
pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { ...
- DOS下快速删除文件
Windows服务器或普通操作系统中经常会遇到很多生成的临时文件需要删除,如果需要删除的文件夹中数目很多,且文件很巨大时,如果通过鼠标选择文件夹再直接删除会响应得非常慢,特别是文件数量也巨大时,Win ...
- [转]source inslght使用指导
作为一个开放源代码的操作系统,Linux附带的源代码库使得广大爱好者有了一个广泛学习.深入钻研的机会,特别是Linux内核的组织极为复杂,同时,又不能像windows平台的程序一样,可以使用集成开发环 ...
- C# SVN检出的代码,F12显示从元数据
解决办法: 删除项目中的引用(同时也要删除bin文件夹中的dll文件,否则不能重新添加),并重新添加本地引用即可. 原因: 项目中的dll文件不是本机编译出来的,所以找不到元数据.如果当前关联的项目里 ...
- Html获取经纬度
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( function success(pos) {alert( ...
- BestCoder Round #1
逃生 反向拓扑+优先队列+逆序输出 这里要注意,题中要求的不是输出字典序,而是要编号小的尽量考前(首先1尽量考前,然后2尽量考前..). 比如说 约束是 4->1,3->2,字典序答案就是 ...
- Note_Master-Detail Application(iOS template)_02_YJYAppDelegate.m
//YJYAppDelegate.m #import "YJYAppDelegate.h" #import "YJYMasterViewController.h" ...
- 2016 - 1 -17 GCD学习总结
一:GCD中的两个核心概念,队列与任务: 1.任务:执行什么操作.(代码块 block) 任务执行的类型分为以下两种: 1.1同步执行任务:在当前线程执行任务.不会开辟新的线程. 1.2异步执行任务: ...
- C118 免按开机自动加载固件
最近无事,研究了按按钮开机的功能:功能的起初是参考了别人的系统是怎么做免开机加载固件的. 一.原理: 1.c118 原生loader部分代码是没有源代码的,它上电只需要按开机键然后系统就会起来. 2. ...