Java
文章平均质量分 85
Java基础知识
庄周de蝴蝶
鱼鱼要加油(。>∀<。)
展开
-
解决达梦集成 JPA 时表和字段注释注解不生效的问题
最近在做达梦数据库集成 JPA 时,发现使用的表注解和字段注解均未生效(MySQL、Oracle、PostgreSQL中均可以在建表时正常生成相应的注释),经过调试发现解决办法也很简单:自定义方言类继承自,重写/*** 自定义 dm 方言类*/@Overridespring : jpa : # 根据自己的类路径进行修改 database-platform : cn.butterfly.config.MyDmDialect如果大家也在使用达梦集成 JPA 时遇到了以上问题,按照上述说明配置即可。原创 2024-03-12 08:00:00 · 1082 阅读 · 0 评论 -
IntelliJ IDE 插件开发 | (一)快速入门
IntelliJ IDEA 作为 Java 开发的首选 IDE,其强大、方便之处不必多说。不过,由于个人或者团队的个性化需求,我们或多或少会想对其功能进行拓展,这时就需要开发插件(在 IntelliJ 平台下的所有 IDE 均可运行)才能满足。原创 2023-11-16 16:50:08 · 2180 阅读 · 0 评论 -
SpringBoot 实现数据加密存储的五种方式
最近由于项目需要做等保,其中有一项要求是系统中的个人信息和业务信息需要进行加密存储。经过一番搜索,最终总结出了五种数据加密存储的方法(结合SpringBoot和框架进行实现),不知道家人们在项目中使用的是哪种方式🤔,如果有更好地方式也欢迎一起交流😊~~~,本文所贴出的完整代码已上传到GitHub。原创 2023-11-08 16:07:34 · 1649 阅读 · 0 评论 -
Nacos 实现服务平滑上下线(Ribbon 和 LB)
不知道各位在使用的时候有没有遇到过服务刚上线偶尔会出现一段时间的,或者服务下线后,下线服务仍然被调用的问题。而以上问题都是由于Ribbon或者的默认处理策略有关,其中Ribbon默认是 30s 更新一次服务信息,则是默认 35s 更新一次缓存。接下来本文讲解则如何通过监听Nacos的服务变更事件来实时进行相关服务的更新,以实现服务的平滑上下线。原创 2023-09-28 13:37:17 · 2294 阅读 · 0 评论 -
Stream 和函数式接口的基础讲解
前言关于 Stream 和函数式接口的基础概念的文章已经有很多,相信很多小伙伴也在实际工作中进行使用体验了。但是关于函数式接口的使用,部分小伙伴可能接触的比较少,其实我们经常使用的 map、filter 等方法内部就使用了函数式接口的知识:// 以下两个接口截取自 Java8 源码中的定义, 这里的 Function<? super T, ? extends R>// 和 Predicate<? super T> 就属于函数式接口方面的知识<R> Stream&原创 2022-02-19 21:08:19 · 797 阅读 · 2 评论 -
Canal 结合 RocketMQ 实现数据的增量同步
前言Canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费,工作原理如下:Canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 Canal )Canal 解析 binary log 对象(原始为 byte 流)可以用于以下业务场景:数据库镜像数据库实时备份索引构建和实时原创 2022-01-30 23:04:30 · 4872 阅读 · 0 评论 -
基于 MPTT 简单实现部门树管理
前言MPTT即Modified Preorder Tree Taversal,直译就是修改的先序树遍历。而实际也正是如此,MPTT就是在对树进行先序遍历的基础上在每个节点中增加了left和right属性,最终让树的查询操作(例如查询某个节点的所有子节点、查询所有的叶子节点)变得十分高效。接下来,本文就来介绍MPTT的一些基本概念及对应的数据据库中的表结构,并通过一个简单的基于SpringBoot + Vue框架的例子进行实战讲解,本文所使用的代码已上传到GitHub。先序遍历与MPTT在介绍MPTT前原创 2021-12-28 08:00:00 · 1704 阅读 · 2 评论 -
GitHub OAuth2 第三方登录及自定义认证服务器的实现
前言本文将介绍如何访问基于OAuth2协议的GitHub用户信息API接口以及如何自己实现一个简单的基于授权码模式的认证服务器,如果对OAuth2的基本概念和四种授权模式还不熟悉,可以先看一下阮一峰老师的博客:OAuth 2.0 的一个简单解释,本文则主要以实际的demo来讲解使用方法。本文所展示示例的完整代码已上传到GitHub。GitHub 第三方登录前置准备在访问Github的API接口之前,需要先访问https://github.com/settings/applications/new,然原创 2021-11-21 18:52:16 · 2294 阅读 · 2 评论 -
Java 17 实现 cls 清屏功能(与 jni 比较)
前言以往如果需要调用C/C++代码去实现一些底层的操作,需要使用JNI(Java Native Interface)。就以cls清屏功能为例,需要自己编写相应的C/C++并生成dll文件,然后再通过JNI的方式调用dll来实现相应的功能,具体步骤可以参考这篇博客:使用JNA在Java中实现cls(命令行清屏)功能,这里展示了如何使用基于JNI的JNA框架来调用dll文件去实现cls清屏功能。而在Java 17中,我们便不再需要编写C/C++代码以及生成dll文件,而仅仅只需要写Java代码即可(目前还处于原创 2021-11-20 16:44:18 · 2665 阅读 · 0 评论 -
扫码登录的简单实现
前言本文将介绍基于SpringBoot + Vue + Android实现的扫码登录demo的总体思路,完整代码已上传到GitHub。Web端体验地址:http://47.116.72.33/(只剩一个月有效期),apk下载地址:https://github.com/zhangjiwei1221/qrscan/releases/tag/0.0.1。用户名:非空即可,密码:123456,效果见文末,整体实现如有不妥之处,欢迎交流讨论,实现部分参考二维码扫码登录是什么原理。项目简介后端:SpringBoo原创 2021-09-21 21:56:37 · 7263 阅读 · 26 评论 -
以若依为例讲解函数式接口的应用
前言函数式接口作为Java8的新特性之一,和Stream一样可以让Java代码变得更加简洁优雅,而本文将以若依项目的代码为例,讲解如何使用函数式接口重写其中关于角色管理、岗位管理、参数管理等的新增和修改校验的代码,提供一个在日常中使用函数式编程优化代码的思路,如有错误之处,欢迎一起讨论。逻辑梳理在正式改造之前,我们先梳理一下新增和修改中的校验逻辑,以参数管理为例,在新增或者修改时,会对参数的键名进行校验:在新增的时候,整个校验逻辑则比较简单,只需要按照参数键名到数据库到数据库中进行查询即可,如果查原创 2021-09-11 09:21:18 · 1008 阅读 · 0 评论 -
使用 EasyExcel 动态添加自增序号列
前言本文将介绍如何通过使用EasyExcel自定义拦截器实现在最终的Excel文件中新增一列自增的序号列,最终的效果如下:此外,本文所使用的完整代码示例已上传到GitHub。实现本文主要是通过自定义一个继承AbstractRowWriteHandler的拦截器来实现在最终导出的结果中新增序号列,通过修改源码中保存头部标题的Map内容来给自己添加的序号列留出位置,先展示最终的代码:/** * 自定义 excel 行处理器, 增加序号列 * * @author butterfly * @da原创 2021-09-05 16:20:34 · 6021 阅读 · 11 评论 -
JDK 安装及配置总结(多平台)
文章目录前言WindowsLinuxMacOS资源链接总结前言本文将介绍JDK的基本安装及配置,并给出不同平台(Windows、Linux、MacOS)下的安装方式。同时,本文所使用的JDK版本文件可见文末的网盘链接或者通过官网链接自行选择下载。Windows首先将jdk1.8.0_291.zip文件解压到一个文件夹下,我这里解压到D:\\java目录下:接下来就需要进行环境变量相关的配置,以便可以全局使用java命令,而例如tomcat等软件也依赖JAVA_HOME来找到java的位置,下面就原创 2021-06-27 22:16:09 · 501 阅读 · 1 评论 -
Java 跨平台获取 MAC 地址的两种方法
前言有时我们因为软件授权或者其它需要获取主机唯一标识而需要获取用户主机的MAC地址,而本文则将介绍如何通过Java来实现跨平台获取MAC地址的两种方法,同时具体的代码也已上传到GitHub。如果不希望将 GitHub 的代码克隆到本地查看,但是又无法忍受在网页查看代码时无限的链接嵌套,可以尝试在网址的 GitHub 单词后加上 1s,即可在网页中有通过 VSCode 查看代码的效果,例如本文是 https://github1s.com/zhangjiwei1221/blog/blob/master/m原创 2021-05-30 20:26:58 · 627 阅读 · 2 评论 -
单调栈、单调队列及其应用
定义单调栈,顾名思义,即内部元素满足单调递增(递减)的栈,下面用Java代码展示一个栈内单调递减的实现:public static void main(String[] args) { int[] nums = { 3, 7, 6, 5, 4, 1, 8, 2 }; Deque<Integer> stack = new LinkedList<>(); for (int num : nums) { // 如果栈非空,判断栈顶元素是否小于当前遍原创 2021-03-07 15:17:14 · 313 阅读 · 2 评论 -
SpringBoot + Vue 实现基于 WebSocket 的聊天室(单聊)
前言在前一篇文章SpringBoot 集成 STOMP 实现一对一聊天的两种方法中简单介绍了如何利用 STOMP 实现单聊,本文则将以一个比较完整的示例展示实际应用,不过本文并未使用 STOMP,而是使用了基础的 websocket 进行实现,如果想利用 STOMP 实现,参考上一篇文章稍加修改即可,此外,建议你阅读以下前置知识,如果比较熟悉就不再需要了:模拟 Tim 实现自定义的且可动态显示的滚动条SpringBoot 集成 WebSocket 简单模拟群发通知云服务器安装redis及与Spri原创 2021-02-07 15:22:46 · 9773 阅读 · 53 评论 -
SpringBoot 集成 STOMP 实现一对一聊天的两种方法
前言之前写过一篇SpringBoot 配置基于 wss 和 STOMP 的 WebSocket,而本文则将介绍两种实现单点聊天的方法,如果对配置基于 STOMP 和 wss 的 WebSocket 不太熟悉,建议先回看一下,本文的完整代码同样也已上传到GitHub。效果在介绍最终的实现之前,先看一下效果,为了方便展示,使用了 iframe,以便可以同时展示四个窗口:实现为了实现能够将信息发给特定的用户,本文主要借用了 spring-messaging 的 SimpMessagingTemplat原创 2021-02-06 14:59:48 · 2100 阅读 · 12 评论 -
SpringBoot + Vue 集成 JWT 实现 Token 验证以及一种 Token 刷新策略的实现
前言本文将介绍基于 SpringBoot 和 Vue 的前后端分离项目集成 JWT 的一种思路,此外还包括在包括记住密码功能情况下 Token 的刷新策略,本文假设你对以下知识有一定的了解,如果未接触过,建议先看一下推荐链接的内容:JWT 的基本知识:JWT入门教程跨域问题:解决前后端分离项目跨域问题SpringBoot 集成 redis:通过源码了解redis的自动配置下面这张图是本文实现 Token 验证以及刷新 Token 的基本思路,本文展示了实现最终效果的核心代码,完整代码(包括前端原创 2021-02-01 13:00:36 · 1737 阅读 · 7 评论 -
几种解决 element-ui 的 el-upload 组件上传文件跨域问题的方法
前言最近在开发基于 SpringBoot 和 Vue 的前后端分离项目的时候,在使用 element-ui 的 el-upload 组件的时候遇到了跨域的问题,尽管之前我也写过一篇关于解决跨域问题的文章,但是发现还是无法解决使用 action 时的跨域问题,因此本文将基于后端 SpringBoot 和 基于 nginx 反向代理的解决跨域的方法,本文的完整代码(前端和后端代码)也已上传到GitHub。使用 action 的解决方法在具体的讲解之前先声明,本文的后端都基于 8888 端口,前端基于 8原创 2021-01-27 11:36:39 · 22604 阅读 · 21 评论 -
SpringBoot 配置基于 wss 和 STOMP 的 WebSocket
前言在上一篇文章中讲了如何在 SpringBoot 中配置 WebSocket 模拟实现群发消息的功能,本文则将进一步讲解如何在 SpringBoot 中配置基于 wss 协议和 STOMP 的 WebSocket,本文假设你对 STOMP 协议有一定的了解,否则建议你先了解一下 STOMP 协议,可以参考这篇文章,此外不同于上一篇的代码示例比较复杂,本文将用尽可能少的代码为你展示效果,同样本文的完整代码已上传到GitHub,下面就正式开始。效果展示同上一篇一样,在展示具体的代码配置之前,先展示一下最原创 2021-01-20 19:24:26 · 7124 阅读 · 7 评论 -
SpringBoot 集成 WebSocket 简单模拟群发通知
前言早期,很多网站为了实现推送技术,所用的技术都是轮询。轮询是指由浏览器每隔一段时间(如每秒)向服务器发出HTTP请求,然后服务器返回最新的数据给客户端。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求与回复可能会包含较长的头部,其中真正有效的数据可能只是很小的一部分,所以这样会消耗很多带宽资源。比较新的轮询技术是Comet。这种技术虽然可以实现双向通信,但仍然需要反复发出请求。而且在Comet中普遍采用的HTTP长连接也会消耗服务器资源。在这种情况下,HTML5定义了原创 2021-01-18 15:59:37 · 1079 阅读 · 14 评论 -
Java | 使用JNA在Java中实现cls(命令行清屏)功能
前言本文将通过示例代码讲解如何在Java中通过使用JNA来调用cls命令行清屏功能,代码已同步到GitHub,此外本文不是专门讲解JNA的使用的,如需学习可到GitHub查看官网示例,下面我就开始通过编写实例代码来展示如何通过JNA调用本地dll文件来来实现命令行清屏功能(当编写命令行的贪吃蛇游戏时可能会用到)。编写 dll文件由于本文不是专门讲解如何编写dll文件的,而且我也不是一个专业的C家族语言程序员,因此下面我就开始直接通过代码来展示(本文创建的dll文件可以在GitHub中找到):首先打开原创 2020-09-25 23:58:12 · 2811 阅读 · 0 评论 -
Java | 关于Java的十个编码小技巧
相信每个人都喜欢看简洁易懂的代码,代码可读性也是衡量代码质量的重要标准之一,而本文则通过十个具体的编程小技巧(部分技巧并不局限于Java),希望能够帮助到你。1. 使用三元表达式考虑以下代码:public boolean isOdd(int num) { if (num % 2 == 1) { return true; } else { return false; }}我们可能会经常见到类似上面的代码,只需要一次简单的if ... else原创 2020-09-20 00:25:59 · 2397 阅读 · 3 评论 -
Java | 实现消息提醒的图标闪烁功能
前言本文主要讲解如何在 Java 中实现类似 QQ 等软件在有消息时的托盘图标闪烁功能,项目素材及代码均已上传 GitHub,可以点击链接进行查看,本文只展示核心代码,完整代码点击链接查看即可,此外项目属于 JavaFX 项目。效果最终实现的效果如下所示:注意想要更直观的效果图,可以查看该链接。思路通过新开一个线程,然后定时交替设置图标的图片:一个为空,一个为正常图片,即实现了图标的闪烁,代码如下:private void setTimerTask() { // 设置提示音原创 2020-09-13 18:28:33 · 3323 阅读 · 5 评论 -
Java | 几个通过Stream让代码更优雅的技巧
前言虽然 stream在 Java8 中就已经被引入,但是大多数人却没有去使用这个十分有用的特性,本文就通过介绍几个通过使用stream让代码更简洁、可读,来让你了解stream的方便之处。本文需要对lambda语法和stream的基本概念与创建方式有基本的了解,关于stream的基本概念和创建方法,可以看我的这篇文章。技巧数组转集合相信经常刷LeetCode的小伙伴,偶尔会遇到需要将List与基本类型数组进行互转的情况,然后就需要写像下面这样的代码:// 将 List 元素存储到数组中Li原创 2020-09-09 21:39:59 · 1015 阅读 · 0 评论 -
Java | Stream 基本概念及创建方法
相信很多人(包括我自己),在很长一段时间内虽然使用了 JDK 1.8 ,却从来没有使用过自1.8开始增加的 Stream 这一强大使用的新特性,本文则将先从如何创建 Stream 开始,逐步去学会 Stream 的使用。本文不会涉及对流中数据的操作,而只讨论创建流的几种方法,以及一些基础概念,关于流的实用操作将会在后续文章中一一介绍。原创 2020-08-26 21:39:42 · 544 阅读 · 0 评论 -
JavaFX | 解决 PasswordField 不包含显示密码功能的问题
前言由于 JavaFX 自带的 PasswordField 控件无法自己选择是否显示密码的功能,因此本文就介绍一种方式去实现这个功能,完整代码已同步到 GitHub,可到该链接进行查看。效果最终实现了类似如下的效果:解决方案在展示代码之前,我先来说一下总体的设计思路:如动态图里所示,首先先在 PassWordField 右侧通过设置设置背景图的方式在右侧放置图片,然后设置 PassWordField 的鼠标点击监听事件,当鼠标点击的区域位于闭眼图标附近时,就将面板里的 PassWordField原创 2020-08-21 09:40:54 · 1857 阅读 · 0 评论 -
Java | IDEA生成Jar包及使用exe代理运行(附踩坑指南)
前言本文主要讲述通过IDEA将Java代码生成Jar包,并使用一个工具代理以实现通过exe形式运行生成的Jar包,用到的工具链接附在文末,此外我还会讲讲可能会遇到的一些问题,如果你遇到了其它的问题,也欢迎多多交流,话不多说,准备开始~生成Jar包以下是本文所使用的示例代码:import javax.swing.*;/** * a demo application * * @author zjw * @createTime 2020/8/6 19:08 */public class M原创 2020-08-06 21:07:31 · 814 阅读 · 0 评论 -
Java | 谈谈StringBuilder的使用和细节
前言 众所周知,在Java中String对象是不可变的。不可变性会导致一系列的效率问题,例如下面几行代码,为了生成最终的结果,I首先会和love连接生成一个I loveString对象,然后再和java.连接,再次生成一个新的String对象(这里先不讨论编译器会做优化)。 String str = "I "; str += "love "; str += "java."; System.out.println(str); 可以发现,为了生成最终的结果,会产生一系列的需要垃圾回收的中原创 2020-07-25 10:43:24 · 436 阅读 · 0 评论