自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 开发常用的实体属性转化API,copyProperties方法的用途,需要注意的点。

在开发过程中,我们通常会在 Entity,model,DTO,VO,POJO,Param 等众多实体类之间进行互相转换,传统的做法就是 new 一个新的要转化的对象然后一个属性一个属性的 set 进去,如果是集合,外边再加一层循环嵌套即可,但尽管如此,步骤还是较为繁琐,而且当实体类中的属性较多时,代码还会显得特别臃肿,不美观。

2024-05-15 13:42:30 573

原创 null和空集合有什么区别?集合List的判断 list == null,list.size() == 0,isEmpty() == true有什么区别和联系?

集合 List 是我们在开发过程中非常常用的,这两天我在做一个功能的时候,用 PostMan 测试接口总是报空指针异常,后来经过调试发现了问题所在,原因就是对于数组的判断方式有误;所以写这篇文章记录下来,防止以后再犯类似的错误,也为了给小伙伴分享让小伙伴们在日后开发过程中也可以避。

2024-05-08 20:12:39 787

原创 设计模式(2)——工厂方法模式

本篇文章主要讲述23种设计模式中的工厂方法模式。这里我们用一个咖啡店系统的小案例来引出简单工厂模式的使用,在简单工厂模式的基础上延申介绍工厂方法模式。// 加奶方法// 加糖方法// 定义抽象方法,获取咖啡名称,由子类实现@Overridereturn "美式咖啡";@Overridereturn "拿铁咖啡";if ("美式咖啡".equals(type)) {}else if ("拿铁咖啡".equals(type)) {}else {

2024-04-29 20:46:29 1216 2

原创 UML——类图详解

UML全称(Unified Modeling Language),译为统一建模语言,是用来设计软件的可视化建模语言。它的特点是简单,统一,图形化,能表达软件设计中的动态与静态信息。UML从目标系统的不同角度出发,定义了用例图,类图,对象图,状态图,活动图,时序图,协作图,构件图,部署图九种图,本篇文章重点描述类图。类图(Class Diagram)是显示了模型的静态结构,特别是模型中静态的类,类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。

2024-04-25 08:00:00 856

原创 POJO,Entity,model,domain,view,DTO,VO,Param这些分别都是什么含义?怎样理解?

在日常开发的过程中,如果我们接手一个新的项目之后,通常会有各种各样的包,想要搞清楚项目的基本架构,当然就需要知道各种包做什么用的,里面存放了那些东西。以便于我们理解项目的整体结构。我们都知道项目是要和数据库打交道的,数据库中的一张表映射到Java代码种是一个实体类。在形目中,我们通常会发现实体类用很多种不同的定义方法,有叫 entity 的,有叫 domain 的,有叫 model 的,有叫 pojo 的,到底哪一种是最规范的呢?本篇我们就来说说它们的区别。

2024-04-24 14:30:00 1267

原创 数据库主键ID自增,两种方法获取插入数据库那条数据自动生成的主键ID值

在开发过程中,我们可能会遇到这样的一种情况,我们保存一条数据。如果这条数据的主键ID是由用户决定的,这样我们在获取主键ID的时候,只需要让前端的同时传递给我们就可以了;如果主键ID设置为自增,是在用户新增数据操作时自动生成的,在后续业务逻辑中需要使用生成的主键ID值,我们又该如何获取呢?本篇我们就来说说两种常用方法获取自动生成的主键ID;

2024-04-23 16:28:39 1074

原创 MyBatis-Plus分页查询IPage的使用方法,如何自定义分页查询功能?

介绍 MyBatisPlus 分页插件IPage的使用和条件构造器 LambdQueryWrapper 的使用

2024-04-19 15:49:21 2212

原创 MySQL中空值和NULL的区别,开发过程中注意必坑!

