springboot第27集:springboot-mvc,WxPay

在数据库中,DISTINCT 关键字用于查询去重后的结果集。它用于从查询结果中去除重复的行,只返回唯一的行。

要使用 DISTINCT 关键字,可以将其放置在 SELECT 关键字之前,指示数据库返回去重后的结果。

请注意,DISTINCT 关键字应用于所有指定的列,即返回的结果将根据指定的所有列进行去重。

使用 DISTINCT 关键字时要注意以下几点:

  • DISTINCT 关键字适用于查询多个列或单个列的情况。

  • DISTINCT 关键字是大小写不敏感的,因此 DISTINCTdistinct 是等效的。

  • DISTINCT 关键字通常与 SELECT 语句一起使用,但也可以与 COUNTSUMAVG 等聚合函数一起使用。

  1. 检查MyBatis配置文件(如 mybatis-config.xml)或特定于框架的配置文件(如Spring配置),确保正确配置了 com.wxapp.system.mapper.SysUserMapper 的命名空间。

  2. 验证 getUserByPhone 语句是否在 SysUserMapper 命名空间中定义。打开与 SysUserMapper 相应的映射器XML文件,并确认是否存在ID为 getUserByPhone 的SQL语句。

  3. 确保您的服务或DAO类中的SQL语句ID(getUserByPhone)与映射器XML文件中定义的ID匹配。仔细检查是否存在任何拼写错误或不一致之处。

  4. 如果映射器XML文件中缺少SQL语句或命名不同,您需要相应地添加或修改它。确保语句具有正确的语法,并与您的数据库模式匹配。

  5. 保存更改,如果需要重新构建应用程序,并重试触发错误的操作。

错误消息:"msg": "Invalid bound statement (not found): com.wxapp.system.mapper.SysUserMapper.getUserByPhone"

错误消息指出了一个"Invalid bound statement"(无效的绑定语句)错误,并提到了com.wxapp.system.mapper.SysUserMapper.getUserByPhone。

这个错误通常发生在MyBatis无法找到指定命名空间中映射的SQL语句时。

要解决这个问题,您可以按照以下步骤进行操作:

  1. 首先,请确保您的MyBatis配置文件中正确配置了com.wxapp.system.mapper.SysUserMapper的命名空间。

  2. 然后,打开com.wxapp.system.mapper.SysUserMapper对应的映射文件,检查是否存在getUserByPhone语句。确保语句的ID为getUserByPhone,并且定义了正确的SQL语句。

示例:

<mapper namespace="com.xxxx.system.mapper.SysUserMapper">
<select id="getUserByPhone" resultType="com.wxapp.system.model.SysUser">
    SELECT * FROM users WHERE phone = #{phone}
</select>

进入控制台

gitlab-rails console -e production
# 查询所有的用户

user = User.all

# 通过条件查询用户 常见的where条件有 username email state

user = User.where(id:1).first
user = User.find\_by(username:'root')
user = User.find\_by(email:'<admin@qq.com>')

# 通过id查询用户

user = User.find(1)

# 查询用户某个字段的值 显示当前用户的email

user.email
# 修改用户id为10的密码
user = User.find(10)
user.password = 'new_password'  #如:user.password = '123456'
user.password_confirmation = 'new_password' #如:user.password_confirmation = '123456'
user.save! #保存修改内容

# 退出
exit
cd3a6434f7647576835766fcbd745c61.png
image.png
11eba35b9ea271fd150d19c5f5158241.png
image.png
fc6081b66817976e5a1c198965921ac5.png
image.png
acac7dd45ac565fce11b1ea54ac665d4.png
image.png
ebeab6adf88148ed30140575b874325d.png
image.png
d734337b2dd37c3d6fba096ca5a5cca1.png
image.png
a8d2212924916361eba119bf78642b58.png
image.png

WxPayConfig.java

