自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java HashMap原理

同时,也应该注意控制HashMap的大小,以避免负载过高的情况。当向HashMap中插入一个新的键值对时,首先会使用散列函数计算出该键的散列值,然后将该键值对插入到相应的桶中。初始容量是指HashMap在创建时的桶数量,加载因子是指当HashMap的桶使用率达到一定程度时,就需要扩容的阈值。HashMap是一种高效的映射数据结构,在使用时应该注意选择合适的散列函数,控制负载,以及在多线程环境下使用线程安全版本。因此,在使用HashMap时,应该根据实际情况调整初始容量和加载因子的设置,以达到最优的性能。

2022-12-29 09:00:00 441

原创 Java开发主流框架有哪些?

SSM是一种Java Web开发的组合框架,是Spring、Spring MVC和MyBatis的缩写。

2022-12-28 13:07:20 3704 1

原创 Java 程序员,真的不能去外包吗?

在选择外包公司工作时,应该考虑自己的专业能力和技术方向,外包公司的工作环境和文化,以及外包公司的发展前景和客户群。外包公司的项目需求会因客户的业务不同而有所差异,因此应该根据自己的专业能力和技术方向来选择适合自己的项目。总之,在选择外包公司工作时,应该考虑自己的个人偏好和生活方式,以及外包公司的职业发展机会和培训支持。总之,Java程序员是可以去外包公司工作的,但是应该认真考虑自己是否有能力适应外包公司的工作环境和要求。在选择外包公司工作时,应该注意一些因素,以便能够找到适合自己的工作机会。

2022-12-28 10:53:14 2678

原创 公司禁止JOIN查询怎么办?

使用视图时,可以创建一个视图,其中包含使用join查询的SQL语句。然后,就可以像查询普通表一样查询视图。如果公司禁止使用join查询,那么可以考虑使用其他方法来代替join查询。例如,可以使用子查询或者视图来替代join查询。总之,在不能使用join查询的情况下,可以考虑使用子查询、视图或存储过程来获取两个表之间的关联数据。还有一种方法是使用存储过程,在存储过程中使用join查询,然后通过调用存储过程来获取数据。使用子查询时,可以在主查询的where子句中使用子查询,以获取需要的数据。

2022-12-28 09:00:00 1357 1

原创 MybatisPlus多表连接查询一对多分页查询数据

在日常一线开发过程中,多表连接查询不可或缺,基于MybatisPlus多表连接查询究竟该如何实现,本文将带你找到答案。

2022-12-01 13:25:54 2778

原创 EntityUtils MapStruct BeanCopier 数据实体类转换工具 DO BO VO DTO 附视频

在实际项目开发过程中,总有数据实体类互相转换的需求,DO、BO、VO、DTO等数据模型转换经常发生。

2022-11-23 08:00:00 1279

原创 TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频

TreeUtils工具类

2022-11-22 11:21:14 232 1

原创 TreeUtils工具类一行代码实现列表转树 实战Java8 三级菜单 三级分类 附视频

在日常一线开发过程中,总有`列表转树`的需求,几乎是项目的标配,比方说做多级菜单、多级目录、多级分类等,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦身,提高开发效率。本文将基于Java8的Lambda 表达式和Stream等知识,使用`TreeUtils`工具类实现一行代码完成列表转树这一通用型需求。

2022-11-18 10:57:16 514

原创 实战讲解MybatisPlus DO PO BO DTO VO 数据模型及其流转 附视频

在使用MybatisPlus作为DAO层访问数据库日益普及的今天,相应数据模型的理解变得越发的重要。如何应对企业级复杂多变的场景、如何将代码书写的更为整洁,这些都是广大技术朋友需要思考的问题。本文将从实战的角度带来基于MybatisPlus作为DAO层访问数据库的前提下,解释各种数据模型的内涵以及数据模型之间的流转问题。本文有视频版,传送门纸上得来终觉浅,深刻理解各种概念的内涵只有通过实战编码,才能理解其概念的内涵。

2022-11-15 10:58:11 2852

原创 MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy

本方案很好的实现了MybatisPlus基于Lambda表达式实现聚合操作,代码在形式上与单表保持统一,代码优雅。

2022-11-07 17:49:44 8098

原创 程序员如何利用技术能力变现

