自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 收藏
  • 关注

原创 Spring Data JPA

这套本领可以让UserRepository的能力更上一层楼,比如,想按照名称中的关键字查询用户,只需要按照Spring Data JPA的规范在UserRepository中定义相应的接口。而SQL方式是以表为操作对象的,因此可以使用某种数据库特有的功能,比如某个MySql独有的功能,但是切换到Oracle时就不能了,这一点需要注意。Spring通过一系列的代理,发射,SQL组装,参数绑定,最终生成可执行的DML并发送到数据库中执行,然后将结果封装返回。

2024-11-03 15:52:11 617

原创 派系之争20241101

那一晚,华山派在药王庙集体被团,提不起半点内力的令狐冲凭借着精妙的“独孤九剑”连败两名剑宗高手——丛不弃和封不平,后来又以一招“破剑式”刺瞎15名黑衣蒙面人的眼睛而一战成名。身怀“紫霞神功”的气宗传入岳不群被敌人所擒,而内力尽失的令狐冲却凭借刚学会不久,甚至还不太熟练的“独孤九剑”就将强敌一一击溃。JPA和MyBatis就像气宗和剑宗一样,气宗并非不练剑招,剑宗也并非不练内功,只不过两者的侧重点不同而已。当年,气宗和剑宗为了证明自己的理念正确,相约于玉女峰之上比剑,最后斗得两败俱伤。

2024-11-01 17:57:39 294

原创 发展20241101

现在已经很少有人提及EJB(当年靠着Sun公司的力捧名噪一时)了,这是因为EJB太重量级,太难用,很快被Hibernate所取代(事实再一次告诉我们,“打铁还需自身硬”)随着互联网的发展,尤其是移动互联网的飞速扩展,MyBatis(基于JDBC的轻量级持久层框架,前身是iBatis)凭借其简单,高效,灵活等特点迅速成为新时代的“宠儿”。持久化操作(对数据库的操作)一直都是Java的核心内容,并且在Java的发展历史中,数据库持久化层面的技术也在不断的发展与更新。

2024-11-01 17:26:01 259

原创 与持久化有关的那些事儿

持久化就是指将数据存储得尽可能长久,至于多久没有限制,但至少要久于程序的运行周期(即程序退出后,数据仍然要在)从结绳记事,甲骨文到竹简,纸张,再到如今的磁盘,硬盘,随着时代的变迁,数据的存储介质技术也在不断进化。如今,人们每次都在产生数据,也越来越离不开数据,如看什么电影,听过什么音乐,去过是,1地方等。也许这对你的影响不算太大,那么再试想一下,如果支付宝或者银行的数据丢失会出现什么后果?所谓“硬盘有价,数据无价”,数据对于一个企业的重要性不言而喻。不管是容量还是存储的安全性和持久性,都发生了质的变化。

2024-11-01 15:21:11 133

原创 5.5要点回顾

RESTfule风格的接口由URI定位资源,使用HTTP方法操作资源,且URI由名词组成。报文分为请求报文和响应报文,由起始行,首部和主体组成。knife4j是一款非常棒的Swagger增强工具。URL能够定位资源,而URN不能。每个开发者都应该懂一点HTTP。所有的URL和URN都是URI。

2024-11-01 15:09:05 102

原创 URL与URI

两者都是对资源的唯一描述(在指定范围内),但URN只是对资源的描述,而通过URL可以直接找到资源。不知道你有没有注意到,上面描述REST规范的时候用的是URI,而不是我们更为熟悉的URL.现在我们知道,所有的URL和URN都是URI,那么,URL和URN有什么区别呢?我们先不管它们3个具体是什么,先来看看它们之间的关系,如图5-4所示。第1条是我们之前写的一个专利的线上地址,属于URL.由图5-4可知,URL和URN都是URI的子集。他是唯一的,并且可以通过它找到对应的专利信息。

2024-11-01 15:04:31 333

原创 解密REST

