final关键字详解
final 关键字详解final关键字在Java中有三种主要用法,分别用于修饰变量、方法和类。以下是对final关键字的详解。
基本使用场景修饰变量
final变量一旦初始化之后,值就不能再改变。
可以是成员变量,也可以是局部变量。对于成员变量:
必须在声明时或者在构造函数中赋值。
对于局部变量,必须在声明时或者在代码块中赋值。
final 修饰引用的时候,引用的值初始化后就不可变了,但是引用的内容可以变化
修饰方法
final方法不能被子类重写,但可以被继承。
使用final关键字修饰的方法通常是设计用来实现类的核心功能,目的时:
为了防止不安全的修改
提高效率:final方法在编译时会被内联(JVM优化),提高执行效率。
修饰类
final类不能被继承。
使用final关键字修饰的类通常是设计用来防止继承修改的类,常用于工具类或基础类库。
其他特定使用场景
匿名类
在匿名内部类中使用的局部变量必须是final或“事实上的final”(即虽然未声明为final但在作用域内没有改变)。
Lambda表达式内部
在Lambda表达式中使用 ...
数据存储中的Bucket概念
数据存储中的 Bucket 概念简介在数据存储和管理的领域中,术语“Bucket”广泛用于描述一种数据容器的概念。它类似于现实生活中的桶,用于类比在单一存储单元中收集和维护数据集合的行为。
Bucket的概念“Bucket”一词在计算机科学中通常指代一个存储空间,它可以是一个数据结构中的单元,也可以是一个物理或逻辑的存储容器。这种用法强调了容器的功能,即能够聚合具有共同特性的数据。例如,在数据结构中,尤其是哈希表(Hash tables)中,“Bucket”用于存储索引或哈希函数计算出的相同哈希值的数据项。
Bucket的应用哈希表中的Bucket在散列表中,Bucket用作数据项的归属地,以便快速检索。每个Bucket通常对应一个哈希值,而具有相同哈希值的数据项则存储在同一Bucket中。这种方法提高了数据处理的效率,因为它减少了在搜索特定项时需要比较的数据量。
云存储服务中的Bucket在云存储服务中,如Amazon S3、Google Cloud Storage、JSS等等,Bucket是顶层的存储容器。用户可以在一个Bucket中创建、读取、更新和删除无限数量的数据对象。每个B ...
MySQL执行计划详解
MySQL执行计划详解概念MySQL执行计划(Execution Plan)是数据库管理系统对SQL查询语句进行解析、优化、选择最优执行路径,并最终执行的详细步骤和策略的描述。
为什么需要
性能优化:通过分析执行计划,可以了解查询的具体执行过程,识别性能瓶颈,优化查询语句和数据库结构。
调试与诊断:执行计划帮助开发者和DBA识别查询中的问题,如未使用索引、全表扫描等,进行有效的调试和诊断。
资源管理:通过执行计划,可以合理分配和管理数据库资源,避免不必要的资源浪费,提升系统整体性能。
怎么使用MySQL提供了EXPLAIN语句来生成执行计划,以下是基本使用方法:
基本用法:1EXPLAIN SELECT * FROM table_name WHERE condition;
输出结果解读:EXPLAIN的输出包含多个字段,每个字段都提供了执行计划的关键信息:
id:查询的标识符,标识查询执行的顺序。
select_type:查询类型,如SIMPLE、PRIMARY、UNION等。
table:查询涉及的表。
type:连接类型,如ALL、index、range、ref、eq_r ...
com.alibaba.fastjson.JSON详解
com.alibaba.fastjson.JSON详解目录
概述
快速入门
Maven 依赖
基本使用
常用 API
JSON 序列化
JSON 反序列化
JSONPath
高级特性
自定义序列化和反序列化
注解
解析复杂 JSON
性能优化
安全性
参考资料
概述com.alibaba.fastjson.JSON 是阿里巴巴开源的一个高性能 JSON 处理库,主要用于 JSON 数据的解析和生成。
fastjson 提供了丰富的 API,用于将 Java 对象与 JSON 字符串之间进行相互转换,并且具有高效、简洁的特点。
快速入门Maven 依赖在你的项目中使用 fastjson 之前,需要在 pom.xml 中添加以下依赖:
12345<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> <!-- 请使用最新 ...
MySQL覆盖插入的实现
MySQL覆盖插入的实现在 MySQL 中,覆盖插入(也称为“覆盖更新”)是指在插入数据时,如果插入的记录已经存在,则更新该记录。
MySQL 提供了多种方式来实现覆盖插入,主要有以下几种方法:
REPLACE INTO:如果记录存在,则删除并插入新的记录。
INSERT … ON DUPLICATE KEY UPDATE:如果记录存在,则更新该记录。
INSERT IGNORE:如果记录存在,则忽略插入操作(不会更新记录)。
方法 1:REPLACE INTOREPLACE INTO 会尝试插入新记录。如果记录的主键或唯一键已经存在,则先删除该记录,然后插入新记录。
语法12REPLACE INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);
示例假设有一个 users 表:
12345CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100));
使用 REPLACE INT ...
MySQL中IN和EXIST的区别
MySQL中IN和EXIST的区别从原理上解释 IN 和 EXISTS 的区别,需要深入了解它们在 SQL 查询执行过程中是如何处理的。
IN 子查询的原理IN 子查询用于检查某个值是否在一组给定的值列表中。其处理过程如下:
子查询执行:
首先,执行 IN 子查询,并生成一个结果集。这个结果集通常是一个值的列表。
例如:1SELECT department_id FROM departments WHERE department_name = 'Sales';
生成一个包含所有满足条件的 department_id 列表。
主查询过滤:
主查询使用生成的结果集进行过滤。查询引擎会逐行检查主表中的每个值,判断其是否在子查询的结果集中。
例如:1SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
这条语句会检查每个 employee 的 department_id ...
mybatis-generator使用教程
mybatis-generator 使用教程为什么使用 MBG ?提高开发效率MBG 自动生成 MyBatis 相关的代码,包括 Java 实体类、SQL 映射文件和 DAO 接口,这样开发者可以节省大量的时间和精力,专注于业务逻辑的开发。
保证代码一致性手动编写的代码容易产生风格不一致和错误,而 MBG 生成的代码遵循一致的规范和模板,保证代码的一致性和可维护性。
快速迭代在数据库表结构发生变化时,MBG 可以快速生成新的代码,减少手动修改代码的工作量,适应快速迭代的开发需求。
减少重复劳动对于大多数 CRUD(创建、读取、更新、删除)操作,MBG 可以自动生成标准的代码,避免开发者重复编写类似的代码,提高开发效率。
适应复杂的 SQL 映射MBG 支持复杂的 SQL 映射生成,可以生成包括关联查询、多表联查等复杂 SQL 映射文件,满足复杂业务需求。
提供灵活的配置MBG 提供了高度可配置性,开发者可以根据具体需求配置生成的代码,包括生成文件的包结构、文件路径、表的映射等。
集成开发工具MBG 可以很方便地与 Maven 集成,通过 Maven 插件可以轻松运行 MBG,生成和更新 ...
SQL执行顺序详解
好的,以下是详细的SQL执行顺序的详解,并整理成文档格式:
SQL执行顺序详解SQL 关键字执行顺序
FROM -> JOIN/ON -> WHERE -> GROUP BY -> HAVING
-> SELECT -> DISTINCT -> ORDER BY -> LIMIT -> OFFSET
-> UNION -> INSERT INTO / UPDATE / DELETE FROM
FROM 子句
作用:指定查询的数据源表或视图。
语法:FROM table_name
JOIN 子句
作用:将多个表连接起来,根据指定的条件。
语法:1JOIN table_name ON join_condition
JOIN 关键字用于连接表。
ON 关键字用于指定连接条件。
WHERE 子句
作用:筛选符合条件的行。
语法:1WHERE condition
GROUP BY 子句
作用:按照指定的列对结果集进行分组。
语法:1GROUP BY column_name
HAVI ...
POJO(Plain Old Java Object)
为什么需要区分POJO在开发中区分不同类型的POJO(Plain Old Java Object)具有以下几个重要的原因:
职责分离
实体类(Entity):负责与数据库表的映射,主要用于持久化操作。
查询对象(Query):封装查询条件,用于传递查询参数。
参数对象(Param):封装HTTP请求参数,用于控制器层接收前端数据。
视图对象(VO):封装展示层的数据,用于将数据传递给前端。
业务对象(BO):封装业务逻辑,用于服务层处理业务操作。
代码可读性和可维护性
通过明确区分不同的POJO类型,可以提高代码的可读性和可维护性,使得开发者能够快速理解代码的意图和使用场景。
开发者可以通过类名和字段名快速理解这个POJO的用途。
便于在大型项目中管理和维护代码。、
数据和逻辑的分离
将数据和逻辑分离可以减少耦合度,增强代码的可测试性和复用性。
实体类主要关注数据的持久化,而不包含业务逻辑。
业务对象关注业务逻辑,实现业务需求。
数据验证和转换
通过使用不同的POJO,可以在不同的层次进行数据验证和转换。
参数对象(Param)可以使用注解进行数据验证,如@NotNu ...
Butterfly代码块高亮踩坑
Butterfly代码块高亮踩坑问题描述代码块没有高亮,没有复制按钮,看起来简直就像是文本
解决路线官方文档 - 代码高亮
issue 指路,也许有你需要的解答
首先查看hexo版本1heox --version
hexo: 7.2.0hexo-cli: 4.3.2os: win32 10.0.22631 undefinednode: 18.16.0acorn: 8.8.2ada: 1.0.4ares: 1.19.0brotli: 1.0.9cldr: 42.0icu: 72.1llhttp: 6.0.10modules: 108napi: 8nghttp2: 1.52.0nghttp3: 0.7.0ngtcp2: 0.8.1openssl: 3.0.8+quicsimdutf: 3.2.2tz: 2022gundici: 5.21.0unicode: 15.0uv: 1.44.2uvwasi: 0.0.15v8: 10.2.154.26-node.26zlib: 1.2.13
修改 hexo 的 _config.yml 配置
注意,是hexo的,不是主题的
如果是 7.0.0 ...
如何使用图标库
如何使用图标库来美化 .yml 文件的 icon
在 Font Awesome 官方网站 上查看所有可用的图标和它们的分类 ([Font Awesome](https://fontawesome.com/#:~:text=URL%3A https%3A%2F%2Ffontawesome.com%2F Visible%3A 0% )) (Font Awesome Docs)
Step 1. 找到图标库对应的 Code Snippet
Step 2. 找到你想要添加图标的位置,添加“图标分类 Code Snippet”Font Awesome的图标分类主要包括:
fas(Font Awesome Solid):实心图标。
far(Font Awesome Regular):常规图标(通常是空心的)。
fal(Font Awesome Light):轻量图标。
fab(Font Awesome Brands):品牌图标。
示例1fab fa-solid fa-x
END
Butterfly主题页脚添加ICP备案信息
Butterfly主题页脚添加ICP备案信息方案一Step 1. 找到页脚布局文件 footer.pug
Step 2. 添加备案号
方案二在 _config.butterfly.yml 的 footer.custom_text 中放入 Step 2 的 html 代码
END
BeanUtils.copyProperties(source, target)
BeanUtils.copyProperties(source, target);功能概述
源对象和目标对象:copyProperties() 方法需要两个参数,一个是源对象(source),另一个是目标对象(target)。方法会尝试将源对象的属性值复制到目标对象中的对应属性。
属性名称和类型:复制过程中,只有当源对象和目标对象中具有相同名称和兼容类型的属性时,属性值才会被复制。
深拷贝与浅拷贝:默认情况下,copyProperties() 执行的是浅拷贝,即如果属性是引用类型,则复制的是引用而不是对象本身。
注意事项
异常处理:copyProperties() 方法声明了抛出 IllegalAccessException 和 InvocationTargetException。这要求调用时必须进行异常处理。
数据类型兼容性:当源对象和目标对象的同名属性类型不完全一致时(例如,一个是 Long 另一个是 Integer),复制可能不会执行,或者需要额外的处理。
数据类型兼容性处理
Spring 的 BeanUtils.copyProperties() 方法在执行属性复制时,主要 ...
MySQL 重置密码
MySQL重置密码Step 1:停止 MySQL 服务:首先,确保 MySQL 服务已经停止。如果 MySQL 服务正在运行,可以使用以下命令停止它:
1sudo systemctl stop mysql
Step 2:以跳过授权表启动 MySQL:在 Ubuntu 上,可以通过以下步骤以跳过授权表的方式启动 MySQL 服务,从而可以修改 root 密码:
1sudo mysqld_safe --skip-grant-tables --skip-networking &
--skip-grant-tables:跳过授权表,允许不需要密码即可登录 MySQL。
--skip-networking:跳过网络连接,仅允许本地连接。
Step 3:登录到 MySQL:在跳过授权表的模式下,可以直接登录到 MySQL 服务器,而不需要密码:
1mysql -u root
Step 4:修改 root 密码:登录到 MySQL 后,使用以下 SQL 命令修改 root 用户的密码。将 new_password 替换为你要设置的新密码:
123USE mysql;UPDATE u ...
Ubuntu MySQL 安装教程
Ubuntu 服务器安装 MySQLStep 1:更新包管理器:在安装任何新软件之前,建议先更新系统的包管理器 apt,以确保安装的软件版本是最新的:
1sudo apt update
Step 2:安装 MySQL 服务器:使用以下命令安装 MySQL 服务器:
1sudo apt install mysql-server
在安装过程中,系统会提示你设置 MySQL 的 root 用户密码。请设置一个安全且记得住的密码,并确认。
Step 3:启动 MySQL 服务:安装完成后,MySQL 服务会自动启动。你可以使用以下命令检查 MySQL 服务的运行状态:
1sudo systemctl status mysql
如果 MySQL 未启动,可以使用以下命令手动启动它:
1sudo systemctl start mysql
Step 4:配置 MySQL(可选):在默认情况下,MySQL 的安全配置脚本已经在安装时运行,可以使用以下命令再次运行该脚本:
1sudo mysql_secure_installation
这个脚本将引导你完成一些基本的安全设置,包括移除测试数据 ...
Docker拉取镜像失败的解决方法
Docker 拉取镜像失败的解决方法报错信息1download failed after attempts=6: dial tcp 104.18.125.25:443: i/o timeout
Step 1:写入镜像配置Step 1.1:创建目录1sudo mkdir -p /etc/docker
Step 1.2:写入镜像配置12345678910sudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn" ]}EOF
Step 2:重启 Docke ...
MySQL 设置 create_time/update_time 自动更新
MySQL在 MySQL 中,可以使用 CURRENT_TIMESTAMP 函数来获取当前时间戳,其特性包括:
插入时自动更新:通过在表定义中设置默认值为 CURRENT_TIMESTAMP,可以在插入新记录时自动填充当前时间戳。
1234CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
更新时自动更新:使用 ON UPDATE CURRENT_TIMESTAMP 在字段定义中,可以在更新记录时更新时间戳。
1234CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
MyBatis 占位符与字符串替换 详解
MyBatis ‘#’ 和 ‘$’ 详解
MyBatis 是一个开源的持久层框架,用于简化数据库操作,它提供了多种方式来执行 SQL 查询,支持动态 SQL、映射器接口和注解等特性。在 MyBatis 中,# 和 $ 符号在 SQL 查询中有不同的作用和用法。
# 和 $ 的区别
# 符号
作用:# 符号表示预编译处理(PreparedStatement),会将参数按照 JDBC 类型安全地进行替换,即使用占位符 ? 来表示参数值。
安全性:使用 # 可以防止 SQL 注入攻击,因为参数值会被自动转义,使得输入的参数无法改变 SQL 的语义。
适用情况:推荐用于传递参数值,如 WHERE 子句、INSERT 或 UPDATE 的列值等。
示例:
1SELECT * FROM users WHERE id = #{userId}
这里 #{userId} 将会被替换为安全的预编译参数。
$ 符号
作用:$ 符号直接将参数值拼接进 SQL 语句中,可以理解为字符串替换,不会进行预编译处理。
灵活性:由于直接替换参数值,可以用于动 ...
Docker + Umami 使用教程
Docker + Umami 使用教程前置条件
安装 MySQL,MySQL 安装教程
安装 Docker,Docker 安装教程
Step 1:在服务器上,创建一个docker-compose.yml1vim docker-compose.yml
Step 2:在该文件中添加如下内容123456789101112version: '3'services: umami: image: ghcr.io/mikecao/umami:mysql-latest network_mode: "host" environment: DATABASE_URL: mysql://username:password@localhost:3306/databasename DATABASE_TYPE: mysql HASH_SALT: replace-me-with-a-random-string restart: always container_name: umami
username ...
Ubuntu安装Docker
Ubuntu服务器安装DockerStep 1:更新系统软件包1sudo apt update
Step 2:安装依赖包【用于通过HTTPS来获取仓库】1sudo apt install apt-transport-https ca-certificates curl software-properties-common
Step 3:添加Docker官方GPG密钥12sudo -icurl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-ce.gpg
Step 4:验证1sudo apt-key fingerprint 0EBFCD88
0EBFCD88 是公钥的指纹。执行这个命令后,系统会显示与该指纹相关的公钥信息。
Step 5:添加Docker阿里稳定版软件源1sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun. ...
hexo解决图片路径不正确问题
hexo解决图片上传到服务器后路径不正确的问题Table of Contents[toc]
Step 1 安装 hexo-renderer-marked 插件hexo-renderer-marked 是一个为 Hexo 博客框架设计的插件,它使用 Marked 解析 Markdown 文件。Hexo 是一个快速、简单且功能强大的静态博客框架,而 hexo-renderer-marked 插件允许你使用 Marked 来渲染 Markdown 文件,从而生成静态网页内容。
主要功能和用途
Markdown 渲染: hexo-renderer-marked 使用 Marked 库将 Markdown 文件转换为 HTML。Markdown 是一种轻量级的标记语言,常用于编写博客文章、文档等。
支持扩展语法: Marked 支持一些扩展的 Markdown 语法,使你可以使用更高级的特性,例如表格、代码块高亮等。
高性能: Marked 是一个高性能的 Markdown 解析器,解析速度快,生成的 HTML 代码干净且高效。
自定义选项: hexo-renderer-marked 允许你在 ...
Java8新特性
Java8新特性Interface新特性
default修饰的方法,是普通实例方法,可以用this调用,可以被子类继承、重写。
如果两个接口都定义了某个default同名方法,某个类同时实现了这两个接口,那么,这个同名方法必须重写,否则编译报错
static修饰的方法,使用上和一般类静态方法一样。但它不能被子类继承,只能用Interface调用。
函数式编程(Functional Programming, FP)是一种编程范式,它将计算视为数学函数的求值,并强调函数的应用。与命令式编程不同,函数式编程更关注表达式的计算和函数的组合,而不是变量的状态和赋值操作。就像管道符一样,一个函数的输出是下一个函数的输入
Lambda表达式和Stream流都是函数式编程的应用
Java LambdaLambda表达式是Java 8引入的一个重要特性,使得我们可以用更加简洁和函数式的方式编写代码。
Lambda表达式可以用于实现函数式接口(即只有一个抽象方法的接口),并在集合操作、并行处理等场景中得到广泛应用。
基本语法Lambda表达式的基本语法如下:
12(parameters) ...
hexo使用指南
hexo使用指南本地创建一篇新博客1hexo new '博客名'
指定该博客的tags、categories12345678910tags: xxxcategories: xxx或者tags: - xxx1 - xxx2categories: - yyy1 - yyy2注意:使用'-'时需要留一个空格,如“- xxxtag”
添加主页上该博客的描述12description: | hexo基本操作:创建新博客、创建新页面、远程部署、图片上传等
本地创建一个新的页面1hexo new page '页面名'
将本地内容推送到服务器123hexo cleanhexo ghexo d