在 MySQL 中,NULL 值和空值是两个不同的概念,空值就是我们常说的空字符串,用两个单引号 '' 代替即可;NULL 值在MySQL中是占用空间的,而空值则是不占用长度空间的。举个最简单的例子。如果把数据比作水果,表中的每一个空位比作一个个箱子,水果要放进箱子里存储;NULL就可以理解为空位上有一个箱子,但箱子是空的,没有存放任何水果;空值就可以理解为空位上连箱子都没有,真空状态;2. NULL和空值在表中显示的区别如下SQL创建一张 user 用户表,

2024-04-18 21:28:22 771

原创 八款好用的 IDEA 插件,强烈推荐!!!不容错过

然后在右侧CodeGeeX中,他就会跟我们说这段代码的逻辑,做了什么事,在你接手别人的项目时,没有注释就直接选中问CodeGeeX,懒人必备神器,如下,它就帮我解释了刚才我选中的方法的功能,以后再遇到读不懂的方法时,别忘了询问CodeGeeX;然后我们回到项目中,随便选中一个单词,点击右键,就会出现 "Translate",点击翻译,他就可以直接讲的那次的意思翻译出来,不需要我们在去浏览器翻译,非常方便,对英语不好的同学简直是救星;然后,控制台下方就会出现方法的调用过程,我们可以清楚的知道它的执行逻辑;

2024-04-03 18:28:25 2216

原创 windows系统kafka小白入门篇——下载安装,环境配置,入门代码书写

我们修改 log.dirs 的值为刚才创建的 data 文件夹的路径,在路径末尾再添加上 "/kafka" ,用来和刚才的zk做区分,kafka 文件夹用来存放kafka的日志文件,zk 文件夹用来存放zoopeeper的日志文件;如下图所示,我在生产者命令窗口输入 "hello kafka",点击回车,我们就可以在消费者中命令窗口中看到发送过来的 "hello kafka" 消息。打开文件夹后可以发现内部含有bin文件夹,config配置夹,libs依赖夹等,和JDK,maven 问价夹的格式如出一辙;

2024-04-02 20:34:58 1284

原创 MySQL 中 JSON 字段增删改查相关函数及使用演示,简单易学,5分钟上手

JSON数据是我们在开发过程中几位常用的一种数据存储方式,主要以KV键值对的形式存储数据,在 MySQL5.7 之后,提供了JSON字段,在 MySQL8之后得到了很好的优化,下面就是JSON格式数据与的例子,以KV键值对的形式存储数据,每个键值对之间使用 "," 隔开即可。我们先准备好一张 product 商品表,字段类型如下图所示,方便一会操作展示然后在表中存放一些数据,如下图,数据均为编造,仅为演示建表SQL和数据SQL如下,想动手尝试小伙伴们可自行CV。

2024-04-01 14:51:11 1000

原创 设计模式(1)——单例模式

静态内部类是通过JVM的方式保证线程安全,JVM会保证每个类之加载一次,但类中的静态内部类是不会被加载的,只有当我们调用 get 方法时,get 方法会返回给我们一个静态内部类的INSTANCE,而INSTANCE在静态内部类中指代的就是外部类的实例对象,非常神奇,非常花哨,并且可以做到线程安全,任何人来访问get方法获取Mgr03对象的实例,获取到的都是同一个INSTANCE。一个类只实例化自己的一个实例,并且不允许再创建多余的实例,在对外提供访问时,访问的都是同一个实例对象。

2024-03-29 09:47:57 675

原创 Git,GitHub,Gitee,GitLab 四者有什么区别?

总结来说就四句话即可概括全部内容(1)Git 只是本地仓库的代码管理工具;(2)GitHub 是国外公司基于git制作的远程仓库;(3)Gitee 是国内公司基于git制作的远程仓库;(4)GitLab 是想搭建自己仓库时用的工具;t=N7T8。

2024-03-28 14:05:51 892

原创 如何理解Java不可变集合?有什么使用场景?

