一、方法实现

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学习记录(十三)——商城购物之添加订单的数据库级联操作的更多相关文章

  1. (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交

    如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...

  2. JavaWeb学习记录(十四)——商城购物之字符串拼接实现最近浏览商品和购物车的功能

    一.字符串拼接的工具类 package blank.util; import java.util.Iterator;import java.util.Map;import java.util.Set; ...

  3. JavaWeb学习记录(十二)——商城购物之数据库操作的接口定义

    一.基本接口,该项目中所有接口都继承它 package blank.dao; import java.util.List; public interface BaseDao<T,PK> { ...

  4. JavaWeb学习记录(二十三)——文件上传与下载

    一.导入jar包

  5. javaweb学习记录(1)

    Java基础学习笔录 1.运行java程序,出现bad version number in.class file 编译器()的版本号高于运行环境(jre)的版本号,可以降低编译器版本号,也可以通过提升 ...

  6. JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能

    一.分页工具类 package blank.util;import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; ...

  7. JavaWeb学习记录(二十一)——国际化处理

    ¨国际化又称为 i18n:internationalization ¨对于软件中的菜单栏.导航条.错误提示信息,状态信息等这些固定不变的文本信息,可以把它们写在一个properties文件中,并根据不 ...

  8. javaweb学习总结十三(dom4j方式对XML文档进行解析以及Xpath的使用)

    一:dom4j方式介绍 对于xml的解析总共有三种 1:jaxp方式,是sun公司开发的,分为sax方式和dom方式 2:jdom方式,后来其中部分人员参与开发dom4j 3:dom4j方式,是现在企 ...

  9. JavaWeb学习总结(十三)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

随机推荐

  1. wp8.1 Study6: App的生命周期管理

    一.概述 应用程序的生命周期详解可以参照Windows8.1开发中msdn文档http://msdn.microsoft.com/library/windows/apps/hh464925.aspx ...

  2. CCNA 6.3

    no encapsulation ppp(默认是encapsulation hdlc 在encapsulation ppp 后想要改回 hdlc 除了可用encapsulation hdlc外,还可以 ...

  3. (转载)Htmlparser Filter 简要归纳

    1 . 逻辑关系:与或非 AndFilter()           Creates a new instance of an AndFilter. AndFilter(NodeFilter[] pr ...

  4. [转]Vimium快捷键

    from: http://www.cppblog.com/deercoder/archive/2011/10/22/158886.html 今天下午折腾了一下Chrome下面的一个插件Vimium的使 ...

  5. 升级或安装 GNOME Shell

    1.安装经典Gnome桌面系统 install gnome-session-fallbackinstall gnome-appletsinstall indicator-applet indicato ...

  6. JS随鼠标坐标移动,显示浮动层内容

    在表单等项目中往往会遇到类似于“备注”.“说明”等100个字内的内容需要显示. 这些内容如果全部呈现开,会影响布局和美观,确又没有必要设计一个层或是一个页面. 那么,我们可以把这些内容放到浮动层中,鼠 ...

  7. idea使用generator自动生成model、mapper、mapper.xml(转)

    原文链接:http://www.mamicode.com/info-detail-445217.html TEP 0.在Intellij IDEA创建maven项目(本过程比较简单,略) STEP 1 ...

  8. Android-Java第一课 内部类 (inner Class)

    总所周知,Android系统基于Linux,内核和驱动都是使用C/C++语言做开发,但应用层一般使用 JAVA 语言开发.今天我们就来学习一下java的内部类. 内部类: 是一个编译时的概念,一旦编译 ...

  9. Hash(哈希)

    一.基本概念 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的 ...

  10. 《用格式化(fprintf和fscanf函数)的方式读写文件》

    //用格式化(fprintf和fscanf函数)的方式读写文件 [用格式化的方式向文件中写入数据]#include<stdio.h>#include<stdlib.h> int ...