本质上来说,程序员是手艺人,有手艺的人就能做出别人做不出来的东西,而付费也是一件很自然的事了。那么,这个问题就成了,如何让自己的“手艺”更为值钱的问题了。任何一件成功的大事,都是通过一个一个的小成功达到的。所以,你得确保你有一个一个的小成功。具体说来,首先,你得让自己身边的人有求于你,或是向别人推荐你。这就需要你能够掌握大多数人不能掌握的技能或技术,需要你更多地学习,并要有更多的别人没有的经验和经历。一旦你身边的人开始有求于你,或是向别人推荐你,你就会被外部的人注意到,于是其他人就会付费来获取你的帮助。..

2022-07-10 19:42:47 164

原创 分享几个 Github 镜像网站(亲测可用)

GitHub 在国内经常会出现无法访问的情况,下面分享几个 GitHub 镜像站供大家使用!

2022-07-05 13:29:55 96628 9

原创 基于MybatisPlus代码生成器(2.0新版本)

实时读取库表结构元数据信息,比如表名、字段名、字段类型、注释等,选中修改后的表,点击,代码成即可提现出表结构的变化。单表快速转化restful风格的API接口并对外暴露服务。对于百余张表的数据库,使用代码生成器让开发事半功倍。多表连接查询。多表连接查询默认不开启,需要在全局文件中手动配置。开启多表连接查询后,代码生成器会自动读取数据库元数据信息中的,分别生成、、风格的源代码。生成的代码接口可通过Swagger暴露。代码生成器运行依赖,版本不限。Mysql数据库中库表结构为用户自定义的库表,代码生成将会读取。

2022-06-16 09:41:22 519

原创 Java使用FreeMarker模版技术动态生成word实践

在日常开发中,常常有动态word文件生成的需求,通过编制模版,然后动态修改word内容以组合成新的文件。报告单、请假单、发票页等都可以使用动态生成word来解决。笔者总结归纳出通用技术要点,尽可能降低广大开发者的使用技术门槛。通过查询数据库获取需要修改的数据,或者是调用远程API接口获得数据,数据准备完毕后,进入下一步。新建并设计出期望效果的word文档样式,包含字体、字号、段落样式布局等,先做出一个静态的word文件。在新建word模版的基础上,使用freemark语法,结合已经准备填充的数据结构,将需要

2022-06-14 09:53:32 424

原创 StampedLock读写锁性能之王

一、序言StampedLock是Java 8新引入的高效读写锁。StampedLock实现了不仅多个读不互相阻塞,同时在读操作时不会阻塞写操作。核心思想在于,在读的时候如果发生了写,应该通过重试的方式来获取新的值,而不应该阻塞写操作。这种模式也就是典型的无锁编程思想,和CAS自旋的思想一样。这种操作方式决定了StampedLock在读线程非常多而写线程非常少的场景下非常适用,同时还避免了写饥饿情况的发生。二、读写锁StampedLock相较于普通读写锁,增加了一种乐观读。(一)写锁涉及对共享资源

2022-04-25 10:07:43 293

原创 Java指令重排序在多线程环境下的应对策略