不可变集合最经典的一个使用场景就是我们常玩的斗地主,斗地主中已经规定好了的规则,我们就可以把它放在不可变数组中,这些规则不能修改,也不能再继续添加,只能按照他已经规定好的游戏规则去进行。然后我们调用 list.add() 方法,发现方法报错,不支持的操作异常,下面的 Set 和 Map 我就不重复尝试了,感兴趣的小伙伴可以自行动手操作一遍。(2)当集合对象被不可信的库调用时,集合内部数据不可变也保证了数据的安全性;,不可变通常说的是内存地址(也就是引用)不可变,但引用的值是可以改变的;

2024-03-26 10:30:00 321

原创 精炼总结阿里巴巴Java编程规范,养成良好编程习惯,提高编程素质(1)

(1)long或Long 初始赋值时,必须使用大写 L,因为小写的 l 容易和数字1 产生混肴;正确示例:Long num = 2L;错误示例:long num = 2l,极容易将num 认为是21,但实际上定义的是2;(2)不允许出现未经定义的变量只出现在代码中;错误示例 String key = "ID" + tradeId,这样定义容易造成内存溢出,不允许出现。(3)不要使用一个常量类维护所有常量,应该对常量进行分类维护,后期排查方便,维护也方便。

2024-03-25 14:53:47 712

原创 怎样在一台电脑安装多个版本的JDK并切换使用?一篇文章教会你所有细节

配置完成之后,我们一路点击确认,将刚才打开的对话框全部关闭。

2024-03-22 10:17:50 2230 1

原创 Kotlin 中List,Set,Map的创建与使用

本篇主要为已经有Java基础的同学展示Kotlin语言中的List,Set,Map的创建和使用,所以Java代码省略,主要展示Kotlin代码。

2024-03-13 19:01:38 635

原创 Kotlin 空类型,区间,数组

除此以外,Kotlin 中还有定制数组,如下所示,如果当前数组你只会存放 Int 类型的数据,就定义IntArray 数组,如果存放字符,就定义CharArray。我们知道任何一种数据类型都有为空或不为空两种状态,在 Kotlin 中,若允许一个数据为空,则需要使用 "?",默认都不能为空。在 Kotlin 中,有区间这么一个概念,它就是我们数学上说的区间,有开区间或者闭区间之分,通常可以用在循环内。简单理解,就是我们Java中的数据,数组中可以存放各种类型的数字,String字符串,或自定义对象。

2024-03-13 11:24:26 609

原创 Koltin 语言与Java语言有哪些差异?

Java中的方法定义方式方法修饰符 方法返回值 方法名(参数1类型 参数1名称,参数2类型 参数2名称,......){方法体}Koltin 中方法定义方式fun(固定位fun,function的缩写) 方法名 (参数1名称 参数1类型,参数2名称 参数2类型,......):方法返回值类型{方法体}

2024-03-11 20:05:09 929

原创 MySQL 子查询优化如何做?

子查询通常是将一个表的查询结果作为另一个表的查询条件,也就是我们常说的嵌套查询。使用子查询,我们让我们一次性完成需要很多步查询操作才能得到的结果。子查询的SQL语句通常比较长,而且执行效率普遍非常的差,是慢查询的主要贡献者,尽管它可以使用一条SQL语句达到查询效果,但实际并不是特别推荐使用,但我们在不得已的情况下也可以考虑使用子查询,那么我们就要最大程度上提高子查询的效率,这里就涉及到了子查询的优化。

2024-02-26 15:30:34 560

原创 用户,角色,权限三者的关系?让你设计用户权限系统,你会设计几张表?为什么要这样设计?

第二种方案要比第一种方案在编码层面更复杂,需要用到5张表,并需要用到多表查询,但是却非常利于系统对各个用户的权限控制,加入角色表我们可以将所有的用户划分为不同的角色,让权限关系更加清晰,当我们需要添加新的用户时,只需要让他与角色表相关联,然后就可以通过角色与权限关联表确认当前用户都具有哪些权限,程序的健壮性和可扩展性更强。在有些小的项目中,我们通常会发现关于用户权限的设计非常简单,通常都是设计一个权限表列出各种权限,然后就是用户表,用户表中设计一个权限字段关联权限表的主键,从而达到设计用户权限的目的。

