自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

57

  • 博客(127)
  • 资源 (3)
  • 收藏
  • 关注

原创 SpringCloud使用学习

遇见狂神说的视频笔记:原视频连接、笔记连接准备微服务案例学习,结构:Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务。结构:父工程(Project)的3个子模块(Module):springcloud-api 【封装的整体entity/接口/公共配置等】 springcloud-consumer-dept-80 【服务提供者】 springcloud-provider-dept-8001 【服务消费者】 构建父工程pom.

2021-08-09 00:12:00 182

原创 微服务SpringCloud的前置知识复习

前置知识路线:spring ——> spring Boot ——> spring cloudSpring Boot与Spring Cloud——参考文章 Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务; Spring Cloud是基于Spring Boot实现的; Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架; Spr...

2021-08-08 19:06:39 494

原创 微服务(认识微服务)

微服务是什么可以从这篇文章中可以理解微服务为什么会兴起及其微服务的作用。微服务架构是将单一的应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间采用轻量级通信机制。服务围绕着业务能力构建,可通过全自动部署机制独立部署。服务的管理应采用最小的集中管理,服务可以用不同的语言开发,使用不同的数据库存储技术。---- Martin Fowler发现微服务架构的几个特点:每个服务运行在自己的进程中; 微服务之间采用轻量级通信; 服务围绕着业务能力构建; 全自动部署机制独立部署;

2021-08-01 23:31:36 232

原创 31. 下一个排列(Letcode)

题目31. 下一个排列实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3→1,3,23,2,1→1,2,31,1,5→1,5,1解题思路降序的下一个排序是升序,例如3 2 1 -> 1 2 3,可以从这个角度去思考这个问题。改变顺序如下:4 5 2 6 3 ...

2020-11-10 18:47:48 166

原创 MySQL面试总结

1、MySQL的索引有了解吗?(重点掌握)索引的核心思想是分治,是对数据库数据排序分页后,存储每页第一个数据部分字段信息一种结构,利用索引可以快速的访问到页面,然后根据页目录找到数据。InnoDB索引的存储数据结构是B+树来实现的。(1)“为什么底层数据结构使用B+树,而不是B树?”B+树是B树的变种,B+树的非叶子节点只用来保存索引,不存储数据,所有的数据都保存在叶子节点;而B树的非叶子节点也会保存数据。这样就使得B+树的查询效率更加稳定,均为从根节点到叶子节点的路径。 B+树的内部结点并没

2020-08-20 11:38:35 252

原创 网络协议

1、OSI的七层模型?应用层:通过进程间的网络交互,完成特定的网络应用。信息分组为报文;在上面的协议:HTTP\HTTPS\DNS等表示层:对数据格式化、编码、解码等;会话层:管理会话;传输层:提供统一的数据传输服务,应用层通过传输层的服务进行数据的传输。将报文分组为报文段;TCP/UDP网络层:选择合适的网间路由或交换节点,确保数据及时送达。将报文段分组成为数据报。IP链路层:从一个节点传输到下一个节点;将数据报分组为帧;物理层:进行字节流传输;2、TCP/IP协.

2020-08-20 09:03:58 272

原创 MyBatis面试知识

1、Mybatis是什么?Mybatis是一个封装了JDBC的ORM框架,只需要关注SQL语句的本身,不需要关注加载驱动、创建连接等,并且还支持动态SQL。2、MyBatis的核心组件有哪些?MyBatis的核心组件包括SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession和Mapper。下边我们依次介绍。SqlSessionFactoryBuilder是一个构建器,通过XML配置文件或者Java编码获得资源来构建SqlSessionFac

2020-08-19 12:15:38 208

原创 Spring面试知识

1、说一下控制反转(IOC)个人的理解:IOC也叫控制反转,是一个工厂,工厂的目的是将对象的创建与使用分离开来,核心应用反射,实现这样解耦。在Spring中,就是将对象交由Spring容器管理,通过注解@Autowired和@Resource表示从Spring容器中找对应的对象,进行当前对象的注入,这样就实现依赖关系。注解就是一种标记,表示具备什么样的属性,比如:是被Spring进行管理的、通过Spring注入的。被注入的对象必须被下边的四个注解之一标注:@Controller @Se