表现层状态转换”的说法比较抽象,实际上,“表现层”指的是“资源”的表现层(可能Roy Thomas Fielding觉得RREST看起来不如REST好看,所以省略了Resource)。前/后端分离,移动互联网的爆发,导致后端服务不仅要为Web端提供支持,还要为移动端(如Android,IOS等)提供支持,那么对API的设计就显得格外重要了。实际上,“资源”的范围比较宽泛,比如一个文件(图片,文档,音乐等),一条数据(用户信息,订单等)都可以被看作资源(每个资源都有一个对应URI)。

2024-11-01 11:57:30 796

原创 PGP加密安装操作

具体操作如图3.29所示,右击公钥test,选择“签名”,弹出“PGP签名秘钥”对话框,保持默认设置,单击“确定”按钮,在弹出的对话框中从自己的秘钥列表中选择签名秘钥(如ztg),输入设置ztg时的密码,单击“确定”按钮,公钥test就比变为"已校验“了(出现绿色的钩),表示该公钥有效。在虚拟机Windows10_1709_x86-2中,右击桌面上的PGPdiskztg.pgd文件,在弹出的快捷菜单中依次选PGP Desktop"-->"装载磁盘“选项,然后单击“确定”按钮,完成PGP磁盘的装载。

2024-10-31 19:52:02 1944

原创 接口代言人Swagger

除了Swagger的基础功能,knife4j还有很多增强功能,如全局参数,请求参数缓存,接口排序,导出离线文档等非常实用的功能。使用knife4jsh,记得删除之前的Swagger依赖,因为knife4j依赖已经包含了Swagger依赖。Swagger是一款用于生成,描述,调用和可视化RESTful风格的Web服务接口文档的框架。下面是每个接口的具体描述,如接口名字,参数名字,参数类似,是否必填等,还有返回的结果示例。单击对应的接口,可以看到接口的详细描述,还可以调用该接口,并查看返回值。

2024-10-31 12:48:08 596

原创 你应该懂一点HTTP

安全性与幂等性依赖于服务端实现,这种方式是一种契约,并不是说将一个删除操作的接口设置为GET请求(它依赖具备安全性),而是说对应类型的请求在实现的时候要符合它们的安全性,幂等性。安全性指的是不会对服务端造成影响,也就是说,如果一个方法是安全的,那么无论如何请求,服务端都不会因为这个请求而发生变化,简而言之就是只读。HTTP/1.0在之前版本的基础上增加了Header,状态码的支持,并且支持更多的HTTP方法,还加入了对多媒体格式和缓存的支持。

2024-10-31 08:43:09 881

原创 要点回顾20241031

Spring MVC接收参数的4中方式:无注解,@RequestParam,@PathVariable和RequestBody。Spring MVC的3个核心对象:Handler,HandlerMapping和HandlerAdapter。通过两个自定义拦截器学习了拦截器的运行原理,了解了多个拦截器安装先进后出的顺序执行,并通过分析源码进一步验证。MVC指的是模型(Model),视图(View)和控制器(Controller)常用的参数校验注解:@NotEmpty,@Min,@Email和@Past。

2024-10-31 08:16:02 158

原创 拦截器20231031

preHandle方法与afterCompletion方法总是成对出现的,一个拦截器的preHandle方法被调用后,afterCompletion方法必然也会被调用。通过控制台的输出信息,我们可以看到多个拦截器的执行顺序有些类似于数据结构中的栈——先进后出。突然一彪形大汉从树丛中窜出,面蒙黑巾,手持两把板斧,大喝道:“此山是我开,此树是我栽,要想从此过,留下买路财!现实生活中的很多场景都可以看到拦截器的“影子”,比如,我们上下班坐地铁这件事情,就好比拦截器的现实生活版。

2024-10-31 00:47:06 646

原创 什么是SQL

SQL不是某个特定数据库厂商专有的语言,绝大多数重要的DBMS支持SQL,所以学习此语言使你几乎能与所有数据库打交道。各个实现有自己的名称,如Oracle的PL/SQL,微软SQL Server用的Transact-SQL等。SQL虽然看上去很简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。与其他语言(如英语或Java,C,PHP这样的编程语言)不一样,SQL中只有很少的词,这是有意而为的。所有主要的DBMS,即使有自己的扩展,也都支持ANSI SQL.

2024-10-30 01:15:20 277