2024-02-21 16:00:00 1210

原创 MySQL 锁的内存结构

在 MySQL 中,有很多种锁,例如行锁,表锁,页锁,全局锁,它们锁的粒度都不一样。更多情况下,我们只是关注这些锁的区别和作用,却很少关注它们本身,本篇我们就来简单了解一下MySQL 中锁的内存结构,锁中都包含了哪些信息。

2024-02-20 17:23:32 949

原创 冒泡排序,选择排序,插入排序,快速排序的核心思想和代码实现

经过了第一次循环之后,最大的数据5此时在数组的最后,但是现在数组还不是完全有序的,我们只确定了最大的一个,其余的数据还需要继续使用冒泡排序,现在我们除去刚才的数据5,那么就剩下了4个数据需要进行排序,就需要进行 4 - 1 = 3 次,经过排序之后,我们又能确定数据4。(3)遍历得到5,拿5和 [3,38,44] 数组后面的树比较,以此往前比,和上一步一样,直到确定5插入在3和38的中间,此时数组为 [3,5,38,44];

2023-11-17 09:45:00 246

原创 Git 常用命令总结

3. git reset --hard "版本号" ——将当前 git 回退到指定的某个版本;13. git remote origin "远端仓库地址" ——添加远端仓库地址到本地;12. git checkout -b "分支名" ——创建并切换到某个分支;12. git merge "分支名" ——将指定分支合并当当前分支上;11. git checkout "分支名" ——切换到某个分支;10. git branch "分支名" ——创建一个分支;8. git init ——初始化 git 仓库;

2023-11-16 09:15:00 113

原创 Redis 事务是什么?又和MySQL事务有什么区别?

从语法上来讲,所有命令本身并没有错误,所以 redis 是检查不出来的,但是在逻辑上我们不能让字符串类型的数据自增1,所以 incr email 这个命令时执行失败的,但是其他命令都没有问题,是可以正常执行的,这就是 redis 于 MySQL最大的区别,MySQL是同成功同失败,redis 则是能执行成功的就会保存不进行回滚,执行失败的那就是失败了。Redis 事务仅仅保证事务里的操作会被连续独占的执行,Redis 命令执行是单线程架构,在执行事务内所有命令请求之前无法去执行其他客户端请求;

2023-11-15 09:00:00 400 1

原创 数据库表的设计——范式

范式的英文名称位 Normal Form,简称NF。在关系型数据库中,关于数据表设计的基本原则,规则称之为范式。可以简单的理解为,一张数据表的设计结构需要满足某种设计标准的级别,满足某种规则。

2023-11-14 08:00:00 548 1

原创 索引下推(ICP)是什么意思?如何理解?

ICP 全称 Index Condition Pushdown,是MySQL5.6之后的一个新特性,它是一种在存储引擎层使用索引过滤数据的一种优化方式。

2023-11-13 09:43:44 98

原创 反转字符串的四种算法及算法的思想 (Java代码实现)

然后再次进入递归,3无法再拆分,但"45" 又可以拆分为 "4" 和 "5",再次递归,"5" 在最前面,"4" 跟在 "5" 的后面,然后 "3","2","1"第二次遍历,取1索引的 "2" ,拼接在 "1" 的前面,就变成了 "21",后续第三四五次遍历同理,就可以得到反转结果 "54321" 了。第二次遍历,取3索引的 "4" ,拼接在 "5" 的前面,就变成了 "54",后续第三四五次遍历同理,就可以得到反转结果 "54321" 了。第一次遍历,取4索引的 "5";

2023-11-10 09:00:00 184

原创 MySQL 中COUNT(*),COUNT(1),COUNT(普通字段),COUNT(索引字段)的效率和区别?