// 获取商户的私钥文件
private PrivateKey getPrivateKey(String filename) {
 try {
  return PemUtil.loadPrivateKey(new FileInputStream(filename));
 } catch (FileNotFoundException e) {
  throw new RuntimeException("私钥文件不存在", e);
}
// 获取签名验证器
@Bean
public ScheduledUpdateCertificatesVerifier getVerifier() {
 // 获取商户私钥
 PrivateKey privateKey = getPrivateKey(privateKeyPath);
 
 // 私钥签名对象
 PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);
 
 // 身份认证对象
 WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);
 
 // 使用定时更新的签名验证器,不需要传入证书
 ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(wechatPay2Credentials, apiV3Key.getBytes(StandardCharsets.UTF_8));
 
 return verifier;
}
// 获取http请求对象
@Bean
public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) {
 // 获取商户私钥
 PrivateKey privateKey = getPrivateKey(privateKeyPath);
 
 WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
  .withMerchant(mchId, mchSerialNo, privateKey)
  .withValidator(new WechatPay2Validator(verifier));
  
 // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验证签,并进行证书自动更新
 CloseableHttpClient httpClient = builder.build();
 
 return httpClient;
}
162e5384f6158b97f5f34ed7014f043c.png
image.png
af3cfc0e8d7603fd0dedcb0679e58682.png
image.png
config
controller
entity
enums
 -wxpay
mapper
service
vo

PayType

@AllArgsConstructor
@Getter
public enum PayType {
 // 微信
 WXPAY("微信"),
 // 支付宝
 ALIPAY("支付宝");
 // 类型
 private final String type;
}

在 Spring Boot 中,"VO" 和 "Domain" 是两个常见的概念,用于表示不同的数据对象。

  1. VO (View Object):

  • VO 是视图对象,用于在前端和后端之间传递数据。

  • 它通常用于展示层(View Layer)或者前端展示的数据模型。

  • VO 对象的属性通常是根据前端页面的需求来定义的,可以包含与前端交互所需的各种属性。

  • VO 对象一般是只读的,不包含业务逻辑。

Domain (领域对象):

  • Domain 是领域对象,用于表示业务领域中的核心业务对象。

  • 它通常用于业务层(Service Layer)或者持久层(Persistence Layer)。

  • Domain 对象的属性和行为是根据业务规则和领域需求来定义的,它代表了真实的业务实体。

  • Domain 对象通常包含业务逻辑,封装了对数据的操作和处理。

VO 和 Domain 在设计模式中属于不同的概念,它们的职责和作用也不同。

在实际开发中,为了解耦和模块化,常常会使用 DTO (Data Transfer Object) 对象在不同层之间传输数据。DTO 可以根据具体的业务需求从 Domain 对象中抽取部分属性,并添加一些必要的额外属性,以满足数据传输的需要。在这种情况下,DTO 可以充当 VO 的角色,用于传递数据给前端。

总结:

  • VO (View Object) 是用于前端数据展示的对象,通常只包含与前端交互所需的属性。

  • Domain (领域对象) 是用于表示业务领域中的核心业务对象,包含业务逻辑和数据操作。

  • DTO (Data Transfer Object) 可以在不同层之间传输数据,可以根据具体需求从 Domain 对象中抽取部分属性,并添加一些额外属性。在某些情况下,DTO 可以充当 VO 的角色。

要优化网页加载速度和性能,可以考虑以下几个方面:

  1. 压缩和缩小文件:使用压缩工具(如Gzip)来减小文件大小,减少传输时间。同时,优化图片大小和格式,使用CSS和JavaScript压缩工具来减小它们的文件大小。

  2. 启用缓存:通过使用HTTP缓存头(例如Expires,Cache-Control)来启用浏览器缓存。这样可以减少对服务器的请求,提高页面加载速度。

  3. 减少HTTP请求:将多个CSS文件合并为一个文件,并将多个JavaScript文件合并为一个文件,从而减少HTTP请求的数量。

  4. 延迟加载:将非关键和不可见的元素延迟加载,例如图片、JavaScript和CSS文件。这可以通过使用懒加载技术或按需加载来实现。

  5. 压缩和优化图片:使用适当的图像格式(如JPEG、PNG)和压缩工具来优化图像。同时,调整图像的尺寸和分辨率,以适应页面布局和显示需求。

  6. 使用CDN加速:使用内容分发网络(CDN)来加速静态文件的传输,使其从离用户更近的服务器加载。

  7. 最小化重绘和回流:避免使用昂贵的CSS属性和操作,这可能导致页面的重绘(repaint)和回流(reflow)。尽量使用CSS3硬件加速特性,减少对DOM的频繁操作。

  8. 优化JavaScript执行:避免使用耗时的JavaScript操作和循环,优化算法和代码逻辑,减少不必要的DOM操作。

  9. 使用异步加载:使用异步加载脚本(如async和defer)来确保JavaScript文件不会阻塞页面的加载和渲染过程。

  10. 使用缓存优化技术:使用缓存技术,如内存缓存、本地存储和会话存储,减少对服务器的请求。

  11. 定期进行性能测试和优化:使用工具和技术(如浏览器开发者工具、性能分析工具等)对网页进行定期的性能测试和优化,找出潜在的性能瓶颈并进行改进。

