自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

输入技术、输出想法

做技术的学习者和分享者

  • 博客(302)
  • 收藏
  • 关注

原创 Oracle和Mysql数据库使用Where 1=1会使索引失效吗?

索引全扫描过程简述:索引全扫描是指扫描目标索引所有叶子块的索引行,但不意思着需要扫描所有的分支块,索引全扫描时只需要访问必要的分支块,然后定位到位于改索引最左边的叶子块的第一行索引行,就可以利用改索引叶子块之间的双向指针链表,从左往右依次顺序扫描所有的叶子块的索引行。全表扫描是采用多数据块一起扫的,并不是一个个数据库扫的,然后我们经常说全表扫描慢是针对数据量很多的情况,数据量少的话,全表扫描并不慢的,不过随着数据量越多,高水位线也就越高,也就是说需要扫描的数据库越多,自然扫描所需要的IO越多,时间也越多。

2024-03-19 10:58:38 986

原创 【SpringBoot应用篇】【AOP+注解】SpringBoot+SpEL表达式基于注解实现权限控制

Spring 表达式语言最初是为 Spring 社区创建的,它拥有一种受良好支持的表达式语言,可用于 Spring 产品组合中的所有产品。虽然 SpEL 是 Spring 产品组合中表达式评估的基础,但它不直接与 Spring 绑定,可以独立使用。Spring 表达式语言 SpEL 是一种非常强大的表达式语言,它支持在运行时查询和操作对象图。它提供了许多高级功能,例如方法调用和基本的字符串模板功能。注解的支持就是使用SpEL表达式实现的权限控制。Spring Security框架中启用。

2023-12-22 11:17:06 1392 6

原创 【日常业务开发】代码简洁之道

每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象,这就允许对其操作可以像链条一样排列,形成了一个管道。只要实现方和调用方遵循规范,可以避免不必要的空值判断,这充分体现了阿里的“新六脉神剑”提倡的“因为信任,所以简单”。链式编程,也叫级联式编程,调用对象的函数时返回一个this对象指向对象本身,达到链式效果,可以级联调用。利用 Map 的 computeIfAbsent 方法,可以保证获取到的对象非空,从而避免了不必要的空判断和重新设置值。对于属性字段较少的类,可以自定义构造方法。

2023-10-13 09:26:29 2380

原创 【日常业务开发】接口性能优化

我们都用过数据库连接池,线程池等,这就是池思想的体现,它们解决的问题就是避免重复创建对象或创建连接,可以重复利用,避免不必要的损耗,毕竟创建销毁也会占用时间。下图是一个电商的创建订单接口,创建订单记录并插入数据库是我们的核心诉求,至于后续的用户通知,如:给用户发个短信等,如果失败,并不影响主流程的完成。分布式锁,只需要在临界资源处加锁即可,不涉及共享资源的,不必要加锁,就好比你要上卫生间,只需要把卫生间的门锁上就可以,不需要把客厅的门也锁上。引发的问题主要有:死锁、接口超时、主从延迟等。

2023-10-13 09:22:58 713

原创 【日常业务开发】Java实现异步编程

首先我们先看一个常见的用户下单的场景:在同步操作中,我们执行到发送短信的时候,我们必须等待这个方法彻底执行完才能执行赠送积分这个操作,如果赠送积分这个动作执行时间较长,发送短信需要等待,这就是典型的同步场景。实际上,发送短信和赠送积分没有任何的依赖关系,通过异步,我们可以实现赠送积分和发送短信。

2023-09-20 19:26:25 298

原创 【日常业务开发】Java调用第三方http接口的常用方式

在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。在Java项目中调用第三方接口的常用方式有:通过JDK网络类通过Apache common封装好的HttpClient通过Apache封装好的通过OkHttp通过Spring的通过hutool的HttpUtil。

2023-09-19 17:12:49 627

原创 【SpringBoot应用篇】SpringBoot集成Caffeine本地缓存

缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。之前介绍过 Redis 这种 NoSql 作为缓存组件,它能够很好的作为分布式缓存组件提供多个服务间的缓存,但是 Redis 这种还是需要网络开销,增加时耗。本地缓存是直接从本地内存中读取,没有网络开销,例如秒杀系统或者数据量小的缓存等,比远程缓存更合适。

2023-09-11 14:38:02 1096

原创 【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务

MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。MinIO兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

2023-09-04 15:35:41 1236

原创 【MybBatis高级篇】MyBatis 拦截器

拦截器是一种基于 AOP(面向切面编程)的技术,它可以在目标对象的方法执行前后插入自定义的逻辑。Executor:拦截执行器的方法,例如 update、query、commit、rollback 等。可以用来实现缓存、事务、分页等功能。ParameterHandler:拦截参数处理器的方法,例如 setParameters 等。可以用来转换或加密参数等功能。

2023-07-31 23:50:50 6803

原创 【SpringBoot应用篇】SpringBoot+MybatisPlus集成国产DM8(达梦)数据库

DM8 是达梦数据库有限公司推出的新一代高性能数据库产品。它具有开放的、可扩展的体系结构,易于使用的事务处理系统,以及低廉的维护成本,是达梦公司完全自主开发的产品。DM8 以 RDBMS 为核心,以 SQL 为标准,是一个能跨越多种软硬件平台、具有大型数据综合管理能力的、高效稳定的通用数据库管理系统。连接达梦数据库实例安装文档这里主要简单介绍以下几个简单但重要的概念:数据库、实例、用户、表空间、模式、表、角色、数据文件。数据库:数据存储的物理介质。

2023-07-25 00:38:42 2511

原创 【SpringBoot应用篇】SpringBoot集成atomikos实现多数据源配置和分布式事务管理

XA 是由 X/Open 组织提出的分布式事务的一种协议(或者称之为分布式架构)。它主要定义了两部分的管理器,全局事务管理器及资源管理器。在 XA 的设计理念中,把不同资源纳入到一个事务管理器进行统一管理,例如数据库资源,消息中间件资源等,从而进行全部资源的事务提交或者取消,目前主流的数据库,消息中间件都支持 XA 协议。JTA 叫做 Java Transaction API,它是 XA 协议的 JAVA 实现。目前在 JAVA 里面,关于 JTA 的定义主要是两部分事务管理器接口-----

2023-07-15 23:35:00 995

原创 【SpringBoot应用篇】【AOP+注解】SpringBoot+Guava基于注解实现接口限流+Redis实现分布式接口限流

【代码】【SpringBoot应用篇】【AOP+注解】SpringBoot+Guava基于注解实现接口限流。

2023-07-13 09:33:02 831

原创 雪花算法ID生成器工具类