一、序言指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响;在多线程环境下,指令重排会给程序带来意想不到的错误。本文对多线程指令重排问题进行复原,并针对指令重排给出相应的解决方案。二、问题复原(一)关联变量下面给出一个能够百分之百复原指令重排的例子。public class D { static Integer a; static Boolean flag; public static void writer() { a =

2022-04-23 10:40:32 520

原创 Synchronized锁及其膨胀

一、序言在并发编程中,synchronized锁因其使用简单,在线程间同步被广泛应用。下面对其原理及锁升级过程进行探究。二、如何使用1、修饰实例方法当实例方法被synchronized修饰时,通过当前实例调用此方法的所有线程共用一把锁,不同对象调用此方法线程间互不影响。public class A { public synchronized void func() { }}当使用synchronized锁修饰实例方法,锁添加在当前类的实例上,有多少个实例可添加多少把

2022-04-22 10:40:10 190

原创 JDK内置锁深入探究

一、序言本文讲述仅针对 JVM 层次的内置锁,不涉及分布式锁。锁有多种分类形式,比如公平锁与非公平锁、可重入锁与非重入锁、独享锁与共享锁、乐观锁与悲观锁、互斥锁与读写锁、自旋锁、分段锁和偏向锁/轻量级锁/重量级锁。下面将配合示例讲解各种锁的概念,期望能够达到如下目标:一是在生产环境中不错误的使用锁;二是在生产环境中选择恰当的锁。对锁了解不多的情况下,应该首先保证业务的正确性,然后考虑性能,比如万金油synchronized锁或者自带多重属性的ReentrantReadWriteLock锁。不因并发导

2022-04-20 11:33:48 586

原创 短信接口防盗刷解决方案

一、序言在Web开发中,总有一些接口需要暴露在用户认证前访问,短信发送接口特别是短信验证码注册接口便是其中典型的一类,这类接口具有如下特点:流量在用户认证之前流量在用户认证之前,意味着无法获取用户ID等唯一标识符信息对流量限流手机号未知手机号未知意味着无法对待发送短信的手机号做精准检测,判断是否是合法的手机号。通过正则表达式判断手机号连号过多,容易滋生短信盗刷。本文将重点聚焦接口的防盗刷实践。二、盗刷流量在解决防盗刷之前先认识盗刷流量的特点和防盗刷的目标。(一)防盗刷的目标1、减

2022-04-12 11:43:47 3578 2

原创 Java多线程与线程池技术

一、序言Java多线程编程线程池被广泛使用,甚至成为了标配。线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批线程,当有需要使用线程时从线程池取出,用完后放回线程池,这样避免了频繁创建与销毁线程。// 任务Runnable runnable = () -> System.out.println(Thread.currentThread().getId());在应用中优先选用线程池执行异步任务,根据不同的场

2022-04-06 12:00:40 139

原创 Quartz高可用定时任务快速上手

定时任务使用指南如果你想做定时任务,有高可用方面的需求,或者仅仅想入门快,上手简单,那么选用它准没错。定时任务模块是对Quartz框架进一步封装,使用更加简洁。1、引入依赖<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-quartz</artifactId> <version>1.5.4.1</versio

2022-04-01 21:31:30 778

原创 Spring Cache缓存框架

一、序言Spring Cache是Spring体系下标准化缓存框架。Spring Cache有如下优势:缓存品种多支持缓存品种多,常见缓存Redis、EhCache、Caffeine均支持。它们之间既能独立使用,也能组合使用。平滑迁移Spring内部支持的缓存,可实现无缝平滑迁移,无需修改业务逻辑。注解缓存的实现依赖于动态代理。大多数情况下使用的是注解版、少数情况下也能使用编程版。注解版与业务代码高度解藕,因其依托动态代理技术实现,使用场景上有一定的限制。编程版嵌入业务代码,代码顺序执行

2022-03-29 15:37:36 2025

原创 请求合并与拆分在并发场景中应用

一、序言在并发场景中,当热点缓存Key失效时,流量瞬间打到数据库中,此所谓缓存击穿现象;当大范围的缓存Key失效时,流量也会打到数据库中,此所谓缓存雪崩现象。当使用分布式行锁时,能够有效解决缓存击穿问题;当使用分布式表锁时,能够解决缓存雪崩问题。实际操作中,分布式表锁不在考虑范围,理由是降低并发量。本文将从另一个角度出发,将请求流量合并和拆分,以提高系统的并发量。二、理论基础流量的合并与拆分原理是将多条请求合并成一条请求,执行后再将结果拆分。在数据库与缓存架构中,缓存Key失效的瞬间,大量重复请求

2022-03-16 09:49:56 246

原创 数据库与缓存数据一致性解决方案

一、序言在分布式并发系统中,数据库与缓存数据一致性是一项富有挑战性的技术难点。本文将讨论数据库与缓存数据一致性问题,并提供通用的解决方案。假设有完善的工业级分布式事务解决方案,那么数据库与缓存数据一致性便迎刃而解,实际上,目前分布式事务不成熟。二、不同的声音在数据库与缓存数据一致解决方式中,有各种声音。先操作数据库后缓存还是先缓存后数据库缓存是更新还是删除1、操作的先后顺序在并发系统中,数据库与缓存双写场景下,为了追求更大的并发量,操作数据库与缓存显而易见不会同步进行。前者操作成功后者以

2022-03-15 10:45:34 988

原创 基于Redis分布式BitMap的应用

一、序言在实际开发中常常遇到如下需求:判断当前元素是否存在于已知的集合中,将已知集合中的元素维护一个HashSet,使用时只需耗时O(1)的时间复杂度便可判断出结果,Java内部或者Redis均提供相应的数据结构。使用此种方式除了占用内存空间外,几乎没有其它缺点。当数据量达到亿级别时,内存空间的占用显著表现出来,BitMap便是解决此类问题的一种途径。二、BitMap结构1、内存消耗分析Redis BitMap能够存储的数据范围为[0,2^32-1],超过Integer.MAX_VALUE上界值。

2022-03-04 09:45:43 899

原创 应用系统缓存体系深入研究(Java版)

一、序言在使用MyBatis、MybatisPlus等DAO层数据库访问框架式,常常会与一级缓存、二级缓存打交道,为了增强对缓存体系的整体把控力,提高软件应用响应速度,这里对三级缓存一次梳理。缓存固然能够提高系统性能,与此同时也带来了脏数据的副作用,系统的缓存体系、缓存结构、缓存策略、缓存介质等对可能出现的脏数据产生影响。缓存是一把双刃剑,既能够提高应用系统的效率,同时避免脏数据发生也是不小的工作量。特别是不同的层次的缓存同时使用时,出现数据异常的概率快速提高。二、一级缓存以MyBatis技术为

2022-03-02 09:52:54 118

原创 SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表实践

一、序言在实际业务中,单表数据增长较快,很容易达到数据瓶颈,比如单表百万级别数据量。当数据量继续增长时,数据的查询性能即使有索引的帮助下也不尽如意,这时可以引入数据分库分表技术。本文将基于SpringBoot+MybatisPlus+Sharding-JDBC+Mysql实现企业级分库分表。1、组件及版本选择SpringBoot 2.6.xMybatisPlus 3.5.0Sharding-JDBC 4.1.1Mysql 5.7.352、预期目标使用上述组件实

2022-03-01 10:16:04 472

原创 ClickHouse在大数据领域应用实践

一、序言面向大数据量查询数据库,优点是在较大数据量(千万级)的前提下具有较好的查询性能。1、应用场景ClickHouse应用于OLAP(在线分析处理)领域,具体来说满足如下特点使用此技术比较合适:事务型数据库表通过连表查询转换成宽表聚合(统计)计算使用较多对查询效率要求较高,有限时间范围内能够容忍非幂等性查询(最终一致性)2、学习姿势大多数学习ClickHouse是从OLTP数据库开始的,比如Mysql数据库。对于千万级别的数据,以InnoDB为存储引擎的表,仅仅是统计表行数这一需求,执

2022-02-25 10:23:03 329

原创 【Java8新特性】Optional类在处理空值判断场景的应用 回避空指针异常 编写健壮的应用程序

一、序言空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常。Java8新特性之Optional为此类问题提供了优雅的解决方式。广大程序员朋友对空值异常刻骨铭心,因此Optional一经推出,广受赞誉。二、问题复原(一)素材准备public class LoginUser implements UserDetails { private Long deptId; private String token; private Lon

2022-02-24 11:07:47 306

原创 SpringBoot2.6.x默认禁用循环依赖后的应对策略

一、序言SpringBoot 2.6.x不推荐使用循环依赖,这是一个好消息,SpringBoot从底层逐渐引导开发者书写规范的代码,同时也是个忧伤的消息,循环依赖的应用场景实在是太广泛了。如果从低版本升级到2.6.x,那么很大概率遇到的第一个问题便是循环依赖问题。二、问题复原1、代码说明下面风格的代码比较普遍:两个类都有调用对方方法的需求,因此很容易写成循环引用。@Servicepublic class TbDeptServiceImpl extends ServiceImpl<TbDe

2022-02-23 09:34:43 3761 1

原创 【摸鱼神器】UCode Cms管理系统 内置超好用的代码生成器 解决多表连接痛点

一、序言UCode Cms内容管理系统是Java知识图谱的重要组成部分,是面向企业级应用软件开发的脚手架。当前版本1.3.3。使用简易demo项目快速体验地址 。(一)项目特点1、源码开源源码开源并且使用MIT开源许可协议,个人或者企业用户免费放心使用,项目源码地址。2、快速上手新建空项目,引入相关依赖,初始化数据库,启动项目,一个项目脚手架便搭建完成,更加便捷的操作是克隆demo项目,修改数据库连接并启动项目。<!--ucode-cms核心依赖--><dependenc

2022-02-21 12:24:19 1212 1

原创 基于SSM源代码风格Java代码生成器 Maven版开箱即用 摸鱼神器

一、序言UCode Cms 是一款Maven版的Java源代码生成器,是快速构建项目的利器。代码生成器模块属于可拆卸模块,即按需引入。代码生成器生成SSM(Spring、SpringBoot、MybatisPlus)风格的源代码。面试时经常提到面向对象编程,实际开发中常常是面向数据库编程,随着需求的快速变化,数据库的库表结构也需要相应变化,如何根据库表结构的变化,快速响应到源代码层次,是Java代码生成器主要的关切点。功能亮点实时读取库表结构元数据信息,比如表名、字段名、字段类型、注释等,选中修改后

2022-02-16 11:46:05 993

原创 Lombok入门到精通

一、序言对于 Lombok 的使用是有争议的,作者对 Lombok 的态度是强烈推荐,甚至认为应当将部分常用功能直接以 JDK 的形式集成。在构建实体类过程中写一堆Set/Get方法毫无意义;默认继承Object类的toString方法官方建议重写,每个实体类为了表达具象的实体信息而重写toString方法,操作繁琐。二、常用注解解析(一)实体类注解下面讨论的注解是添加到实体类上面的。public class XUser { private Integer userId; pri

2022-02-16 08:56:48 178

原创 Redis集群模式高可用实践

本文搭建Redis集群服务

2022-02-15 08:00:00 269

原创 Jenkins敏捷开发 自动化构建工具

一、序言Jenkins 是一款自动化构建工具,能够基于 Maven 构建后端 Java 项目,也能够基于 nodejs 构建前端 vue 项目,并且有可视化 web 界面。所谓自动化构建是按照一定的策略执行打包脚本,相对于普通脚本构建,Jenkins 有如下优势:构建队列中能够同时构建多个项目,包含前端和后端项目;定时构建;代码仓库触发构建(普通脚本无法实现);Jenkins 体现一种项目管理思维:开发人员的贴心助理,集中精力专注于业务开发;尽早的实现代码集成(包含前后端)以便尽早发现问题;

2022-02-11 09:05:46 270

原创 Redis哨兵模式高可用解决方案

一、序言Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务。1、目标与收获一主两从三哨兵Redis服务,基本能够满足中小型项目的高可用要求,使用Supervisor监控并管理Redis实例。通过本文将完成如下目标:哨兵模式服务规划与搭建哨兵模式服务相比于单机版服务更加可靠,适合读写分离、数据量不是很大、要求可靠稳定性的场景。客户端整合与读写分离通过Spring框架对哨兵模式进行连接,完成生产环境的常见操作。2、端口规划端口规划是完

2022-02-10 09:42:46 721

原创 Nginx网络压缩 CSS压缩 图片压缩 JSON压缩

使用Nginx作为web应用服务时,会代理如下常见文件:js、css、JSON、图片等,本文提供基于Nginx内置的压缩技术,提供网络请求响应速度的解决方案。网络压缩的原理是消耗CPU资源,减少文件在公网传输的大小,提高响应速度。相比于CPU的计算资源,网络带宽通常较为昂贵,因此通过CPU资源置换网络带宽资源在实际生产中是可行的操作方案。

2022-02-08 09:28:30 2137

原创 Supervisor多进程管理 异常自动重启 可视化管理

Supervisor是多进程管理工具,在Docker中相关联的进程能够通过supervisor来管理。微服务项目开发阶段,可用于微服务子项目的启动管理。支持web可视化管理,能够极大方面开发者对项目状态的监控和重启管理。

2022-02-07 14:26:06 1856

原创 Caffeine缓存 最快缓存 内存缓存

一、序言Caffeine是一个进程内部缓存框架。对比Guava CacheCaffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。使用Caffeine后无需使用Guava Cache,从并发的角度来讲,Caffeine明显优于Guava,原因是使用了Java 8最新的StampedLock锁技术。二、缓存简介(一)缓存对比从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性。下面对比三种常用缓存:Redis、EhCach.

2022-01-21 10:51:22 4035

原创 MybatisPlus多表连接查询

一、序言(一)背景内容软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多么的风光,使用XML文件解决了复杂的数据库访问的难题。时至今日,曾经的屠龙者终成恶龙,以XML文件为基础的数据库访问技术变得臃肿、复杂,维护难度直线上升。MybatisPlus对常见的数据库访问进行了封装,访问数据库大大减少了XML文件的依赖,开发者从臃肿的XML文件中获得了较大限度的解脱。MybatisPlus官方并没有提供多表连接查询的通用解决方案,然而连接

2022-01-20 08:52:17 63921 19

空空如也

空空如也

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

TA关注的人

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