(3)在没有非聚簇索引的情况下,COUNT(1),COUNT(*),COUNT(普通字段),COUNT(索引字段)都是通过聚簇索引来进行统计,如果字段为NULL也是统计不进去的,所以COUNT(普通字段)统计的结果一定小于等于 COUNT(1),COUNT(*),COUNT(索引字段) 的结果。执行效率 COUNT(*) = COUNT(1) > COUNT(主键字段) > COUNT(普通字段);COUNT(*)和COUNT(1)都是对所有结果进行COUNT,二者区别不大,效率没有明显差别;

2023-11-09 08:30:00 181

原创 谈谈你对SpringIOC和AOP的理解

1. IOC的设计初衷在没有IOC之前,我们项目中调用某个方法都是先 new 一个方法的类对象,然后通过该对象调用该方法,但这种 new 对象的方式存在一个很大的缺点——项目代码之间耦合度太高了,如果后期需求变动需要对项目功能做修改,由于项目内部使用的 new 的方式导致耦合度较高,后期代码很有可能会对之前的代码产生侵入,就违背了 Java 面向对象中对扩展开放对修改封闭的原则。为了降低项目内部由于都西昂的创建导致模块之间耦合度较高的问题,就有了IOC容器这一解决方案(这是主要原因,不是唯一原因)。

2023-11-08 08:15:00 111

原创 MySQL覆盖索引的使用

用一句话来说,"索引中包含的列,能够满足查询的列,这就叫覆盖索引所以,覆盖索引严格意义上来说并不是一个索引,而是一种行为。回表查就是先查询非聚簇索引的B+树,通过非索引B+树查询到主键信息,然后再去聚簇索引的B+树中通过主键查询自己想要查询的信息。

2023-11-07 09:07:03 160

原创 MySQL 排序,分组,Limit的优化策略

并且,如果数据量非常大,内存中装不下,还需要多次IO操作,先读取一部分数据排序,再读取一部分数据排序,效率较低。对于数据库而言,排序,分组,去重这些操作都是比较繁琐耗费资源的,如果将所有操作全部放在数据库中,非常容易出现慢查询,因此我们可以考虑将这些操作放在程序端去做,数据库查询到数据之后,使用程序代码进行排序分组去重;Index:索引排序,就是我们给排序的字段添加了索引,因为索引本身就是有序的,所以我们在根据排序的时候就非常省时间了,不需要进行重排序,直接取出数据即可,效率很高。

2023-11-06 14:04:27 317

原创 Git 指令白雪警告!在IDEA中配置使用Git管理提交代码,无需繁杂指令

相信有很多小伙伴在学习 Git 指令的时候一定被一大堆指令弄得焦头烂额吧,但其实在以后的实际开发工作中,我们很少会直接使用 Git 指令,所以说一句实在话,Git 指令学不会没有任何关系,只要你会在IDEA中配置 Git,使用界面化操作提交代码拉取代码就够了。就和我们的 Maven 一样,配置好 Maven 的路径和 jar包仓库地址,我们在使用 SpringBoot 项目的时候直接导入就可以了,谁还会去管 Maven 呢,那么本篇文章我就来和小伙伴们一起探究 Git 在 IDEA 中如何使用。

2023-11-03 07:00:00 425

原创 MySQL 外连接和内连接的查询优化怎么做?

在没有任何索引的情况下,当两张表在进行连接查询操作的时候,实际上底层做的第一件事就是拿出驱动表一条记录与被驱动表的所有记录去做匹配,看是否满足条件,匹配完毕之后,再拿出驱动表的第二条记录与被驱动表的所有记录去做匹配,看是否有满足条件的记录,以此类推,直到驱动表所有记录均与被驱动表的所有记录进行过匹配并得出了满足条件的结果,两张表的连接查询的第一步连接操作就完成了。首先需要明确的一点是,内连接查询表面上是不分主表和此表的,默认来说左边的表就是驱动表,右边的表就是被驱动表。

2023-11-02 14:04:50 330