2020-08-19 10:53:43 138

原创 Java面试总结——Java并发

1、进程与线程的区别:(重点掌握)答:进程与线程之间的主要区别可以总结如下。进程是一个“执行中的程序”,是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,一个进程中一般拥有多个线程。线程之间共享地址空间和其它资源(所以通信和同步等操作,线程比进程更加容易) 线程一般不拥有系统资源,但是也有一些必不可少的资源(使用ThreadLocal存储) 线程上下文的切换比进程上下文切换要快很多。知识点:线程上下文切换比进程上下文切换快的原因,可以总结如下:进程切换时,涉及到当前进程的

2020-08-18 20:47:07 201

原创 Java核心技术面试总结——Java基础

1、面向对象可以解释下吗?都有那些特性?面向对象是对现实的理解和抽象的一种软件开发方法,具有封装、继承与多态的特性。封装:将事物封装成一个类,较少耦合,隐藏细节。保留特定的接口与外界联系,当接口内部发生改变时,不会影响外部调用方法。继承:已知类的派生新的类,新类拥有已知类的属性或方法,可以通过覆写来增强已知类的功能。多态:一个程序中存在多个同名的不同方法,通过三种方式实现:|- 重载:在一个类中对方法进行重载实现。|- 覆写:子类对父类的覆写实现。|- 转型:将子类对象作为父类对

2020-08-18 16:08:52 448

原创 详解MySQL索引

局部性原理:空间局部性、时间局部性索引是帮助MySQL高效获取数据的数据结构。索引存储在文件系统,需要考虑IO的量、次数。索引的存储文件形式与存储引擎有关,存储引擎不同的数据文件在磁盘上的组织形式。索引文件的结构:hash、二叉树、B树、B+树。END...

2020-07-31 17:27:50 144

原创 详解MySQL事务与锁

事务:一组SQL语句,要么全部成功要么全部失败。事务的特点(ACID):原子性的保证:undolog,回滚日志持久性:redo,日志,beinlog原子性MySQL日志:bin log、undo log、redo log、relay log、error log、慢日志。持久性原理:Redo logundo log 需要落盘redo log(要落盘): 如图,0:MySQL挂了,会丢数据1: 不会丢,最安全,效率比较低。2:M...

2020-07-31 16:56:47 127

原创 设计模式:单例设计、工厂模式、代理设计模式

目录OPP七大原则创建型模式单例设计模式工厂模式结构型模式代理设计模式行为型模式OPP七大原则创建型模式单例设计模式控制对象实例化产生个数的设计操作。核心:构造方法私有化。Single类只允许产生一个实例化对象。过程:1、Single的构造方法私有化。2、在Single中定义该类的实例化对象,并封装,并使用final确保只能实例化一次。sychronized和volatile多线程中保证安全。3、定义一个static方法用于外部获取该实例.

2020-07-26 11:41:54 163

原创 为什么使用redis?什么是缓存穿透?布隆过滤器是什么? 什么是缓存击穿? 什么是缓存雪崩? redis集群是什么?hash一致性算法?

目录为什么使用redis?什么是缓存穿透?布隆过滤器是什么?什么是缓存击穿?什么是缓存雪崩?redis集群是什么?hash一致性算法?为什么使用redis?什么是缓存穿透?布隆过滤器是什么?从客户端发出大量的请求到Tomcat,Tomcat再到数据库,在Tomcat到数据库容易达到瓶颈。解决:1、创建一个数据库连接池,已成为一个标配,但是效果不大;2、使用redis减轻数据库的压力,redis存放热门数据;选择2,当一个请求到来时先去redis中找,没找到才去数据库中找;

2020-07-25 20:36:15 170

原创 动态规划题目练习

线性规划区间规划约束01背包问题

2020-07-18 17:11:57 147

原创 Spring applicatinContext配置文件 、Annotation配置、资源文件读取、Resource通配符

