自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 资源 (1)
  • 收藏
  • 关注

原创 MySQL主从同步延迟的原因、排查和解决方案

解决方案:半同步复制、一主多从读写分离、避免大事务、业务侧加缓存、化网络带宽、选择高版本MySQL

2024-04-08 11:58:25 1005

原创 BigDecimal常用方法及手写通用工具类

项目中操作BigDecimal的工具类,包括加减乘除、四舍五入和比较大小等操作

2023-09-19 22:21:54 415

原创 使用Redis控制表单重复提交和控制接口访问频率

防重提交有很多方案,从前端的按钮置灰,到后端synchronize锁、Lock锁、借助Redis语法实现简单锁、Redis+Lua分布式锁、Redisson分布式锁,再到DB的悲观锁、乐观锁、借助表唯一索引等等都可以实现防重提交,以保证数据的安全性。这篇文章我们介绍其中一种方案–,最终实现防重提交。

2023-09-06 17:51:20 916

原创 Nacos之NacosWatch源码解读

NacosWatch实例化、调用时机及作用(订阅服务变更通知、获取注册服务的服务列表、开启定时任务更新注册服务的实例列表、发送心跳等)

2021-12-02 17:03:13 2194

原创 git常用命令笔记

一、本地分支之间相互切换和查看;二、本地创建一个新分支推送到远程仓库;三、从远程仓库里拉取一个本地不存在的分支;四、分支合并;五、重置账号密码、存储账号密码;

2021-08-30 11:46:33 510

原创 SpringCould Gateway里添加前置过滤器校验参数格式

目前SpringMVC做了很好的兼容处理,即使请求参数的json格式有错误,也能只取json串前面一段能匹配上的数据,而不报错。啥事有好处也有坏处,不好的地方就是有注入风险。所以需要校验入参的格式,那接下来就需要考虑在哪里做校验。因为校验入参格式是公共操作,所以最好选在网关层做拦截校验,而不是下发到应用层。我们项目采用的是SpringCould Gateway实现的网关,我尝试在GlobalFilter的实现类下读取请求参数然后校验json格式,可以做到,但引发了一个问题,请求参数在流里面,被读取过一次

2021-08-18 17:39:44 1046

原创 MybatisPlus支持Entity里使用枚举做为属性类型的源码解析

1.mybatis-plus配置里指定枚举路径;2.枚举类里使用@EnumValue注解标记要映射的枚举属性;3.Entity里使用该枚举做为属性类型。

2021-06-24 12:02:09 1079 1

原创 Spring启动时实现初始化的几种方式

构造方法里初始化、@PostConstruct、InitializingBean、initMethod、ApplicationListener监听、SpringBoot的ApplicationRunner和CommandLineRunner接口

2021-06-07 16:06:04 5241 3

原创 swagger中注解的value和tags区别

@Api注解用于描述类,@ApiOperation注解用于描述方法。两种注解都有value、tags属性,那么这两个属性的区别是什么?作用在类上 和 作用在方法上又有什么区别?

2021-05-17 15:53:36 7417

原创 MySQL开发过程日常使用命令