原创 原理分析20241029

不过,后来遇到段誉的“六脉神剑”,“斗转星移”就显得不太灵光了,可能是因为当年慕容;龙城创建“斗转星移”时,没有考虑“高并发”的业务场景(笔者注:宋朝时算力有限,6个请求就算上“高并发”了)。当年,慕容龙城(小说里的慕容先祖)凭借自创的“斗转星移”连扫地僧口中天下第一的武功“降龙十八掌”都能化解,足见其十分精妙。在现在的开发模式中,我们主要使用的也时Spring MVC的这一核心功能。Hadler是用来做具体事情的,对应的是Controller里面的方法。

2024-10-29 22:26:13 882

原创 参数校验20241029

Spring MVC对JSR-303具有良好的支持特性,在Spring Boot的加持下,更是“如鱼得水”,只需要引入一个Starter就可以获得参数校验的能力。同样地,如果系统不·进行参数校验,就会有不符合要求的数据进入系统,从而对系统造成破坏,所以要把号参数校验这一关。实际上,参数校验就好比乘坐高铁,飞机之前的安检,是保护系统的一道防线,而不符合要求的参数就好比违禁物品。除前文介绍的4个注解以外,好有一些比较常用的参数校验注解,如表4-5所示。在没有数据校验API之前,我们需要自己实现这些校验的代码。

2024-10-29 21:24:49 334

原创 接收参数的各种方式

上一章中的Hello World程序只是一个非常简单的例子,hello方法没有接收任何参数,而在实际应用中,我们需要处理各式各样的参数。相信聪明的你已经发现了,组合注解就是具有多个功能的注解,是由多个注解或一个注解与一个特定的属性值组成的注解,相当与对注解的一种封装。这里以Intellij IDEA的HTTP Client为例,在requestBody方法左侧有一个绿色图标,如图4-1所示。@RequestBody用来修饰参数,接收JSON格式的参数,经常应用AJAX请求,前/后端分离的场景下。

2024-10-29 15:54:14 631

原创 Spring MVC

如果你在非Spring Boot环境下配置Spring MVC,将更能体会到Spring Boot的简洁与高效(“,没有对比,就没有伤害”这个道理在技术圈也同样适用)。MVC模式是软件工程的一种的软件架构模式,把软件系统分为3个基本部分:模型(Model),视图(View)和控制器(Controller)其实,我们在上一章的Hello World示例中,已经使用Spring MVC了。这就是Spring Boot的“杀手锏”,它可以让你感觉不到它的存在。由它的名字可知,它是一款Web框架。

2024-10-29 13:40:14 254

原创 要点回顾3

Spring Boot采用Maven的工程结构,它们都遵循“约定优于配置”的原则。Starter整合了很多常用功能,可以减少大量重复性工作。Spring Boot只需5步就可以搭建一个Web工程。YAML是一种非常简洁,易读写的配置文件格式。

2024-10-29 13:21:57 91

原创 值得拥有的YAML