applicatinContext配置文件内部Beanhttps://blog.csdn.net/qq_41723615/article/details/89143803使用P命名空间https://blog.csdn.net/qq_41723615/article/details/89144396Bean配置加强https://blog.csdn.net/qq_41723615/article/details/89146576自动装配https://blog.csdn.ne

2020-07-16 11:59:42 167

原创 LetCode高频题

目录3. 无重复字符的最长子串(快慢指针、哈希表)4. 寻找两个正序数组的中位数3. 无重复字符的最长子串(快慢指针、哈希表)线性:class Solution { public int lengthOfLongestSubstring(String s) { int max = 0 ; Set<Character> set = new HashSet<Character>() ; for(in...

2020-07-14 21:24:26 145

原创 二分搜索算法与贪婪算法

目录二分搜索贪婪算法LetCode二分搜索代码34. 在排序数组中查找元素的第一个和最后一个位置二分搜索贪婪算法LetCode二分搜索代码public class Solution { public static void main(String[] args) { int[] nums = new int[] {0,1,2,3,4,5,6,

2020-07-13 13:49:57 841

原创 动态规划定义、分类、Letcode题目

什么是动态规划?300. 最长上升子序列递归解法:加入备忘录:非递归第一个难点,不仅是为了避免重复计算,也是推导状态转移方程的关键,这个难点解决了,状态转移方程呼之欲出了。考虑这个难点时,往往是将问题规模缩小的过程中进行的,一个有效的思考方法:不妨假设已经有人将所有子问题的最佳结果计算出来了,留下的问题只有一个:如果根据这些子问题的结果得出最终的答案。LetCode70、300、198 中看i个状态时,i是...

2020-07-11 09:47:20 195

原创 深度优先搜索(DFS)与广度优先搜索(BFS)、LetCode题目

目录DFSBFSDFS注标记是否访问过方法:1、直接修改输入的数据 2、利用额外的数据结构(矩阵或hash表)Step4: 判断是否访问过 和 抵达目的地,访问过就不尝试,抵达目的地返回trueBFS...

2020-07-10 12:02:30 223

原创 高级数据结构

优先队列向上:新增节点向下:堆顶被取初始化大小为n的堆,时间复杂度:O(n)LetCode:347. 前 K 个高频元素class Solution { public static int[] topKFrequent(int[] nums, int k) { int[] result = new int[k]; Map<Integer, Integer> map = new HashMap<Integer, Integer>

2020-07-09 16:01:13 165

原创 详解线程池:过程、六种线程池、阻塞队列、CPU核心数与线程数、拒绝策略

使用线程池比手动创建线程好在哪里?手工创建线程,每一个任务都创建线程问题:第一点,反复创建线程系统开销比较大,每个线程创建和销毁都需要时间,如果任务比较简单,那么就有可能导致创建和销毁线程消耗的资源比线程执行任务本身消耗的资源还要大。 第二点,过多的线程会占用过多的内存等资源,还会带来过多的上下文切换,同时可能导致系统的线程数量上限。线程池的解决思路:针对反复创建线程开销大的问题,线程池用一些固定的线程一直保持工作状态并反复执行任务。 针对过多线程占用太多内存资源的问题,线程池会根据需要创

2020-07-05 11:57:16 2199

原创 排序问题

目录冒泡排序插入排序归并排序快速排序堆排序性能分析总结衡量一个排序算法的优劣,主要会从以下 3 个角度进行分析:1.时间复杂度,具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度。2.空间复杂度,如果空间复杂度为 1,也叫作原地排序。3.稳定性,排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。冒泡排序从第一个数据开始,依次比较相邻元素的大小。如果前者大于后者,则进行交换操作,把大的元素往后交换。通过多轮迭代,直到没有交换操作

2020-07-04 20:59:00 2351

原创 控制反转 IOC 、Spring依赖注入DI

控制反转 IOC以一个例子来观察控制反转:1、创建一个web项目,添加Spring支持,选择创建application文件;2、定义一个接口与接口子类;3、配置application.xml文件4、测试需要使用到的类:1.ApplicationContext类(应用上下文类):org.springframework.context.ApplicationContext所有在applicationContext.xml文件中配置的信息都需要通过此类读取才可以。常用方法:

2020-07-04 18:53:14 89

原创 3类线程安全、线程安全应用场景、性能问题

https://kaiwu.lagou.com/course/courseInfo.htm?courseId=16#/detail/pc?id=2443 类线程安全问题?线程安全问题主要有 3 种,i++ 等情况导致的运行结果错误,通常是因为并发读写导致的,第二种是对象没有在正确的时间、地点被发布或初始化,而第三种线程安全问题就是活跃性问题,包括死锁、活锁和饥饿。详解:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=16#/detai..

2020-07-03 21:39:16 759

原创 为什么 wait 方法必须在 synchronized 保护的同步代码中使用? 为什么 wait/notify/notifyAll 被定义在 Object 类中,而 sleep 定义在 Thread

目录为什么 wait方法必须在 synchronized保护的同步代码中使用?为什么 wait/notify/notifyAll 被定义在 Object 类中,而 sleep 定义在 Thread 类中?wait/notify 和 sleep 方法的异同?为什么 wait方法必须在 synchronized保护的同步代码中使用?例如:生产者消费者模型classBlockingQueue{Queue<String>buffer=newLi...

2020-07-03 20:42:33 902

原创 部分机器学习算法理论推导:逻辑回归 梯度下降 牛顿法 奇异值分解(SVD) 距离 集成学习 决策树 推介算法

目录逻辑回归梯度下降牛顿法奇异值分解(SVD)距离集成学习决策树推介算法逻辑回归目标处理分类问题,二分类的概率预测输出,通过OVA可以用于多分类。OAV将预测的多个类别看作目标类与其他类,两类。原理损失函数只有一个局部最优值,因为损失函数是一个连续凸函数。可解释性:θ的每个元素可以解释为,对结果的贡献的大小。b(x恒为1),b=0,可以判断正负判断是均匀的,b>0说明更容易分为正类。梯度下降牛顿法奇异值分解(SVD)

2020-07-03 17:24:00 403

原创 权重森林

决策树是应用广泛的算法。一个包含一个特征的决策树,是在该特征空间上的一维划分,划分的每个区间里包含的类别,即为分类的类别。在决策树中剪枝的各种剪枝策略,使用决策树中组合的随机森林与GBDT等各种算法,都能在机器学习中占有举足轻重的地位。这些算法的学习特征,都是来源于决策树中每个特征的一维空间的划分。这些算法本质上都是从每个特征划分的一维空间,组成的高维空间中提取有用的信息。例如,用样本数据中的特征,每一个特征建立一颗决策树,这样就可以得到每个特征的一维空间划分,所有一维空间组成的高维空间,就是算法求解...

2020-07-03 17:11:41 232

原创 详解CMS

CMS 的全称是 Mostly Concurrent Mark and Sweep Garbage Collector(主要并发­标记­清除­垃圾收集器),它在年轻代使用复制算法,而对老年代使用标记-清除算法。CMS 的设计目标,是避免在老年代 GC 时出现长时间的卡顿。如果你不希望有长时间的停顿,同时你的 CPU 资源也比较丰富,使用 CMS 是比较合适的。CMS 使用的是 Sweep 而不是 Compact,所以它的主要问题是碎片化。随着 JVM 的长时间运行,碎片化会越来越严重,只有通过...

2020-07-02 11:49:40 1385 1

原创 分治法核心思想、经验总结、二分查找案例

目录分治法二分查找经验与总结分治法计算机求解问题所需的计算时间,与其涉及的数据规模强相关。简而言之,问题所涉及的数据规模越小,它所需的计算时间也越少;反之亦然。分治法的核心思想是“分而治之”,当你需要采用分治法时,一般原问题都需要具备以下几个特征: 难度在降低,即原问题的解决难度,随着数据的规模的缩小而降低。这个特征绝大多数问题都是满足的。 问题可分,原问题可以分解为若干个规模较小的同类型问题。这是应用分治法的前提。 解可合并,利用所有子问题的解,可合并出原

2020-07-01 10:22:17 630

原创 垃圾回收的步骤?垃圾回收算法有哪些?各自的优劣?HotSpot 垃圾回收器

JVM 中有哪些垃圾回收算法?它们各自有什么优劣?CMS 垃圾回收器是怎么工作的?有哪些阶段?服务卡顿的元凶到底是谁?按照语义上的意思,垃圾回收,首先就需要找到这些垃圾,然后回收掉。但是 GC 过程正好相反,它是先找到活跃的对象,然后把其他不活跃的对象判定为垃圾,然后删除。所以垃圾回收只与活跃的对象有关,和堆的大小无关。垃圾回收的步骤标记(Mark)使用可达性分析找到活跃对象,并标记。如图:清除(Sweep)将未被标记的对象回收掉。如图:图中的清...

2020-06-30 20:50:57 382

原创 递归:如何利用递归求解汉诺塔问题?回溯:组合总和、N皇后

目录递归的算法思想汉诺塔问题递归的基本思想就是把规模大的问题转化为规模小的相同的子问题来解决。 在函数实现时,因为大问题和小问题是一样的问题,因此大问题的解决方法和小问题的解决方法也是同一个方法。这就产生了函数调用它自身的情况,这也正是递归的定义所在。递归的算法思想递归的数学模型其实就是数学归纳法。一个常见的题目是:证明当 n 等于任意一个自然数时某命题成立。当采用数学归纳法时,证明分为以下 2 个步骤: 证明当 n = 1 时命题成立; 假设 n = m 时命题

2020-06-30 15:20:43 497

原创 哈希的核心思想?哈希表函数有哪些?哈希冲突怎么解决?哈希的优缺点?

目录哈希的核心思想?哈希表函数有哪些?哈希冲突怎么解决?开放定址法链地址法再哈希法建立公共溢出哈希的优缺点?哈希的核心思想?线性表和树数据的存储位置和数据的具体数值之间不存在任何关系。因此,在面对查找问题时,这些数据结构必须采取逐一比较的方法去实现。而哈希表的设计采用了函数映射的思想,将记录的存储位置与记录的关键字关联起来。这样的设计方式,能够快速定位到想要查找的记录,而且不需要与表中存在的记录的关键字比较后再来进行查找。如果有一种方法,可以实现“地址 = .

2020-06-30 12:23:36 1266

原创 二叉树、 树的遍历操作、 二叉查找树 、 Trie 树(字典树)

目录二叉树树的遍历操作二叉查找树Trie 树(字典树)总结二叉树在二叉树中,有下面两个特殊的类型,如下图所示: 满二叉树,定义为除了叶子结点外,所有结点都有 2 个子结点。 完全二叉树,定义为除了最后一层以外,其他层的结点个数都达到最大,并且最后一层的叶子结点都靠左排列。 存储二叉树有两种办法,一种是基于指针的链式存储法,另一种是基于数组的顺序存储法。 链式存储法,也就是像链表一样,每个结点有三个字段,一个存储数据,另外两个分别存放指向左右子结点的指

2020-06-30 11:52:16 463

原创 栈与队列的基本概念、应用、LetCode真题

栈的基本概念栈是什么线性表增加和删除操作限制在一端进行,就被称为栈。那为什么要使用栈?其实,单纯从功能上讲,数组或者链表可以替代栈。然而问题是,数组或者链表的操作过于灵活,这意味着,它们过多暴露了可操作的接口。这些没有意义的接口过多,当数据量很大的时候就会出现一些隐藏的风险。一旦发生代码 bug 或者受到攻击,就会给系统带来不可预知的风险。虽然栈限定降低了操作的灵活性,但这也使得栈在处理只涉及一端新增和删除数据的问题时效率更高。具体而言,栈的数据结点必须后进先出。后进的意思是,栈的数据新

2020-06-30 10:37:07 329

原创 线程六种状态之间的转换

线程的六种状态:New新建New 表示线程被创建但尚未启动的状态:当我们用 new Thread() 新建一个线程时,如果线程没有开始运行 start() 方法,所以也没有开始执行 run() 方法里面的代码,那么此时它的状态就是 New。而一旦线程调用了 start(),它的状态就会从 New 变成 Runnable,也就是状态转换图中中间的这个大方框里的内容。Runnable 可运行Java 中的 Runable 状态对应操作系统线程状态中的两种状态,分别是 Runn...

2020-06-29 20:44:19 447

原创 GC怎么判断对象可以被回收?GC Roots有那些? 什么是强引用、软引用、弱引用、虚引用?OOM引起的原因?

目录GC怎么判断对象可以被回收?GC Roots有那些?什么是强引用、软引用、弱引用、虚引用?OOM引起的原因?GC怎么判断对象可以被回收?GC Roots可达性分析法:从GC Roots向下搜索、追溯,当一个对象不再和任何的一个GC Root产生关系,就会被判定为垃圾。如图中的 Obj5、6、7,被判定为垃圾。GC Roots有那些?大体上可以分为三类: 活动线程相关的各种引用,例如:栈帧相关的各种引用 类的静态变量的引用 JNI的引用

2020-06-29 14:12:10 594

原创 命令行查看字节码文件、字节码运行流程案例分析

命令行查看字节码文件class B{ private int a = 1234; static long c = 1111; public long test(long num) { long ret = this.a + num + c ; return ret ; }}public class A { private B b = new B() ; public static void main(String[] args) { A a = new A(); lon

2020-06-29 12:17:45 690

原创 类加载过程? Java怎么保证核心API不被篡改? 打破双亲委派机制的案例

我们首先看几个面试题。我们能够通过一定的手段,覆盖 HashMap 类的实现么? 有哪些地方打破了 Java 的类加载机制? 如何加载一个远程的 .class 文件?怎样加密 .class 文件? <cinit> 方法和 <init> 方法有什么区别?类加载过程JVM 通过加载 .class 文件,能够将其中的字节码解析成操作系统机器码。那这些文件是怎么加载进来的呢?又有哪些约定?加载过程如图:注:几种变量的关系:1、加载将外部的 .class 文

2020-06-28 17:29:41 902

原创 为什么不强制停止? 如何用 interrupt 停止线程? 休眠阶段是可以感受中断的?怎么处理呢(避免屏蔽中断)? 为什么用 volatile 标记位的停止方法是错误的?

目录为什么不强制停止?而是通知、协作如何用 interrupt 停止线程?休眠阶段是可以感受中断的?怎么处理呢(避免屏蔽中断)?为什么用 volatile 标记位的停止方法是错误的?线程操作方法:为什么不强制停止?而是通知、协作对于 Java 而言,最正确的停止线程的方式是使用 interrupt。但 interrupt 仅仅起到通知被停止线程的作用。而对于被停止的线程而言,它拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间后停止,也可以选择压根不停止。比如:线

2020-06-28 13:13:33 236

权重森林的论文与代码.zip

 权重森林是一种集成学习算法,为每一颗由一个特征生成的树,对目标的每个类别的预测值赋予一个权重。权重森林的权重,由权重矩阵和全连接的权重两部分组成,使用不同的方法更新两种权重。实验表明,在CICD2017数据集上权重森林泛化性能强于随机森林。

2020-07-03

loginProject.zip

用户登录案例 所有的系统里面用户登录是一定需要具备的功能,在实际开发之中,用户的登录处理需要牵扯到角色、权限分配等概念,本次并不考虑这些。 用户信息保存在数据库里面,需要自己创建一张用户表(member),用于保存mid(作为主键),password。

2020-06-10

DAOProject.zip

DAO案例代码,整个业务的核心在于后台业务层,业务层是整个程序提供的操作功能,而一个业务要想完成需要多个数据层的操作一起共同完成,而数据层的操作只是一个个原子性的数据库开发。

2020-06-07

空空如也

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

TA关注的人

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