目录添加修改查看注释创建表时添加表和列的注释修改已有表的注释修改已有表的列的注释查看表注释DESC命令,只能看到表结构但看不到注释SHOW CREATE TABLE命令,可以看到完整SQL(推荐)SHOW FULL COLUMNS FROM命令,格式化的展示(推荐)在元数据表里查看查看information_schema.TABLES表添加修改查看注释创建表时添加表和列的注释DROP TABLE IF EXISTS `process_record`;CREATE TABLE `process_re

2021-05-10 17:23:27 132 4

原创 HttpServletRequest获取POST请求的参数

除了@RequestBody方式外,我们还可以通过HttpServletRequest方式获取参数。比如参数是:{ "code": "xxx"}获取方式:import cn.hutool.json.JSONObject;import cn.hutool.json.JSONUtil;import javax.servlet.http.HttpServletRequest;import java.io.BufferedReader;import java.io.IOException;

2021-04-29 18:38:04 10828

原创 Spring事务的7种传播属性

Spring在TransactionDefinition接口中规定了7种事务传播行为,他们规定了事务方法和事务方法发生嵌套时事务如何进行传播。所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。PROPAGATION_REQUIRED默认事务类型,如果没有,就新建一个事务;如果有,就加入当前事务。适合绝大多数情况。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。PROPAGATION_REQUIRES

2021-04-05 18:24:30 942

原创 mybatis-plus中QueryWrapper的使用技巧

前言:mybatis-plus使用场景mybatis大家都有使用过,既面向对又灵活可配。不友好的地方是,会随着使用出现大量xml文件和SQL语句。此时,mybatis-plus应运而生,对mybatis做了无侵入增强,还可以简化SQL语句,或者不写SQL语句。MyBatis-Plus 官网:https://mp.baomidou.com/MyBatis-Plus 官方文档:https://mp.baomidou.com/guide/码云项目地址:https://gitee.com/baomidou

2021-04-01 11:45:16 21911 2

原创 手动同步Chrome(解决Chrome不能自动同步的问题)

使用Chrome浏览器如果有用到它的同步功能时,会有一个问题,就是数据变更后不能及时自动同步到云端,所以在其他客户端也不能及时看到数据的变更。

2021-01-06 17:19:31 3604 2

原创 HTTPS是怎么防止劫持的

HTTP是明文传输的,如果想密文传输就需要HTTPS(HTTP+SSL),三次握手之后再建立SSL连接。那么HTTPS是怎么防止劫持的?在HTTP请求时,常见的劫持有DNS劫持和传输内容被劫持,我们从这两个劫持来看看HTTPS是怎么解决的。怎么防止DNS劫持什么是DNS劫持?比如用户想访问知乎,在浏览器输入如下域名https:// www.zhihu.com要打开这个网站,首先要解析域名www.zhihu.com,结果这个域名被黑客劫持到他的私人服务器1.2.3.4,结果用户的浏览器和黑客的私

2021-01-04 13:00:40 1538

原创 Java网络编程基础

目录计算机网络体系结构OSI 七层模型TCP/IP 模型TCP/IP协议族TCP的基本特性TCP建立连接的3次握手TCP的洪泛攻击TCP断开连接的4次挥手常用的网络工具HTTP协议一次完整的HTTP请求的过程HTTP协议报文结构计算机网络体系结构每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。OSI 七层模型物理层、链路层、网络层、传输层、会话层、表示层、应用层。TCP/IP 模型链路层、网络层、传输层、应用层。TCP/IP协议族常见的有TCP、UDP、HTTP、FTP、

2020-12-08 10:09:30 118

原创 mybatis-plus修改日志只打印SQL语句不打印查询结果

项目中使用了mybatis-plus baomidou,如果遇到了日志输出时 既打印SQL语句又打印查询出来的结果,如下:如果想只打印SQL语句、不打印查询结果,解决方案如下:增加log4j日志的配置。logging: level: com.crc.smartech.wisdomsiteee.biz.mapper: debug去掉mybatis-plus configuration log-impl控制台输出的配置。mybatis-plus: configuration

2020-12-04 16:29:04 9992

原创 利用JDK8提供的Optional简化if else

程序猿开日常开发中,为了避免NullPointerException异常,会写很多if else的判断。如果if else太多会让代码显的很乱,那如何减少if else的使用呢?减少if else的方式之一,利用JDK8提供的Optional。代码示例:示例中getStartTime()获取String类型的时间字符串并返回。执行逻辑:调动selectStartTime()查询DB返回LocalDateTime值;响应值dateTime如果为null,就给一个默认值;响应值dateTime

2020-11-05 15:59:01 2590

原创 Java Map的最高校遍历方法

public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < 200; i++) { map.put("" + i, "value" + i); } // 第一种:普遍使用,二次取值 System.out.println("-------------第一种------------------

2020-10-29 16:01:44 146

原创 Spring框架中有哪几种事件

Spring 提供了以下5种标准的事件:上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplication

2020-10-27 15:47:04 607

转载 Tomcat Connector的三种运行模式

BIO同步并阻塞 一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。配制项:protocol=”HTTP/1.1”NIO同步非阻塞IO利用Java的异步IO处理,可以通过少量的线程处理大量的请求,可以复用同一个线程处理多个connection(多路复用)。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动。配制项:protocol=”org.apache.coyot.

2020-10-27 15:31:06 258

原创 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?

什么是序列化序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。怎么序列化实现Serializable接口,指定serialVersionUID字段。public class User implements Serializable { private static final long serialVersionUID = -2789105097448974933L;}为什么序列化对象、文件,有许多不同的格式,很难统一

2020-10-27 11:44:41 926

原创 mybatis-plus的QueryWrapper为同一列设值时引发的bug

baomidou mybatisplus日常操作语法下面 baomidou mybatisplus 简称 mybatisplus比如查询的语法非常简单,如下:QueryWrapper<User> qw = new QueryWrapper<>();qw.eq("sex", 1);int count = userMapper.selectCount(qw);声明一个QueryWrapper对象,然后设置查询参数,eq()即等于,key是列名,value是值。接着调用m

2020-10-23 17:51:21 2940 1

原创 Java算法中O(1),O(logn),O(n),O(nlogn),O(n2)是什么

O(1),O(logn),O(n),O(nlogn),O(n2)是用于表示算法的时间复杂度的一个函数。时间复杂度常用大O符号表述,O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系,反应随着数据增值时间复杂度的渐变过程。比如我们统计排序算法复杂度时的对比表:常数阶O(1)O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑

2020-10-22 16:32:48 1440

原创 Java位移运算符,左移运算符(<<),有符号右移运算符(>>),无符号右移运算符(>>>)

位移运算符操作的对象是二进制的位,可以用位移运算符来处理int型整数。public static void main(String[] args) { int x = 15; //1111 int y = 3; System.out.println(x<<y); //结果为120,1111000 System.out.println(x>>y); //结果为1,0001 System.out.println(x>>>y); /

2020-10-22 15:02:13 388

原创 二进制转十进制,十进制转二进制

十进制转二进制,采用短除法比如要将十进制的29转成二进制: 用29除以2,商写在下面,余数写在商的右边。除到商为0为止,然后倒序排列余数,得到11101即为二进制。二进制转十进制,采用按权相加法比如十进制29的二进制为11101,转换成十进制如下:说明:2的几次方那个次数是怎么确定的?方式一:比如从左数的第一位1,在它前面还有四位,那么它的次数就是为4。方式二:比如从右边开始,第一位是从0次方开始,以此类推。说明:任何除0以外的数的0次方都是1 。如3的0次方是1,-1的0次方也是

2020-10-22 11:12:25 1155

转载 深入比较理解Java中 ArrayList 和 LinkedList 的区别

谈谈ArrayList 和 LinkedList 的区别?常规答案:ArrayList 是基于数组实现的,LinkedList 是基于双向链表实现的。ArrayList 在新增和删除元素时,因为涉及到数组复制,所以效率比 LinkedList 低,而在遍历的时候,ArrayList 的效率要高于 LinkedList。如果是面试,这么回答就太简单了。接下来我们一起深入地研究一下 ArrayList 和 LinkedList 的数据结构、实现原理以及源码。

2020-10-14 15:48:08 139

转载 Java中几种异常处理方式

直接抛出异常通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。private static void readFile(String filePath) throws IOException { File file = new File(filePath); String result; BufferedReader reader = new BufferedReader(new .

2020-10-13 14:50:03 141

原创 Java高并发下一切皆有可能之指令重排

代码示例,我们通过while(true)不断循环,每次开始t1、t2两个线程改值、赋值,模拟并发请求的场景。t1改a值,把b赋值x;t2改b值,把a赋值y。@Slf4j(topic = "e")public class Test1 { public static int a = 0, b = 0, x = 0, y = 0; @SneakyThrows public static void main(String[] args) { int count = 0;

2020-10-13 10:15:34 275

原创 Java中什么是注解及如何实现自定义注解

什么是注解注解(annotation):元数据,一种代码级别的说明;即注解如同一张标签;可以携带参数;在特定场景下由外部解析产生作用;元注解(用于自定义注解)@Documented 注解是否将包含在JavaDoc中,用的比较少;@Retention 什么时候使用该注解,可选值有:source 在源代码阶段使用,如@Override,lombok的注解@Data、@EqualsAndHashCode等等。@Target(ElementType.METHOD) @Retention

2020-10-11 12:19:39 406

原创 JDK8新特性函数式接口的使用示例

基础知识在写函数式接口的使用示例之前,先了解如下几个知识:行为参数化:是JDK8提出的,函数式编程的一种思想,把代码逻辑包装为一个参数传到方法里。Lambda表达式:是JDK8提出的,可以理解为简洁的表示可传递的匿名函数的一种方式,它没有名称,但它有参数列表、函数体、返回类型,可以抛出一个异常类型。函数式接口:本质上是只有一个抽象方法的普通接口,可以被隐式的转换为Lambda表达式,需要用@FunctionalInterface注解定义。JDK8默认方法和静态方法可以在函数式接口中

2020-10-10 20:03:26 446

原创 Java线程池ThreadPoolExecutor的execute()源码解读

public class ThreadPoolExecutor extends AbstractExecutorService { // 高3位存状态、低27位存线程数 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //工作线程集合 private final HashSet<Worker> workers = new HashSet<Worker>(); public v

2020-10-10 13:09:53 670

原创 Java编译优化惹得祸,while无限循环

下面这段代码,按正常逻辑打印完"[flag = true] end"日志后,程序就会正常退出了。但实际运行,程序未能正常退出,因为while循环没有退出。private static boolean flag;public static void main(String[] args) throws Exception { Thread t = new Thread(() -> { int i = 0; while (!flag) {

2020-10-09 18:54:41 910 3

原创 Java中与&、或|、异或^运算符的使用规则与区别

Java中与&、或|、异或^运算符都是二进制的运算,通过对两组二进制的每一位对比得出结果。运算规则与&1:1时为1(概率25%),其他都为0(概率75%)或|0:0时为0(概率25%),其他都为1(概率75%)异或^0:0或1:1时为0(概率50%),0:1或1:0时为1(概率50%)运算步骤如图,两个数字X、Y,分别进行与&、或|、异或^运算:X、Y如果是十进制的话,先算出X、Y二进制值;把两组二进制值平行放在一起,右边对齐,左边不足补0;根据与&

2020-09-29 10:34:36 448

原创 从数据结构、位运算和源码浅析HashMap

HashMap的数据结构数据结构String[]数组首先想到的就是String[]数组,声明指定的长度后,然后根据索引向里面插入数据。但它的缺点是,长度不够时扩容麻烦。ArrayList数组面对这个缺点可以选择ArrayList数组,支持动态扩容,查询速度很快(可以根据索引快速查找),顺序插入也快。但它的缺点是,在数组的中间元素插入删除元素时,要移动索引,数据量大时,频繁插入删除速度就会慢。LinkedList链表-面对这个缺点可以选择LinkedList链表,插入删除元素快。但查

2020-09-27 20:40:02 92

原创 Java身份证号脱敏、校验身份证号合法性、根据身份证号获取年龄、根据生日获取年龄

身份证号编码规则第一、二位表示省(自治区、直辖市、特别行政区)。第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。第七、十四位表示出生年月日(单数字月日左侧用0补齐)。其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用198105

2020-09-09 15:30:14 2621

原创 IDEA怎么设置Class类注释模板并自动生成

IDEA怎么设置Class类注释模板,并在新建类时自动生成。File->Settings

2020-09-08 19:57:32 2528

原创 通配符<? extends T>和<? super T>区别及使用场景

<? extends T> : 上界通配符(Upper Bounds Wildcards) <? super T> : 下界通配符(Lower Bounds Wildcards)平时开发会遇到不少<? extends T>和<? super T>通配符的使用,比如:Collections类提供的集合元素拷贝的copy()方法就同时使用了<? extends T>和<? super T>。public class Coll..

2020-09-07 21:07:43 2898 2

原创 Java中如何实现String字符串的反转(四种方式实现)

有四种方式:自定义实现,利用递归的方式/** * 自定义实现,利用递归的方式 * * @param originStr * @return String */ public static String reverse(String originStr) { if (originStr == null || originStr.length() <= 0) { return originStr; }// String o

2020-09-01 14:49:36 629

原创 MySQL显示表结构和注释,便于粘贴到Word文档表格

MySQL显示表结构且包含注释,即显示表所有列,便于粘贴到Word文档表格形成数据字典。还可以通过PowerDesigner一次性导出成数据字典Navicat查看表结构选中要查看的表,然后点击右侧“DDL”就可以查询。但不便于粘贴成Word文档表格。SQL命令查看表结构DESC <表名>;表结构表格化显示了,但没有中文注释。SHOW FULL COLUMNS FROM <表名>;表结构表格化显示了,且有中文注释。然后复制到Word文档。复

2020-08-27 12:39:31 343

SimpleStickyNotes_5.3.exe

SimpleStickyNotes-5.3 for window10 Updated: Nov 14, 2021

2021-12-13

空空如也

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

TA关注的人

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