在Spring Boot中,"framework"(框架)通常指的是Spring框架(Spring Framework)。Spring是一个开源的Java应用程序框架,它提供了一种综合的编程和配置模型,用于构建现代化的Java应用程序。

Spring框架提供了许多功能和特性,使得开发Java应用程序更加简单和高效。它的核心原则之一是面向切面编程(AOP),它允许开发人员通过将横切关注点(例如事务管理、安全性、日志记录等)从应用程序逻辑中分离出来,以提高代码的模块化和可重用性。

Spring框架还提供了一个轻量级的容器(IoC容器),用于管理应用程序中的对象和依赖关系。它通过依赖注入(DI)的方式,将对象之间的依赖关系委托给容器来管理,从而简化了对象的创建和管理过程。

除了IoC容器和AOP,Spring框架还提供了许多其他功能,如数据访问(使用Spring Data)、Web开发(使用Spring MVC)、安全性(使用Spring Security)、集成消息(使用Spring Integration)等。这些功能模块可以根据应用程序的需求进行选择和集成,以构建出符合业务需求的完整的Java应用程序。

总的来说,Spring框架是Spring Boot的基础,它提供了一个强大且灵活的开发框架,使得构建Java应用程序更加简单、模块化和可扩展。Spring Boot则在此基础上提供了一种快速、便捷的方式来构建和配置Spring应用程序,提供了自动配置、嵌入式Web服务器等功能,使得开发者能够更加专注于业务逻辑的实现。

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/28761.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day07--java高级编程:JDK8的新特性,JDK9的新特性,JDK10的新特性,JDK11的新特性,JDK15的新特性

1 JDK8的其它新特性 说明&#xff1a;一些8中的新特性在&#xff0c;java高级部分学习的同时顺便讲过了。 1.1 JDK8新特性的总体结构 1.2 Java 8新特性简介 1.3 Lambda表达式 1.3.1 出现背景 1.3.2 Lambda表达式的使用举例 package com.atguigu.java1;import org.junit.Tes…

AntDB 企业增强特性介绍——AntDB在线数据扩容关键技术

数据库集群安装完成后&#xff0c;其数据存储容量是预先规划并确定的。随着时间的推移以及业务量的增加&#xff0c;数据库集群中的可用存储空间不断减少&#xff0c;面临数据存储容量扩充的需求。 传统的在线扩容的流程大致如下。 &#xff08;1&#xff09;在集群中加入新的 …

数据库迁移 | Oracle数据迁移方案之技术两三点

今年Oracle似乎又火了&#xff0c;火得要下掉&#xff0c;目前中国大概有240数据库企业&#xff0c;在国产信创的大趋势下&#xff0c;一片欣欣向荣&#xff0c;国库之春已然来临。到今天为止&#xff0c;Oracle依旧是市场份额最大的数据库&#xff0c;天下苦秦久矣&#xff0c…

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具&#xff0c;要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具&#xff0c;你就可以监控到java虚拟机的gc过程了 那么&#xff0c;这么强大的工具怎么下载呢&…

顶奢好文:3W字,穿透Spring事务原理、源码,至少读10遍

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、美团、极兔、有赞、希音的面试资格&#xff0c;Spring事务源码的面试题&#xff0c;经常遇到&#xff1a; (1) spring什么情况下进行事务回滚&#xff1f; (2) spring 事务…

Transformer在CV领域有可能替代CNN吗?

目前已经有基于Transformer在三大图像问题上的应用&#xff1a;分类&#xff08;ViT&#xff09;&#xff0c;检测&#xff08;DETR&#xff09;和分割&#xff08;SETR&#xff09;&#xff0c;并且都取得了不错的效果。那么未来&#xff0c;Transformer有可能替换CNN吗&#…

索尼RSV视频修复方法论视频文件修复时样本文件的三同

