- 博客(42)
- 收藏
- 关注
转载 Spring AOP使用
AOP(Aspect Oriented Programming),面向切面思想,是Spring的三大核心思想之一(两外两个:IOC-控制反转、DI-依赖注入)。那么AOP为何那么重要呢?在我们的程序中,经常存在一些系统性的需求,比如权限校验、日志记录、统计等,这些代码会散落穿插在各个业务逻辑中,非常冗余且不利于维护。例如下面这个示意图:有多少业务操作,就要写多少重复的校验和日志记录代码,这显然是无法接受的。
2025-03-03 10:30:57
46
原创 mybatis-plus模板引擎代码生成
Gradle依赖:dependencies { // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter implementation 'org.springframework.boot:spring-boot-starter' // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot
2024-07-19 15:08:33
950
原创 Springboot使用WebSocket发送消息
调用WebSocketHandlerRegistry 的addHandler方法传递处理器和路径。再调用WebSocketHandlerRegistry 的setAllowedOrigins方法传递星号,允许跨域访问。在MyWsHandler中,handleTextMessage方法使用的是单播发送消息,如果要给客户端/浏览器端发送广播消息该如何发送呢,只需遍历所有客户端/浏览器端的Session即可,通过Session广播消息。setAllowedOrigins()方法设置允许源,传递星号,否则跨域。
2024-07-07 15:41:26
849
原创 Excel文件处理工具类
实体:添加上@Excel注解@Data@TableName("location_data")@Schema(description = "库区垛位管理表(location_data)")@Accessors(chain = true)public class LocationData implements Serializable { @Serial private static final long serialVersionUID = 1L; @TableId(val
2024-06-05 08:41:16
205
原创 MySQL索引的失效与优化
在大多数情况下,我们习惯使用默认的 InnoDB 作为表存储引擎。在使用 InnoDB 作为存储引擎时,创建的索引默认为 B+ 树数据结构,如果是主键索引,则属于聚族索引,非主键索引则属于辅助索引。基于主键查询可以直接获取到行信息,而基于辅助索引作为查询条件,则需要进行回表,然后再通过主键索引获取到数据。如果只是查询一列或少部分列的信息,我们可以基于覆盖索引来避免回表。覆盖索引只需要读取索引,且由于索引是顺序存储,对于范围或排序查询来说,可以极大地极少磁盘 I/O操作。
2024-05-10 11:22:39
598
原创 慢SQL语句诊断分析和优化
在开发中,我们要尽量写出高性能的 SQL 语句,但也无法避免一些慢 SQL 语句的出现,或因为疏漏,或因为实际生产环境与开发环境有所区别,这些都是诱因。面对这种情况,我们可以打开慢 SQL 配置项,记录下都有哪些 SQL 超过了预期的最大执行时间。
2024-05-09 15:26:10
1083
原创 SpringBoot使用Gradle构建多模块项目
Gradle由于构建速度比Maven快,且比Maven灵活,因此很多后端的应用都使用了Gradle进行构建,但一个问题是,Gradle的多模块项目比较难构建,再加上Gradle的更新非常快,这就给构建一个多模块Gradle项目造成了不少的困难。的方式来构建一个多模块项目。
2023-12-01 11:57:58
1711
原创 上传本地项目到GitLab
在团队项目开发中,我们一般都是通过拉取别人的项目代码到本地中,但是如果是自己新建一个项目后,如何让别人拉取你的代码呢,这就涉及到将自己的本地项目放到远程中供别人拉取自己的项目代码。gitlab仓库拿到之前建的项目的地址,然后建立本地仓库和远端gitlab仓库关系:.2.在gitLab上创建新工程后,然后接下来将本地的项目代码上传到远程。然后进入到项目文件夹里面,鼠标右击,点击GIt bash here。1.首先在gitlab上创建一个空项目。
2023-03-29 17:06:52
3569
原创 spring boot集成swagger2版本和swagger3版本
访问网址:http://localhost:8080/swagger-ui/访问网址:http://localhost:8080/doc.html。
2022-08-03 10:40:09
930
原创 以空间换时间的基数排序
Java排序之基数排序(Radix Sort)基数排序介绍基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是 1887 年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然
2021-05-08 18:12:18
271
原创 java实现树的递归与非递归遍历
树的递归与非递归遍历基于树的递归遍历,其基本思想简单,从代码可以看出遍历根节点和左右子树的先后顺序,代码如下所示:import java.util.ArrayList;import java.util.Collections;public class RecusionBinaryTreeTraverse { public static void main(String[] args) { TreeNode root = BuildTree.buildTree();
2021-05-05 18:02:42
453
原创 详解java排序、查找和哈希表算法
java排序及查找算法汇总排序1)内部排序:指将需要处理的所有数据都加载到**内部存储器(内存)中进行排序。2)外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)**进行排序。3)常见的排序算法分类:(一)冒泡排序1.算法思想:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列
2021-03-03 17:42:37
322
1
原创 Java排序之归并排序
归并排序package Algorithm;import java.util.Arrays;//归并排序public class Demo6 { public static void main(String[] args) { int[] arr = {8, 4, 5, 7, 1, 3, 6, 2}; int[] temp = new int[arr.length]; mergeSort(arr, 0, arr.length - 1, te
2020-12-15 17:34:06
134
2
原创 Java排序之快速排序
快速排序快速排序介绍: 它是对冒泡排序的一种改进。其基本思想是:选定一个数值,通过一趟排序将要待排序的数据分割成独立的两部分,其中一部分的所有数据要比选定的值要小。另外一部分的所有数据要比选定的值要大,然后再按此方法对这两部分的数据再进行分割,再排序。整个排序的过程可以递归进行,以此达到整个数据变成有序序列。如下图是排序算法的示意图:从图看以看出,每次选定一个基准值,将数据分成两个部分,左边的部分比基准值小,右边的部分比基准值大,不断的循环此过程,最终得到多个有序序列,再将这些有序序列合并起来,就是
2020-12-11 14:02:23
193
1
原创 Java排序之希尔排序
希尔排序引入:前面的博客已经讲了插入排序,插入排序的思想是将一个待排序数组分成有序和无序的两部分,每次从无序部分中选择一个数插入到有序组数中合适的位置,由于每次插入的过程中都要和已经有序中的数作比较,来确定合适的插入位置,因此当插入的数较小时,那么就会和前面已经有序的数比较的次数较多,因此针对插入排序的缺点,提出了希尔排序。下面将着重讲解希尔排序的思想和原理实现过程。希尔排序思想:希尔排序又称缩小增量排序,它的基本思想是将待排序数分成若干组,对每一组采用直接插入排序,再将排好序的若干组再分组,并且每次分
2020-12-10 21:15:42
135
原创 Java排序之插入排序
插入排序介绍:插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序的算法思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,找到一个在有序表中正确的插入位置,使之成为新的有序表。如图是插入排序的过程:下面以代码的形式,对插入排序的过程进行讲解。package Algorithm;import jav
2020-12-06 15:34:27
108
原创 详解Java线程中的wait()、notify()、notifyAll()方法
线程中的wait()、notify()、notifyAll()详解在讲解wait()、notify()、notifyAll()方法之前,先了解一下什么是等待队列。所有的实例都拥有一个等待队列,它是在实例的wait方法执行后停止操作的线程的队列。打个比方就是为每一个实例准备的线程休息室。在执行wait方法后,线程便会暂停操作,进入等待队列这个休息室,除非发生下列四种中的某一种情况,否则线程会一直在等待队列中休眠。(1)有其他线程的notify方法来唤醒线程(2)有其他线程的notifyAll方法来唤醒
2020-12-05 18:50:03
2213
2
原创 Java排序之选择排序
选择排序选择排序(select sorting)是一种简单的排序方法。它的基本思想是:第一次从 arr[0]到arr[n-1]中选取最小值,与 arr[0]交换,第二次从 arr[1]到arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr[2]到arr[n-1]中选取最小值,与 arr[2]交换,…,第 i 次从 arr[i-1]到arr[n-1]中选取最小值,与 arr[i-1]交换,…, 第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值,与 arr[n-2]交换,总共通
2020-12-05 17:29:17
162
1
原创 Java排序之冒泡排序
冒泡排序冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。每一趟排序的过程中都将较大的那个值移动到后端,并在后部排好顺序。如给定原始数组:3,-1,6,2,-3第一趟排序过程:(1)-1,3,6,2,-3(2)-1,3,6,2,-3(3)-1,3,2,6,-3(4)-1,3,2,-3,6最终排序的结果为:-1,3,2,-3,6第二趟排
2020-12-05 11:41:48
170
原创 Java中线程的互斥处理
线程的互斥处理互斥:如果一个线程正在执行某一个操作,那么其它的线程就不可以再执行这部分操作。在Java中使用关键字synchronized来执行线程的互斥处理。synchronized方法:如果声明一个方法时,在前面加上关键字synchronized,那么这个方法就只能由一个线程运行。只能由一个线程运行是每次只能由一个线程运行的意思,并不是说仅能让某一个特定的线程运行。这种方法称为synchronized方法。有时也称为同步方法下面通过代码的形式来理解互斥。在这里插入代码片 public stat
2020-12-04 20:53:38
1528
3
原创 java中线程的暂停
线程的暂停Java中线程暂停的方法是sleep方法,并且sleep方法是Thread类的静态方法。下面以代码的形式,使用sleep方法:package Java多线程;public class Demo1 { public static void main(String[] args) throws InterruptedException { for (int i = 0; i <5 ; i++) { Thread.sleep(2000)
2020-12-04 16:17:35
241
原创 Java中线程的启动
线程的启动启动线程的方法有两种:1.利用Thread类的子类实例启动线程2.利用Runnable接口的实现类的实例启动线程线程的启动(1)——利用Thread类的子类直接上代码:线程的启动(2)——利用Runnable接口注意:Runnable接口的实现类必须要实现run方法代码如下:创建Runnable接口的实现类,将实现类的实例作为参数传给Thread的构造函数,调用start方法——这就是利用Runnable接口启动线程的方法。不管是利用Thread类的子类方法(1),还是利用
2020-12-04 15:55:43
88
原创 理解Java中的顺序、并行和并发
理解Java中的顺序、并行和并发顺序:用于表示多个操作 “依次处理”。比如说把十个操作交给一个人来处理,这个人要一个一个的按顺序来处理,类似与只有一个线程的程序,代码块的顺序执行。并行:用于表示多个操作 “同时处理”。比如十个操作分给两个人来处理,这两个人就会并行来处理。并发:相对于顺序和并行来说比较抽象,用于表示“将一个操作”分割成多个部分并且允许无序处理。比如将十个操作分成相对独立的两类,这样便能够开始并发处理了。如果一个人来处理,这个个人就是顺序处理分开的操作,如果是两个人,这两个人就可以
2020-12-04 15:15:02
501
原创 Thread类的run方法和start方法
Thread类的run方法和start方法start方法是Thread类中的方法,用于启动新的线程。而调用run方法时,不会启动新的线程。在调用start方法后,程序会在后台启动新的线程。然后,由这个新的线程调用run方法。start方法主要执行以下操作:1.启动新线程2.调用run方法start方法和run方法之间的关系如下图所示:代码如下:运行结果:总结:使用start方法才能算是真正开启了新的线程,而只使用run方法不能算是开辟一个新的线程,只能算是在某一个单线程中的顺序执行,本
2020-12-04 14:27:28
2580
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人