*** 抽象 ID 生成器/*** 最大17bit的序列号是131071/*** 时间戳的掩码41bit/*** 因为生成器可以使用69年,而我们想在这些时间里面,生成出来的id是逐渐自增的。* 所以这里指定了从什么时候开始使用id生成器。/*** 机器码 (0-31)/*** 用于生成序列号throw new IllegalArgumentException("请注意,1、机器码在多台机器或应用间是不允许重复的!2、机器码取值仅仅在0~31之间");

2023-07-12 23:24:28 591

原创 工厂+策略+模板方法+责任链设计模式实战

需求:系统之前只支持正常订单(在本系统中处理的订单),后面又有新需求,增加了分销订单(交给第三方处理的),然后之前用if-else实现了,但逻辑结构已经混乱了,扩展起来很复杂,所以使用设计模式进行重构这块代码。

2023-07-08 00:06:06 220

原创 模板方法模式

模板方法是一种行为设计模式,它定义了一个操作(模板方法)中的算法框架,将一些步骤(抽象方法)延迟到子类中实现。模板方法模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。模板方法由一个抽象类定义,其中包含了一个或多个公共方法和一个抽象方法。公共方法定义了算法的框架,包含了一系列的步骤,而抽象方法则由子类来实现,用于对算法的某个步骤进行特定的实现。抽象类:负责定义模板方法、基本方法、抽象方法。模板方法:在抽象类中定义的流程操作集合,里面有一系列流程操作和条件控制,包含基本方法和抽象方法。

2023-07-07 23:52:57 301

原创 责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理请求。在这个模式中,请求沿着一个处理链依次传递,直到有一个对象能够处理它为止。责任链模式的核心思想是将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。在责任链模式中,请求会沿着一个处理链依次传递,每个处理者都有机会处理请求,如果一个处理者不能处理请求,则将请求传递给下一个处理者,直到有一个处理者能够处理它。

2023-07-04 23:53:02 751

原创 【Java高级篇】基于注解+泛型+反射实现抽象JDBC工具类BaseDao

【代码】【Java高级篇】基于反射+注解实现抽象JDBC工具类BaseDao。

2023-07-04 21:20:45 441

原创 解决VMware虚拟机Centos7切换网络更换IP问题

学习docker,在VMware虚拟机Centos7系统中使用docker部署了mysql,redis,nacos,虚拟机DHCP分配的ip为192.168.171.128,使用连接工具xshell连接没问题。第二天,公司没网络了,切换成WIFI网络,所有客户端工具都无法连接。GATEWAY 是网关,DNS1 与网关保持一致,并且二者与上面第1步记下来的网关一致,我这里是192.168.171.2。原因:由于网络切换WIFI,导致虚拟机DHCP重新分配的IP为192.168.171.129。

2023-05-17 10:56:18 1448 2

原创 【SpringBoot应用篇】【AOP+注解】SpringBoot使用Aspect AOP基于注解获取方法形参

需求: 需要保存的日志内容在方法的参数中,并且方法参数的类型对象不一样,且对象的属性名称不一样。这一篇文章已经给出了解决方法。但是如果方法的参数不同,会出来转换器类爆炸的情况。问题:Java反射中Parameter的getName后得到arg0的问题。1、@LogPro注解中添加field目标属性字段。2、LogAspectPro切面增强。

2023-04-04 22:19:18 1225

原创 【SpringBoot高级篇】【AOP+注解】SpringBoot集成jasypt 配置脱敏和基于注解实现数据脱敏

一旦密码泄漏,将会带来很大的安全隐患。Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中使用特定格式直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。jasypt 同一个密钥(secretKey)对同一个内容执行加密,每次生成的密文都是不一样的,但是根据根据这些密文解密成原内容都是可以的。生产环境用户的隐私数据,比如手机号、身份证或者一些账号配置等信息,入库时都要进行不落地脱敏,也就是在进入我们系统时就要实时的脱敏处理。

2023-03-06 18:09:23 1370 2

原创 【SpringBoot初级篇】JdbcTemplate常用方法

1、查询记录条数2、按条件查询记录条数,通过参数绑定3、查询多个字段,返回一个4、查询多条数据,每条数据都以形式返回,整个结果是5、查询单条数据并通过映射成实体对象6、查询对象集合7、将字段到实体映射抽出来单独维护通常在应用中,字段到实体的映射只需要编写一份来维护,因此前边的两例中的映射可以单独抽出来成为一个类:然后在使用的时候创建就行了:8、插入数据并返回生成的主键JdbcTemplate 插入、更新、删除在中,数据的插入、更新、删除操作都是通过来完成的。1、插入单条数据2、批量插入

2023-03-03 15:40:28 4559

原创 【SpringBoot高级篇】SpringBoot集成Sharding-JDBC分库分表

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。简单来说,我们可以将对数据的水平切分理解为按照数据行进行切分,就是将表中的某些行切分到一个数据库表中,而将其他行切分到其他数据库表中。

2023-03-01 16:16:24 1058

原创 【SpringBoot高级篇】SpringBoot集成XXL-JOB分布式任务调度平台

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

2023-01-29 11:05:54 1781

原创 【SpringBoot高级篇】SpringBoot集成RocketMQ消息队列

RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。

2023-01-18 17:58:47 5500 1

原创 【Docker应用篇】Docker安装RocketMQ

2、foxiswho/rockermq镜像stars最多,所以拉取运行该镜像。创建NameServer容器并启动,端口使用 RecketMQ 默认端口。3、创建 broker 容器并启动,因为 Broker 有需要配置需要我们修改,所以在创建 broker 容器时,使用宿主机的配置文件,方便日后修改。5、docker 安装一下 RocketMQ 的可视化管理页面。1、搜索查询远程仓库中rocketmq镜像。4、安装Docker-ce(社区版)4、创建并启动 Broker。5、启动Docker。

2023-01-18 09:40:08 2638

原创 【日常业务开发】策略+工厂模式优化 if...else判断逻辑

此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用。业务中经常有支付业务,项目刚开始所有业务使用支付宝支付,后面湖南地区需要使用微信支付,然后湖北又需要使用易宝支付,后期可能还有扩展。工厂类PayFactory,暴露注册bean到工厂容器Map对象方法,提供根据type类型查询bean的静态方法。Key为bean的名称、value为IPay接口对应的bean实现类。对应的业务类型不好扩展。

2023-01-12 17:57:44 833

原创 【日常业务开发】常用JSON库API

Jackson是当前用的比较广泛的,用来序列化和反序列化json的Java开源框架。Jackson社区相对比较活跃,更新速度也比较快, 从Github中的统计来看,Jackson是最流行的json解析器之一,Spring MVC的默认json解析器便是Jackson。GSON 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,可以快速的将一个 Json 字符转成一个 Java 对象,或者将一个 Java 对象转化为 Json 字符串。

2023-01-12 14:29:02 1474

原创 学习TypeScript(二)---接口

学习TypeScript(二)---接口接口接口初探可选属性只读属性readonly vs const函数类型类类型类实现接口一个类可以实现多个接口接口继承接口接口TypeScript 的核心原则之一是对值所具有的结构进行类型检查。我们使用接口(Interfaces)来定义对象的类型。接口是对象的状态(属性)和行为(方法)的抽象(描述)接口初探需求: 创建人的对象, 需要对人的属性进行一定的约束id是number类型, 必须有, 只读的name是string类型, 必须有age是number类

2023-01-10 09:49:14 444

原创 学习TypeScript(二)---基础类型

学习TypeScript(二)---基础类型基础类型布尔值数字字符串undefined 和 null数组元组 Tuple枚举anyvoidobject联合类型类型断言类型推断基础类型TypeScript 支持与 JavaScript 几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用。布尔值最基本的数据类型就是简单的 true/false 值,在 JavaScript 和 TypeScript 里叫做 boolean(其它语言中也一样)。let isDone: boolean = fals

2023-01-10 09:49:02 339

原创 学习TypeScript(二)---类

学习TypeScript(二)---类类基本示例继承公共,私有与受保护的修饰符默认为 public理解 private理解 protectedreadonly 修饰符参数属性存取器静态属性抽象类类对于传统的 JavaScript 程序我们会使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员使用这些语法就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来的。 从 ECMAScript 2015,也就是 ES6 开始, JavaScript 程序员将能够使用基于类的面向对

2023-01-10 09:48:53 355

原创 学习TypeScript(二)---泛型

学习TypeScript(二)---泛型泛型引入使用函数泛型多个泛型参数的函数泛型接口泛型类泛型约束泛型指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性。引入下面创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 创建一个包含 count 个 value 的数组 不用泛型的话,这个函数可能是下面这样:function createArray(value: any, count: number): any[] { const

2023-01-10 09:48:38 193

原创 【日常业务开发】业务代码常见类命名

Aware就是感知的意思,一般以该单词结尾的类,都实现了Aware接口。说实话,它和Properties的区别并不大,但由于Option通常是一个类,所以功能可以扩展的更强大一些。invoker是一类接口,通常会以反射或者触发的方式,执行一些具体的业务逻辑。5、工具类***Util,***Helper。注意它们语义上的区别,一般特别复杂的转换或者有加载过程的需求,可以使用Resolver。如果你的应用程序,需要经过大量的初始化操作才能启动,那就需要把它独立出来,专门处理初始化动作。

2023-01-09 10:10:24 838

原创 【SpringBoot应用篇】SpringBoot 业务代码中常用技巧

Spring MVC拦截器跟Spring拦截器相比,它里面能够获取和等web对象实例。方法 - 用于在将请求发送到控制器之前执行操作。此方法应返回true,以将响应返回给客户端。目标方法执行后执行请求完成时执行为了方便我们一般情况会用接口的实现类类。登录验证,判断用户是否登录。权限验证,判断用户是否有权限访问资源,如校验token日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。处理cookie、本地化、国际化、主题等。性能监控,监控请求处理时长等。

2023-01-05 09:45:19 844 2

原创 【SpringBoot应用篇】SpringBoot 启动扩展点/常用接口

这个接口实际上我们也是非常的熟悉,该接口在我们剖析注解配置AOP的时候是我们的老朋友,实际上,注解配置的AOP是间接实现 BeanPostProcess 接口的,而 InstantiationAwareBeanPostProcessor 就是继承该接口。一般情况下,Spring通过反射机制利用bean的class属性指定支线类去实例化bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在bean中提供大量的配置信息。Spring为此提供了一个。

2023-01-04 14:39:44 895

原创 【SpringBoot应用篇】SpringBoot集成j2cache二级缓存框架

j2cache是OSChina(开源中国)目前正在使用的两级缓存框架。L1: 进程内缓存 caffeine/ehcacheL2: 集中式缓存 Redis/Memcachedj2cache其实并不是在重复造轮子,而是作资源整合,即将Ehcache、Caffeine、redis、Spring Cache等进行整合。J2Cache 的使用场景: 由于大量的缓存读取会导致L2的网络成为整个系统的瓶颈,因此L1的目标是降低对L2的读取次数。该缓存框架主要用于集群环境中。

2023-01-01 15:02:17 1843 2

原创 【SpringBoot应用篇】SpringBoot集成AntiSamy防御XSS(跨站脚本攻击)--过滤器实现

XSS:跨站脚本攻击(Cross Site Scripting),为不和 CSS混淆,故将跨站脚本攻击缩写为XSS。XSS是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。有点类似于sql注入。XSS攻击原理:HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(

2022-12-29 22:23:12 1447

原创 【SpringMVC应用篇】SpringMVC 参数解析器

参数解析器属于spring-web包中提供的组件,springmvc框架中对应提供了很多参数解析器。@PostMapping("/save") //此处request对象就是通过Springmvc提供的参数解析器帮我们注入的 public String saveUser(HttpServletRequest request) {} }在上面的saveUser方法中,我们声明了一个类型为的参数,这个对象就是通过springmvc提供的这个参数解析器帮我们注入的。

2022-12-29 22:10:28 450

原创 【SpringBoot应用篇】【AOP+注解】SpringBoot使用Aspect AOP注解实现日志管理(增强版)

需求: 需要保存的日志内容在方法的参数中,并且方法参数的类型对象不一样,且对象的属性名称不一样。解决思路:1、添加类型转换器Convert接口,需要转换的类型继承Convert接口2、@Log注解中添加Convert接口类型的Class属性3、在切面环绕通知中进行处理。

2022-12-28 23:18:26 1152 1

原创 【SpringBoot应用篇】SpringBoot集成Knife4j在线接口文档

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!其底层是对Springfox的封装,使用方式也和Springfox一致,只是对接口文档UI进行了优化。核心功能文档说明:根据Swagger的规范说明,详细列出接口文档的说明,包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息,对该接口的使用情况一目了然。在线调试。

2022-12-27 11:35:16 414

原创 【Java高级篇】线程池应用(三)

同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。1、可以让调用线程异步处理结果,实际是其他线程去同步等待。这时既可以使用同步处理,也可以使用异步来处理。2、必须等待线程结束,不能配合线程池使用。3、以任务为中心,而不是以线程为中心。2、可以方便地分离不同职责的线程池。get 方法是让调用线程同步等待。

2022-12-12 11:46:27 593

SpringCloud Alibaba 组件骨架

SpringCloud Alibaba 组件骨架

2023-09-07

职场人的劳动法宝典(5月最新版)

职场人的劳动法宝典(5月最新版)

2023-09-07

空空如也

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

TA关注的人

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