YAML(YAML Ain't Markup Language)是专门用来编写配置文件,其·设计宗旨是方便人类阅读与书写,所以相较于其他配置文件的常用格式(如XML,Properties,JSON等),它的结构更加简洁与清晰。Properties用来编写配置文件已经非常简单了,但是它有一个缺点,就是结构不够清晰,不能体现配置·项的相关性和层次。通过上面的例子,我们可以很容易地看出,YAML更加具有整体性和层次感,直观地体现了各个配置项之间的层次关系;同时,YAML的写法更加简洁。使用空格缩进表示层次关系。

2024-10-29 13:18:50 242

原创 珍爱生命,我用Starters

Spring将依赖按照不同的功能进行组合打包,你可以按照自己的需求进行选择,想要开发Web项目,就选择starter-web;假如小白意志坚强,经过不断“打怪升级”,积累经验,并将之前“踩过的坑”记录到自己的知识库中,那么以后每次用到的时候只需要施展“CV大法”即可。你可以将其添加到你的应用中,将会得到Spring及其相关技术的一站式服务,使你不比再将那些样板代码进行反复的复制,粘贴操作。计算机的“发烧友”都喜欢按照自己的喜好购买各个部件(CPU,显卡,主板,电源,机箱等),然后自己组装一台心仪的主机。

2024-10-29 12:44:37 530

原创 Spring Boot的工程结构

因为test就是为main服务的,理论上讲,main中的每一个Java类(POJO类除外)在test中都有一个测试类,可以理解成main中的每个类都有一个“贴身侍卫”,用来护其周全。我们知道,target是目标的意识,使用Maven打包后会将编译后的.class文件和依赖的Jar包,以及一些资源文件放到这个目录下。最后的src目录用来存放所有我们编写的Java源码文件,程序配置文件,资源文件等,是开发需要用到的主目录。这两个目录的用途很好理解,main用来存放业务逻辑主代码,而test则用来存储测试代码。

2024-10-29 11:13:36 335

原创 万物皆可Hello World

在Intellij IDEA中新建一个类很简单,可以按照图3-7所示,单击工具栏中的Java Class按钮(如果你的Intellij IDEA中没有这个按钮,可以参考2.3.1节进行设置)来创建一个HelloiController类,或者选择File-->New-->Java Class菜单命令来创建,或者直接右击对应的package(如com.shuijing.boot)来创建。好的,我知道你可以根本想不起来(或者说想不全)了,但这并不是你的错,因为Jar包实在太多,太琐碎了。

2024-10-29 10:51:49 531

原创 要点回顾2

Intellij IDEA比较好用的插件推荐,如Codota,Lombok,Maven Helper等。Intellij IDEA常用设置,如设置字体,显示行号,自动导入,自定义工具栏等。Intellij IDEA使用技巧,如历史剪切板,随心搜,自动写代码,重构等。Maven介绍相关概率讲解,如坐标,依赖,继承,构建。软件环境尽量与本书统一,经验丰富着除外。

2024-10-29 09:22:21 87

原创 打造一件趁手的兵器

接下来介绍PostFix,比如,我们想迭代一个名称为list的列表对象,输入list.for后按Tab键,IntellijIDEA就会自动生成列表的迭代代码,如图2-24所示。如图2-20所示,在代码编辑区内,如果文件内有错误(报红)或者警告(报黄),那么按F2键可以快速定位到问题的位置,然后按Alt+Enter快捷键就可以快速修复问题。将比较常用的操作添加到工具栏中,可以提升便利性,例如,图2-12中选择了Forward选项,那么新增操作的相应按钮会被添加到Forward操作相应的按钮后面。

2024-10-29 09:18:02 877

原创 若依自动化部署

第一部分要求同学们根据上学期学到的知识,梳理出一份部署思路,要求设计出来的脚步尽量要便捷,考虑全面,设计思路要包含逻辑框架。为了实现对ruoyi开源项目的自动化部署,需从环境准备,项目获取,配置修改,构建打包,部署启动等方面进行全面考虑。通过以上步骤,我们设计了一个全面的自动化部署方案,涵盖了从环境准备到项目启动的全过程。接下来,可以根据这个思路写具体的自动化部署脚本,实现对ruoyi开源项目的一键部署。该方案力求便捷,全面,充分考虑了部署过程中可能遇到的问题,并提供了相应的解决思路。

2024-10-23 23:17:38 417

原创 完成View与Controll之间的参数传递

你可以通过修改控制器和创建一个新的JSP页面来实现在界面中输入用户编码后,点击“提交”按钮,然后跳转到success.jsp页面,并在该页面上显示用户输入的编码。3.在界面中输入用户编码后,单击“提交”按钮,跳转到界面(WEB-INF/jsp/success.jsp),并在该界面输出上以界面中输入并提交的用户编码。3.在界面中输入用户编码后,单击“提交”按钮,跳转到界面(WEB-INF/jsp/success.jsp),并在该界面输出以上界面中输入并提交的用户编码。并返回名为success的视图。

2024-10-23 01:35:18 866

原创 什么是Spring MVC?202410220056

核心组件包括DispatcherServlet(前端控制器),Controller(控制器),HandlerMapping(处理器映射),View Resolver(视图解析器)等。Spring MVC是Spring框架中的一个模块,用于开发Web应用程序,基于MVC设计模型,将业务逻辑,视图和控制层分离。Spring MVC提供了清晰的分层结构,支持注解配置,便于开发,测试和维护,是企业级Java Web开发的重要工具之一。

2024-10-22 04:08:58 611

原创 简述Spring中的@Autowired注解的用途

Autowired是Spring框架中非常常用的注解,它大大简化了开发过程,减少了显示的Bean创建代码,从而提升的代码的简洁性和可维护性。通过@Autowired注解,Spring容器可以自动地将需要的依赖对象注入到目标类中,从而减少手动配置的复杂性,使开发更加简洁,易于维护。Spring容器在创建目标Bean时,会根据依赖对象的类型,查找容器中是否存在该类型的Bean,如果找到就进行注入。@Autowired的作用是通过Spring的依赖查找机制,根据类型找到匹配的Bean,然后自动注入依赖。

2024-10-22 00:56:15 606

原创 什么是依赖注入(DI)

依赖注入(Dependency,DI)是一种设计模式,用于减少组价之间的耦合性,让对象的创建和依赖关系管理由外部容器负责,而不是对象自身管理。通过DI,将类B的实例由外部容器(如Spring容器)传递给类A,而不是类A自己去创建类B的实例,这样就解决了上述的问题。在Spring框架中,IoC容器通过配置(XML或注解)来管理Bean的创建和依赖注入,是依赖注入的典型实现。在传统开发中,类A可以会直接创建它需要的类B的实例,这就意味着类A对类B有很强的依赖,也称为硬编码依赖。

2024-10-21 22:49:33 2138

原创 什么是Spring框架?202410211545

控制反转(IoC,Inversion of Control):Spring采用控制反射的方式管理对象的创建,生命周期和依赖注入,开发者无需手动管理对象间的依赖,从而简化了开发过程。Spring Boot:虽然不是Spring的核心模块,但它建立在Spring框架之上,旨在简化Spring应用的配置和部署,提供了一种快速开发Spring应用的方式。广泛的生态系统:Spring具有庞大的生态系统,涵盖了从数据访问,事务管理,安全性,到微服务等多个方面,使得它成为企业级Java开发的首选框架。

2024-10-21 16:56:31 771

原创 GET和POST请求的区别是什么?202410210032

尽管GET和POST的功能看似相似,都可以用来向服务器发送数据,但它们在使用场景,传输方式,安全性,以及缓存等方面存在显著的区别。POST请求 适用于提交数据或修改服务器数据,数据在请求体中传输,更安全且数据量没有限制,因此适合提交表单,上传文件等操作。GET请求适用于从服务器获取数据,数据被附加在URL中,容易暴露,数据量有长度限制,因此不适合传递敏感信息和大数据量。GET请求是幂等的:即无论请求发送多少次,服务器的数据状态应保持一致,GET请求只是查询,不应改变服务器的数据。

2024-10-21 15:45:20 356

原创 第11章初始Spring MVC框架

Spring MVC(Model-View-Controller)是Spring框架的一部分,是用于构建基于Web的Java应用程序的模块。它实现了经典的MVC设计模式。将应用程序逻辑分为三个主要部分:模型(Model),视图(View)和控制器(Controller),以实现业务逻辑和显示逻辑的分离。Spring MVC使用了“松耦合”的方式,通过依赖注入实现各个组件的解耦,提高了系统的可维护性和可扩展性2.MVC设计模式:保存应用程序的状态和数据,例如数据库信息。

2024-10-14 22:22:46 612

原创 Spring框架中的Bean

适合于配置比较复杂,需要分离配置文件的情况简化开发,适用于开发时直接用注解标识更加灵活,适用于需要复杂依赖和程序化配置的场景你可以根据项目的需求和团队的规范选择最合适的配置方式。最常见的方式,适合大多数场景使用静态工厂方法创建对象,适用与对实例化过程有特定要求的情况通过实例方法来创建对象,适用于需要工厂类管理实例化的场景实现复杂实例化逻辑,适用与需要控制复杂对象创建的场景避免在应用启动时创建Bean,适用与非必要的单例Bean适合依赖关系较为明确且必须的情况下使用适合较为灵活,可选的依赖关系注入。

2024-10-14 05:06:05 861

原创 Java并发常见面试题总结(中)

JDK1.6对synchronized做了多种优化,以提高其性能,主要包括偏向锁,轻量级锁,重量级锁,自旋锁等,并支持锁的升级和降级机制。这些优化使得在不同的竞争情况下,锁的开销能够得到有限控制,从而提高并发性能。通过这些机制的改进,synchronized在JDK1.6之后的性能显著提升,已经可以和ReetrantLock相媲美,甚至在某些场景下表现得更好。因此,在日常开发中,对于简单的同步操作,synchronized仍然是一个非常好的选择。公平锁按照请求的顺序来分配锁,即“先来先得”。

2024-10-13 16:43:11 897

原创 Java并发常见面试题总结(上)20241008

由于绿色线程和原生线程比起来在使用时有一些限制(比如绿色线程不能直接使用操作系统提供的功能如异步I/O,只能在一个内核线程上运行无法利用多核),在JDK1.2及以后,Java线程改为基于原生线程(Native/Threads)实现,也就是说JVM直接使用操作系统原生的内核级线程(内核线程)来实现Java线程,由操作系统内核进行线程的调度和管理。为什么JVM没有区分这两种状态呢?3.使用线程安全的数据结构:许多编程语言和库提供了内置的线程安全数据结构,如Java的ConcurrentHashMap等。

2024-10-10 19:27:40 655

原创 SpringBoot最经常拷问的题

配置MessageSourceBean,创建不同语言的资源文件(如message_en.properties,messages_zh.properties),在代码这使用@Autowired的MessageSource进行消息获取,并通过LocalResolver管理区域设置。@SpringBootApplication:这是一个组合注解,包含了@EnableAutoConfiguration,@CompnenetScan和@Configuration,通常用于SpringBoot的主类,简化配置。

2024-10-09 23:23:11 528

原创 两数之和20241008

这样我们创建一个哈希表,对于每一个x,我们首先查找哈希表中是否存在target-x,然后将x插入到哈希表中,即可保证不会让x和自己匹配。当我们使用遍历整个数组的方式寻找target-x时,需要注意到每一个位于x之前的元素都已经和x匹配过,因此不需要再进行匹配。时间复杂度:O(N),其中N是数组中的元素数量,对于每一个元素x,我们可以O(1)地寻找target-x.最容易想到的方法是枚举数组中的每一个数x,寻找数组中是否存在target - x.时间复杂度:O(n^2),其中N是数组中的元素数量。

2024-10-08 22:14:16 208

原创 Java集合使用注意事项总结

绝大部分我们使用的集合的size()方法的时间复杂度也是O(1),不过,也有很多复杂度不是O(1)的,比如java.util.concurrent包下的某些集合(ConcurrentLinkedQueue,ConcurrentHashMap...)Arrays.asList()方法返回的并不是java.util.ArrayList,而是java.util.Arrays的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法。

2024-10-08 13:03:32 560

原创 Java集合常见面试题总结(下)

HashMap通过key的hashcode经过扰动函数处理后得到hash值,然后通过(n-1)&hash判断当前元素存放的位置(这里的n指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的hash值以及key是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。单线程环境下,不存在一个线程操作该HashMap时,其他的将该HashMap修改的情况,所以可以通过contains(key)来做判断是否存在这个键值对,从而做相应的处理,也就不存在二义性问题。

2024-10-08 00:32:07 1559

原创 redis使用场景-缓存-数据淘汰策略20241007

3.如果业务中有置顶的需求,可以使用volatile-lru策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其它设置过期时间的数据。2.如果业务中数据访问频率差别不大,没有明显的冷热数据区别,建议使用allkeys-random,随机选择淘汰。1.数据库有1000万数据,Redis只能缓存20w数据,如何保证Redis中的数据都是热点数据?使用allkeys-lru(挑选最近最少使用的数据缓存)淘汰策略,留下来的都是经常访问的热点数据。如果业务有明显的冷热数据区别,建议使用。

2024-10-07 11:02:17 243

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除