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;
                }

            }
        });
        
    }

转载于:https://www.cnblogs.com/ly-radiata/p/4360728.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值