索尼RSV类的文件修复案例有很多&#xff0c;程序操作也很简单没什么可说的&#xff0c;这次这个索尼ILCE-7SM3的案例就是为了让大家更好的认识视频修复中我称之为“三同“的重要性&#xff0c;想要恢复的效果好必须要把准备工作做到位。 故障文件:45.1G RSV文件 故障现象: 索…

工具篇--4 消息中间件-RabbitMq 模型介绍

1 介绍: RabbitMQ 是一个开源的消息中间件&#xff0c;它实现了 AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;并且支持多种语言和操作系统&#xff0c;包括 Java、Python、Ruby、PHP、.NET、MacOS、Windows、Linux 等等。RabbitMQ 提供了可靠的消息传递机制…

竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪)

竞赛无人机搭积木式编程&#xff08;三&#xff09;---用户自定义航点自动飞行功能&#xff08;全局定位&#xff0c;指哪打哪&#xff09; 无名小哥 2023年6月10日 用户通过对前面两讲中全国大学生电子设计竞赛真题植保无人机&#xff08;2021&#xff09;、送货无人机&#…

【UE 从零开始制作坦克】2-控制坦克移动(简单的移动效果)

效果 步骤 1. 新建蓝图类&#xff0c;父类选择“VehicleWheel&#xff08;载具车轮&#xff09;” 这里就命名为“TankWheel” 双击打开“TankWheel”&#xff0c;设置形状半径为40 2. 打开 “BP_West_Tank_M1A1Abrams” 选中“网格体&#xff08;VehicleMesh&#xff09;&…

JMeter参数化4种实现方式

目录 前言&#xff1a; 1 参数化释义 2 参数化实现 CSV实例 注意事项 前言&#xff1a; 在使用JMeter进行测试时&#xff0c;参数化允许您模拟不同的用户、不同的数据、不同的操作等&#xff0c;从而增加了测试的灵活性和复用性 1 参数化释义 什么是参数化&#xff1f;…

设计模式(十八):行为型之观察者模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

分布式数据库HBase

大数据基础-分布式数据库HBase 概述HBase简介HBase与传统关系数据库的对比分析 HBase数据模型数据模型概述数据模型相关概念数据坐标 HBase的实现原理HBase功能组件表和RegionRegion的定位HBase框架结构HMasterRegionServerHBase协作组件RegionColumnFamilyKeyValue小结 HBase运…

STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

docker数据管理---数据卷,数据卷容器

在Docker中&#xff0c;数据卷&#xff08;data volumes&#xff09;和数据卷容器&#xff08;data volume containers&#xff09;是用于在容器之间共享和持久化数据的两种不同的机制。 一、数据卷 数据卷是一个特殊的目录或目录&#xff0c;可以绕过容器文件系统的常规层&a…

【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列

&#x1f4a7; 【 R a b b i t M Q 教程】第六章—— R a b b i t M Q − 延迟队列 \color{#FF1493}{【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列} 【RabbitMQ教程】第六章——RabbitMQ−延迟队列&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人…

2023年前端面试高频考点HTML5+CSS3

目录 浏览器的渲染过程⭐⭐⭐ CSS 、JS 阻塞 DOM 解析和渲染 回流&#xff08;重排&#xff09;和重绘⭐⭐ 选择器 ID选择器、类选择器、标签选择器&#xff08;按优先级高到低排序&#xff09;⭐⭐ 特殊符号选择器&#xff08;&#xff1e;,,~&#xff0c;空格&#xff0…

Stopwatch工具类计时器探究

搬砖的我们 特别是Java开发的童鞋们, 经常需要通过记录开始时间和结束时间&#xff0c;然后通过计算差值&#xff0c;得到时间差&#xff0c;如下面的代码&#xff1a; long start System.currentTimeMillis(); long end System.currentTimeMillis(); System.out.println(…

医疗设备都在用哪些晶振?

医疗设备是指用于医疗诊断、治疗、监测等方面的各种设备。随着科技的不断发展&#xff0c;医疗设备的功能不断增强&#xff0c;精度和稳定性也得到了大幅提升。在这些医疗设备中&#xff0c;晶振是非常重要的元件之一。本文将介绍医疗设备中常用的晶振类型及其特点。 一、晶振…

P20[6-8]编码器接口测速(软)

与外部中断编码器逻辑不同,此处编码器使用的是定时器方法 1.Encoder编码器部分: #include "stm32f10x.h" // Device header void Encoder_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCm…