热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

10天完成民猫电商毕设——订单展示实现支付宝沙箱支付(10thday)

1.三表联查的订单展示接口设计mybatis-plus只是在mybatis的基础上对单表CRUD进行了封装和增强,对于多表联查则有心无力,所以我们需要

1.三表联查的订单展示接口设计

mybatis-plus只是在mybatis的基础上对单表CRUD进行了封装和增强,对于多表联查则有心无力,所以我们需要从mapper层写sql开始写接口了。刚刚捡起来mybatis,我写的详细一点。

分析: 我们要得到订单的详细信息,需要联查t_order,t_order_product和t_product三个表才能得到所有目标信息。在这里你可能会问,为什么不把订单信息全部写到一个表中呢?很好,那你想想订单表里有商品信息,商品表里也有商品信息,商品信息在一个数据库中有两份冗余,对于数据冗余,数据库是不欢迎的,不仅浪费空间,并且如果订单表的商品信息修改了,那商品表的信息也要跟着修改等等一系列问题出现了,总之,全写到一个表中是不符合数据库范式的,这是在项目刚开始就需要考虑好的问题。

我们知道,三个表的联查入参是用户id,那么它所查询的结果该如何映射成一个java模型呢,我们的实体类中并没有一个这样包含了查询结果全部属性的类来匹配接收,这里有两种解决方案:
1.万能map(具体指HashMap)
2.改造实体类(增加实体类属性)

  • XML

<select id&#61;"getProductById" resultType&#61;"hashmap">select *from minmao.t_order_product o_pleft outer joinminmao.t_product p on o_p.productId &#61; p.idleft outer joinminmao.t_order o on o_p.orderId &#61; o.idwhere o.userId &#61; #{userId}select>

  • Mapper层

List<HashMap<String, Object>> getProductById(int userId);

注意多结果集使用list接收

  • 单元测试
    在这里插入图片描述
    在这里插入图片描述
    结果表明&#xff0c;可以根据用户的id查询出所有的订单详细信息
    接口测试&#xff1a;
    在这里插入图片描述
    在这里&#xff0c;我发现了一个使用万能map映射字段的问题&#xff0c;假设是两个表的联查&#xff0c;那么如果两个表中有字段名是相同的&#xff0c;比如订单和商品都是有状态status这个字段的&#xff0c;显然它们虽然名字一样&#xff0c;但是含义是不同的&#xff0c;不能合并处理&#xff0c;这就是命名空间的冲突问题了&#xff0c;同名但是含义不同必须隔离命名空间&#xff0c;对于这个问题&#xff0c;本来打算偷懒的&#xff0c;没考虑到&#xff0c;现在对于这个实际&#xff0c;好像只能使用方案二了。。。
    只能老老实实写resultMap、association和collection了

我们利用TOrderProduct实体来接收一个联查结果&#xff0c;返回结果是多个结果集

  • 在TOrderProduct增加订单实体属性和商品实体属性&#xff0c;同时添加它们的setter和getter

  • 书写联查sql语句(联查的话最好给每个字段或者表起一个不冲突的别名)

select o.id as order_id,o.cost as order_cost,o.orderNo as order_no,o.createTime as order_createTime,o.status as order_status,p.id as product_id,p.description as product_description,p.name as product_name,p.proPic as product_proPic,p.transactionMode as product_transactionModefrom minmao.t_order_product o_pleft outer joinminmao.t_product p on o_p.productId &#61; p.idleft outer joinminmao.t_order o on o_p.orderId &#61; o.idwhere o.userId &#61; #{userId}

  • navicat测试sql语句
    在这里插入图片描述
  • 写XML


DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace&#61;"com.minmao.mapper.TOrderProductMapper"><select id&#61;"getOrderListById" resultMap&#61;"o_p_map">select o.id as order_id,o.cost as order_cost,o.orderNo as order_no,o.createTime as order_createTime,o.status as order_status,p.id as product_id,p.description as product_description,p.name as product_name,p.proPic as product_proPic,p.transactionMode as product_transactionModefrom minmao.t_order_product o_pleft outer joinminmao.t_product p on o_p.productId &#61; p.idleft outer joinminmao.t_order o on o_p.orderId &#61; o.idwhere o.userId &#61; #{userId}select><resultMap id&#61;"o_p_map" type&#61;"tOrderProduct"><association property&#61;"product" javaType&#61;"tProduct"><id property&#61;"id" column&#61;"product_id">id><result property&#61;"description" column&#61;"product_description">result><result property&#61;"name" column&#61;"product_name">result><result property&#61;"proPic" column&#61;"product_proPic">result><result property&#61;"transactionMode" column&#61;"product_transactionMode">result>association><association property&#61;"order" javaType&#61;"tOrder"><id property&#61;"id" column&#61;"order_id">id><result property&#61;"cost" column&#61;"order_cost">result><result property&#61;"orderNo" column&#61;"order_orderNo">result><result property&#61;"createTime" column&#61;"order_createTime">result><result property&#61;"status" column&#61;"order_status">result>association>resultMap>
mapper>

  • mapper层 List getOrderListById(int userId); 多结果集用List接收

  • service&#xff0c;controller层略过

  • 接口测试
    在这里插入图片描述
    可以发现我们根据用户id返回了一个集合&#xff0c;集合中每一项是由商品对象和订单对象组成的&#xff0c;命名空间得到隔离&#xff0c;成功实现需求

不过返回数据太冗余了&#xff0c;空值不应该返回&#xff0c;并且还要修改实体类和写resultMap&#xff0c;救命&#xff01;好麻烦&#xff0c;我们再次尝试万能map&#xff0c;前面命名冲突的问题&#xff0c;我发现可以用在查询时给字段名起别名的方式解决&#xff0c;可以试一试&#xff01;

我们删除resultMap和修改resultMap为resultType&#61;“hashmap”&#xff0c;把对实体类的修改也全部还原


DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace&#61;"com.minmao.mapper.TOrderProductMapper"><select id&#61;"getOrderListById" resultType&#61;"hashmap">select o.id as orderId,o.cost as cost,o.orderNo as orderNo,o.createTime as createTime,o.status as status,p.id as productId,p.description as description,p.name as name,p.proPic as proPic,p.transactionMode as transactionModefrom minmao.t_order_product o_pleft outer joinminmao.t_product p on o_p.productId &#61; p.idleft outer joinminmao.t_order o on o_p.orderId &#61; o.idwhere o.userId &#61; #{userId}select>
mapper>

测试&#xff1a;
在这里插入图片描述
哈哈哈&#xff0c;HashMap YYDS&#xff01;&#xff0c;实现简单(只要写好sql就行了&#xff0c;其他交给类型匹配器和hashmap)&#xff0c;返回结果简洁清晰&#xff0c;不过官方是这样说的&#xff1a;
在这里插入图片描述
不管了&#xff0c;以后&#xff1a;单表CRUD用mybatis-plus&#xff0c;多表查询用resultType&#61;"hashmap"做结果映射&#xff0c;如果多表间字段名冲突&#xff0c;就在sql中用as为查询字段起别名

2.渲染订单数据

一顿操作终于&#xff0c;组件拿到数据
在这里插入图片描述
使用表格渲染&#xff1a;在这里插入图片描述

3.实现支付订单按钮&#xff08;支付宝沙箱&#xff09;


  1. 进入支付宝开发平台 &#xff0c;点击开发工具推荐下的沙箱
    在这里插入图片描述
    这个自定义密钥需要用他们的开发工具来生成

  2. 下载开发工具
    生成应用私钥和密钥
    在这里插入图片描述

  3. 回到支付宝开放平台的沙箱环境
    将2中的应用公钥粘贴进去&#xff0c;它会根据这个应用公钥给你返回一个支付宝公钥&#xff0c;我们在程序中要使用的就是这个支付宝公钥应用私钥了&#xff0c;注意区分这个支付宝公钥和应用公钥&#xff0c;应用公钥是联系支付宝公钥和应用私钥的&#xff0c;相当于中介人&#xff0c;联系上就没用了

  4. application.yml中配置alipay&#xff1a;
    在这里插入图片描述

  5. 导入依赖

<dependency><groupId>com.alipay.sdkgroupId><artifactId>alipay-sdk-javaartifactId><version>4.22.113.ALLversion>dependency>

  1. 测试

&#64;Controller
&#64;RequestMapping("/api/minmao/pay")
public class PayController {&#64;Value("${alipay.appid}")private String appid;&#64;Value("${alipay.url}")private String url;&#64;Value("${alipay.privateKey}")private String privateKey;&#64;Value("${alipay.publicKey}")private String publicKey;&#64;Value("${alipay.notifyUrl}")private String notifyUrl;&#64;Value("${alipay.returnUrl}")private String returnUrl;&#64;ResponseBody&#64;RequestMapping("/test")public String payTest() throws AlipayApiException {AlipayClient alipayClient &#61; new DefaultAlipayClient(url, appid, privateKey, "json", "UTF-8", publicKey, "RSA2");AlipayTradePagePayRequest request &#61; new AlipayTradePagePayRequest();request.setNotifyUrl(notifyUrl);request.setReturnUrl(returnUrl);JSONObject bizContent &#61; new JSONObject();bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");bizContent.put("out_trade_no", "20150320010101002");bizContent.put("total_amount", 50000);bizContent.put("subject", "测试商品");request.setBizContent(bizContent.toString());AlipayTradePagePayResponse response &#61; alipayClient.pageExecute(request);String form &#61; response.getBody();if (response.isSuccess()) {System.out.println("调用成功");} else {System.out.println("调用失败");}return form;}
}

测试结果在这里插入图片描述
好像是个页面&#xff0c;我们用浏览器访问http://localhost:8081/api/minmao/pay/test试试
在这里插入图片描述
这是因为我们登录了支付宝的开放平台&#xff0c;可以换一个浏览器edge来访问&#xff0c;结果如下&#xff1a;
在这里插入图片描述
我们利用沙箱的买家账号进行登录测试&#xff1a;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本来给自己一个十天做完毕设的挑战的&#xff0c;现在看来还是太菜了&#xff0c;总是犯一些低级错误&#xff0c;导致时间被大量浪费&#xff0c;有时候也比较痛苦&#xff0c;特别是眼睛有点酸痛&#xff0c;经常忘记喝水&#xff0c;也是非常不好的&#xff0c;所以我决定明天只完善一下支付按钮&#xff0c;不做其他的需求了&#xff0c;明天就是五一劳动节了&#xff0c;给自己稍微放个假&#xff0c;也在这里祝大家劳动节快乐&#xff01;
参考文章&#xff1a;
Mybatis无实体类&#xff0c;以List>方式返回
支付宝沙箱环境文档
alipay.trade.page.pay(统一收单下单并支付页面接口)
springboot 整合支付宝支付&#xff08;沙箱&#xff09;
使用支付宝沙箱调试时出现“支付存在钓鱼风险”


推荐阅读
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
author-avatar
书友53537817
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有