原创 从源码深度剖析 CopyOnWriteArrayList 线程安全集合,一起来看看吧

使用过 ArrayList 集合的同学应该大致都知道,ArrayList 是一个非线程安全的集合;同样,Java也为我们提供了线程安全的 List 集合,只是用的频率没有 ArrayList 那么频繁,它就是我们本篇文章要说的 CopyOnWriteArrayList。CopyOnWriteArrayList 的原理不难理解它底层采用了加锁的方式保证线程安全并且加的是 Lock 锁而不是 Sychonized 锁。

2023-10-31 14:56:12 179

原创 String 字符串不可变带来的好处是什么?

String 虽然是在堆中,但其实分为两种情况,如果我们使用 String string = "xxx" 的方式来创建字符串,那么被创建出来的字符串对象是存放在堆中的字符串常量池中的,可以重复利用;所以说,String 虽然不可变,却可以重复利用,在开发过程中,几乎都是使用 String str = "xxx" 创建字符串,然后创建的字符串会被缓存到堆中的字符串常量池中,在同一各项目中不管有多少个人创建字符串,只要字符串内容一样,其实最后都是用的常量池中的同一个字符串对象,大大的降低了内存的消耗。

2023-10-30 16:27:27 295

原创 Docker 镜像常用命令总结

最上面的NAME,DESCRIPT,STARTS,OFFICIAL,AUTOMATED是参数,这些参数的含义如下图中所示,一般情况下选择第一个镜像就可以了,第一个通常是官方镜像。刚才我拉取了三个镜像,如下所示,运行命令之后,docker 就会把容器,镜像,数据卷各自占用的比例列出,这里我一个都没有运行,全都只是拉取下来的景象,所以占比为100%可以看到我在后面加上了[:tag],这个是版本号的意思,因为同一个镜像也许会有多种不同的版本,如果你加,默认就是给你拉取 latest最新版的,这一点要记住哦!

2023-10-26 07:30:00 2983

原创 浅谈 MySQL 主从复制,优点?原理?

既然是主从复制,那么至少就应该有两台服务器,一台作为主库(Master),一台作为从库(Slave)。主数据库会将自己的DDL(数据定于语言,例如建库建表)与DML(数据操作语言,例如增删改查)操作写成二进制日志文件,发送给从库,从库在接收到二进制日志文件之后,自己在将文件中的命令执行一遍(也叫重做),将数据备份保存到自己的服务器内部,从而使自己的数据与主库的数据保持一致。同时,主库可以挂载多个从库,向多台数据库服务器发送数据文件;此外,从库也可以作为其他数据库的主库,实现链式复制。

2023-10-25 09:34:53 205

原创 Redis 主从复制,哨兵,集群——(3)集群篇

一句话:"使用 Redis 集群时,我们会将存储的数据分散到多台 Redis 服务器上,这就称之为分片"。简言之,集群中的每个 Redis 服务器都可以认为是整个数据的一个分片。如下图举例,刚才也提到过了,16384个槽位编号分别为0~16383,现在有三台 Redis 服务器,将16384个槽位均匀分散到三台 Redis 服务器上,第一台存储0~5460号数据,第二台存储5461~10922台数据,第三台存储10923~16282号数据,这就是分片。一致性哈希算法的核心是哈希环。

2023-10-19 20:12:49 329

原创 Redis 主从复制,哨兵,集群——(2)哨兵篇

以下是 sentinel.conf 配置文件中关于 leader 哨兵领导者选举的部分注释。翻译过来的大致意思就是,"一旦主节点已经被哨兵集群投票并通过认定当前 master 已经主观下线了,那么哨兵内部就会选举出一个哨兵领导 leader,然后由 leader 进行新的 master 节点选取和故障转移。"所以一定要分清,新的 master 服务器是由哨兵集群中选出来的 leader 选举的,由 leader 确定 master。为什么会有 leader 呢?

2023-10-18 17:17:41 338

空空如也

空空如也

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

TA关注的人

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