四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)

四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)

文章目录

  • 四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)
  • 1. 主键策略
    • 1.1 主键生成策略介绍
  • 2. 准备工作:
    • 2.1 AUTO 策略
    • 2.2 INPUT 策略
    • 2.3 ASSIGN_ID 策略
      • 2.3.1 雪花算法
    • 2.4 NONE 策略
    • 2.5 ASSIGN_UUID 策略
  • 3. 分页
    • 3.1 分页插件
    • 3.2 自定义分页插件
  • 4. 总结:
  • 5. 最后:


1. 主键策略

1.1 主键生成策略介绍

首先大家先要指定什么是主键,主键的作用就是唯一标识,我们可以通过这个唯一标识来定位到这条数据。

当然对于表数据中的主键,我们可以自己设计生成规则,生成主键。但是在更多的场景中,没有特殊要求的话,我们每次自己手动生成的比较麻烦,我们可以借助框架提供好的主键生成策略,来生成主键。这样比较方便快捷。

在MyBatis Plus 中提供了一个注解,是 @TeableId
在这里插入图片描述

该注解提供了各种的主键生成策略,我们可以通过使用该注解来对于新增的数据指定主键生成策略。那么在以后新增数据的时候,数据就会按照我们指定的主键生成策略来生成对应的主键。

2. 准备工作:

特别说明:

需要导入的相关 jar 依赖。如下:

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.rainbowsea</groupId><artifactId>mp03</artifactId><version>0.0.1-SNAPSHOT</version><name>mp03</name><description>mp03</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--        spring boot web 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--        mysql 驱动依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--        lombok 的依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--        druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><!--        mybatis-plus 的依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories><pluginRepositories><pluginRepository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></pluginRepository></pluginRepositories></project>

对应的 application.yaml 文件的配置的编写:

在这里插入图片描述

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: MySQL123main:banner-mode: off  #关闭 spring boot  在命令行当中的图标显示mybatis-plus:global-config:banner: false  # 关闭 mybatis-plus 在命令行当中的图标显示db-config:table-prefix: rainbowsea_ # 还可以通过统一添加前缀的方式:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 开启 Log 日志信息打印map-underscore-to-camel-case: true # 开启驼峰,下划线映射规则

编写对应的 DataSource 数据源,这里我们通过配置类的方式,将Spring Boot 的数据库连接池换为 Druid 数据库连接池。如下:

在这里插入图片描述

package com.rainbowsea.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configuration  // 标注配置类
public class DruidDataSourceConfig {@Bean@ConfigurationProperties(value = "spring.datasource")public DataSource getDataSource() {DruidDataSource druidDataSource = new DruidDataSource();return druidDataSource;}
}

运行测试,看看是否换为了 Druid 数据库连接池。

在这里插入图片描述

编写场景启动器:
在这里插入图片描述

2.1 AUTO 策略

该策略为跟随数据库表的主键递增策略,前提是数据库表的主键要设置为自增。

在这里插入图片描述

在这里插入图片描述

实体类添加注解,指定主键生成策略。

运行测试:

在这里插入图片描述

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
//import com.rainbowsea.mapper.UserMapper2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;@SpringBootTest
public class PrimaryKeyTest {@Autowired//@Resourceprivate UserMapper userMapper;@Testvoid primary() {User user = new User();user.setName("张三");user.setAge(19);user.setEmail("mary@rainbowsea.com");userMapper.insert(user);}
}

在这里插入图片描述

2.2 INPUT 策略

该策略表示,必须由我们手动的插入id,否则无法添加数据

// 该策略表示,必须由我们手动的插入id,否则无法添加数据,前提是:需要去掉数据表的自增策略

在这里插入图片描述

在这里插入图片描述


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.rainbowsea.enums.GenderEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;
import java.util.Map;@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(autoResultMap = true,value = " rainbowsea_user2")//查询时将json字符串封装为Map集合
public class User extends Model<User> {@TableId(type = IdType.INPUT)   // 该策略表示,必须由我们手动的插入id,否则无法添加数据,前提是:需要去掉数据表的自增策略private String id;private String name;private Integer age;private String email;
}

这里如果我们省略不写id,会发现,无法插入数据

在这里插入图片描述

@Test
void primaryKey(){User user = new User();user.setName("Jerry");user.setAge(38);user.setEmail("test8@powernode.com");userMapper.insert(user);
}

在这里插入图片描述

但是我们自己指定了id,发现可以添加成功

在这里插入图片描述

2.3 ASSIGN_ID 策略

我们来思考一下,像之前这种自动递增的方式,有什么问题?

如果我们将来一张表的数据量很大,我们需要进行分表。

常见的分表策略有两种:水平拆分,垂直拆分

  • 水平拆分:水平拆分就是将一个大的表按照数据量进行拆分

在这里插入图片描述

  • 垂直拆分: 垂直拆分就是将一个大的表按照字段进行拆分

在这里插入图片描述

其实我们对于拆分后的数据,有三点需求,就拿水平拆分类说:

之前的表的主键是有序的,拆分后还是有序的。

虽然做了表的拆分,但是每条数据还需要保证主键的唯一性。

主键最好不要直接暴露数据的数量,这样容易被外界知道关键信息。

那就需要有一种算法,能够实现这三个需求,这个算法就是雪花算法。

2.3.1 雪花算法

雪花算法是由一个 64 位的二进制组成的,最终就是一个 Long 类型的数据。

主要分为:四部分存储

  • 1位 的符号位,固定值为 0
  • 41位 的时间戳
  • 10位的机器码,包含 5位 机器 id 和 5位 服务 id
  • 12位 的序列号

在这里插入图片描述

**使用雪花算法可以实现有序、唯一、且不直接暴露排序的数字。 **

在这里插入图片描述


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.rainbowsea.enums.GenderEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;
import java.util.Map;@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(autoResultMap = true,value = " rainbowsea_user2")//查询时将json字符串封装为Map集合
public class User extends Model<User> {@TableId(type = IdType.ASSIGN_ID)  // 雪花算法,就算数据表,没有设置自增策略,也可以成功的自增策略private String id;private String name;private Integer age;private String email;}

运行测试:

在这里插入图片描述

我们可以在插入后发现一个19位长度的id,该id就是雪花算法生成的id,这是二级制的十进制表示形式

2.4 NONE 策略

NONE策略表示不指定主键生成策略,当我们没有指定主键生成策略或者主键策略为NONE的时候,他跟随的是全局策略,那我们来看一下他的全局策略默认是什么

是在application.yaml 文件当中配置 id-type 属性。全局配置中 id-type是用于配置主键生成策略的,我们可以看一下id-type的默认值

在这里插入图片描述

在这里插入图片描述

通过查看源码发现,id-type的默认值就是雪花算法。

也就是说,就算我们不采用任何的了主键策略,**在全局配置当中,默认就是采用了雪花算法 ASSIGN_ID策略 **

在这里插入图片描述

2.5 ASSIGN_UUID 策略

UUID(Universally Unique Identifier)全局唯一标识符,定义为一个字符串主键 (注意:这里是字符串,也就是说,你的数据表的id 的主键,要为字符串类型,才可以使用这个ASSIGN_UUID策略),采用32位数字组成,编码采用 16进制,定义了在时间和空间都完成唯一的系统信息。

UUID的编码规则:

  • 1~8 位采用系统时间,在系统时间上精确到毫秒级保证时间上的唯一性。
  • 9~16 位采用底层的 IP地址,在服务器集群中的唯一性。
  • 17~24 位采用当前对象的 HashCode 值,在一个内部对象上的唯一性。
  • 25~32 位采用调用方法的一个随机数,在一个对象内的毫秒级的唯一性。

通过上述以上4中策略可以保证数据的唯一性 。在系统中需要用到随机数的地方都可以考虑采用UUID 算法。

我们想要演示UUID的效果,需要改变一下表的字段类型和实体类的属性类型

将数据库表的字段类型改为 varchar(50)

在这里插入图片描述

将实体类的属性类型改为String,并指定主键生成策略为 IdType.ASSIGN_UUID

在这里插入图片描述

在这里插入图片描述

完成数据的添加。我们会发现,成功添加了一条数据,id为uuid类型

在这里插入图片描述

3. 分页

在大部分场景下,如果我们的SQL没有这么复杂,是可以直接通过MybatisPlus提供的方法来实现查询的,在这种情况下,我们可以通过配置分页插件来实现分页效果

分页的本质就是需要设置一个拦截器,通过拦截器拦截了SQL,通过在SQL语句的结尾添加limit关键字,来实现分页的效果

在这里插入图片描述

3.1 分页插件

接下来看一下配置的步骤:配置分页插件

  1. 通过配置类来指定一个具体数据库的分页插件,因为不同的数据库的方言不同,具体生成的分页语句也会不同,这里我们指定数据库为Mysql数据库。

在这里插入图片描述


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();/*通过配置类来指定一个具体数据库的分页插件,因为不同的数据库的方言不同,具体涩会给你从的分页语句也会不同,这里我们指定数据库为 MySQL数据库*/mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return mybatisPlusInterceptor;}}

实现分页查询效果:

在这里插入图片描述


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;@SpringBootTest
public class PageTest {@Resourceprivate UserMapper userMapper;@Testvoid selectPage() {LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();// 指定分页对象,分页对象包含分页信息 IPageIPage<User> userPage = new Page<>(1,3);//Page<User> userPage = new Page<>(2, 3);// 执行查询userMapper.selectPage(userPage, lambdaQueryWrapper);// 获取分页查询的信息System.out.println("当前页:" + userPage.getCurrent());System.out.println("每页显示条数: " + userPage.getSize());System.out.println("总页数: " + userPage.getPages());System.out.println("总条数: " + userPage.getTotal());System.out.println("分页数据: " + userPage.getRecords());}
}

在这里插入图片描述

在这里插入图片描述

3.2 自定义分页插件

在某些场景下,我们需要自定义SQL语句来进行查询。接下来我们来演示一下自定义SQL的分页操作

在Mapper接口中提供对应的方法,方法中将IPage对象作为参数传入
在这里插入图片描述

package com.rainbowsea.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.rainbowsea.bean.User;
import org.apache.ibatis.annotations.Mapper;@Mapper  // 包路径扫描
public interface UserMapper extends BaseMapper<User> {IPage<User> selectByName(IPage<User> page, String name);
}

在UserMapper.xml映射配置文件中提供查询语句。

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rainbowsea.mapper.UserMapper"><select id="selectByName" resultType="com.rainbowsea.bean.User">select * from rainbowsea_user where name = #{name}</select></mapper>

实现分页查询效果:

在这里插入图片描述


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;@SpringBootTest
public class PageTest {@Resourceprivate UserMapper userMapper;@Testvoid selectPage2() {IPage<User> userPage = new Page<>(1,3);userMapper.selectByName(userPage,"Mary");// 获取分页查询的信息System.out.println("当前页:" + userPage.getCurrent());System.out.println("每页显示条数: " + userPage.getSize());System.out.println("总页数: " + userPage.getPages());System.out.println("总条数: " + userPage.getTotal());System.out.println("分页数据: " + userPage.getRecords());}
}

4. 总结:

  1. 主键策略:
    1. AUTO 策略,自动添加主键,前提是:要设置数据表的自增。
    2. INPUT 策略:该策略表示,必须由我们手动的插入id,否则无法添加数据,前提是:需要去掉数据表的自增策略。
    3. ASSIGN_ID: 策略,运用了雪花算法,为主键的id 加密的同时自增了。
    4. NONE策略:默认的策略,该策略默认就是:默认设置(默认就是雪花算法),数据表没有设置自增策略,也可以成功。
    5. ASSIGU_UUID策略:采用UUID的编码加密主键,同时自增主键,全局唯一标识符,定义为一个字符串主键,注意是字符串,所以数据表的主键要为字符串类型才行,对应的 Java bean 对象当中的属性值,也要为 字符串类型
  2. 分页的本质就是需要设置一个拦截器,通过拦截器拦截了SQL,通过在SQL语句的结尾添加limit关键字,来实现分页的效果

5. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1547819.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

电动车、电单车入梯数据集电动车进电梯检测识别(代码+教程+数据集)

数据集介绍 共有 5347 张图像和一一对应的标注文件 标注文件格式提供了两种&#xff0c;包括VOC格式的xml文件和YOLO格式的txt文件。 标注的对象共有以下几种&#xff1a; [‘Electric-bicycle’] 标注框的数量信息如下&#xff1a;&#xff08;标注时一般是用英文标的&am…

AC-DC电源自动测试系统介绍

AC-DC电源模块测试系统是一种高度自动化的测试设备&#xff0c;能够模拟实际工作环境中的交流电输入&#xff0c;并测量电源模块的输出电压、电流、功率等关键参数&#xff0c;以及评估其电磁兼容性、效率、热特性等性能指标。 AC-DC电源模块测试系统的主要硬件组成包括&#…

TDEngine在煤矿综采管控平台中的应用

一、行业背景 智能综采管控平台&#xff0c;是将煤矿综采工作面传感器数据采集&#xff0c;通过可视化界面展示。实现综采工作面的透明化展示&#xff0c;并基于历史的传感器数据进行机器学习的训练&#xff0c;了解工作面周期来压&#xff0c;设备故障检测等数据应用。因此针…

纷享销客生态伙伴大会西安站圆满落幕,共话CRM新纪元

9月19日&#xff0c;以“智享未来&#xff0c;领创CRM新纪元”为主题的纷享销客生态伙伴大会在西安成功举办。本次会议汇聚了SaaS领域、软件行业以及TOB市场的杰出代表、行业领袖以及技术前沿专家&#xff0c;共同探讨SaaS CRM行业的当前发展趋势&#xff0c;并就AI在CRM领域的…

如何使用ssm实现基于web的山东红色旅游信息管理系统的设计与实现

TOC ssm716基于web的山东红色旅游信息管理系统的设计与实现jsp 绪论 1.1研究背景 从古到今&#xff0c;信息的录入&#xff0c;存储&#xff0c;检索都受制于社会生产力的发展&#xff0c;不仅仅浪费大量的人力资源还需要浪费大量的社会物资&#xff0c;并且不能长时间的保…

c++----继承(初阶)

大家好呀&#xff0c;今天我们也是多久没有更新博客了&#xff0c;今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢&#xff0c;大家从字面意思看&#xff0c;是不是像我们平常日常生活中很容易出现的&#xff0c;比如说电视剧里面什么富豪啊&#xff0c;去了…

mybatis-puls快速入门

1.概述 在真实项目开发中我们的服务模块&#xff0c;一般都要进行数据库操作&#xff0c;并且每个domain都有crud&#xff0c;需多次写重复代码。我们使用MybatisPlus&#xff0c;就不用写重复代码&#xff0c;并且还有模板的功能&#xff0c;可以一键生成daomin,query,mapper…

如何在 Windows PC 或笔记本电脑上恢复未保存的 Word 文档

辛苦工作成果消失得无影无踪可能是任何人最可怕的噩梦&#xff0c;尤其是如果这是一篇长篇论文或项目报告。此问题可能是由于 Windows PC 或笔记本电脑上未保存的 Word 文档造成的。不过&#xff0c;不要惊慌&#xff1b;您仍然有机会在 Windows 机器上恢复未保存的 Word 文档。…

AI驱动的Java开发框架:Spring AI Alibaba实战部署教程

前言 随着生成式 AI 的快速发展&#xff0c;基于 AI 开发框架构建 AI 应用的诉求迅速增长&#xff0c;涌现出了包括 LangChain、LlamaIndex 等开发框架&#xff0c;但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言&a…

51 驱动 ADS1115 AD采集

文章目录 一、ADS1115简介二、引脚功能三、功能介绍1.MULTIPLEXER2.量程3.数字比较器4.寄存器写入或读取时序5.数据格式 四、寄存器介绍1.地址指针寄存器2.转化数据存放寄存器3.配置寄存器4.比较器高低阈值寄存器 五、程序六、实验现象 一、ADS1115简介 ADS1115是高精度模数转…

软考高级:软件架构风格 AI 解读

软件架构风格指的是构建软件系统时常用的一些设计模式或设计方法。它们帮助开发人员从高层次组织代码、功能模块和数据流的方式。让我们通俗地解释一下几种常见的软件架构风格。 生活化例子 假设我们在做一桌丰盛的晚餐&#xff0c;分别由不同的厨师负责炒菜、煲汤、做甜点&a…

了解独享IP的概念及其独特优势

在网络世界中&#xff0c;IP地址是用来识别和定位设备的标识符。独享IP是一种服务模式。使用代理服务器时&#xff0c;用户拥有一个不与其他用户共享的专用独立IP地址。与共享IP相比&#xff0c;独享IP为用户提供了更高的独立性和隐私保护。下面详细介绍独享IP的定义、工作原理…

idea 2024.2切换到旧版的UI

在 IntelliJ IDEA 2024.2 中&#xff0c;新 UI 现在成为所有用户的默认选项&#xff0c;经典 UI 则作为插件提供。 新 UI 简洁而现代&#xff0c;提供更大、更易用的控件、一致的调色盘、明亮清晰的图标、增强的对比度和更好的强调色。 为了使用原来的旧版UI操作其实很简单&am…

构建企业数字化转型的架构指南——基于TOGAF框架的实用方法论

数字化转型的驱动力与挑战 随着全球经济的数字化转型加速&#xff0c;企业正面临技术、业务模式以及组织架构的深刻变革。要实现这一复杂而系统性的转型&#xff0c;仅靠引入新技术是远远不够的&#xff0c;企业必须从战略层面重塑其业务架构&#xff0c;以确保技术投资与业务…

死磕P7: JVM垃圾回收那点事,轻松拿捏不是事儿(一)

这是「死磕P7」系列第 003 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 上两篇介绍了 JVM 内存区域划分&#xff0c;简单记忆一下就可以了&#xff0c;后面再不断深入吧。 死磕P7: JVM内存划分必知必会…

php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号

有时候我们使用nginx 大家都知道平滑重启命令: /web/nginx/sbin/nginx -s reload 但大家对php-fpm 重启 可能就是简单暴力的kill 直接搞起了 下面介绍一个sh 文件名保存为start_php.sh 来对php-fpm 进行平滑重启 #!/bin/bash# 检查 PHP-FPM 是否运行 if ! pgrep php-…

常用并发设计模式精讲

1. 优雅终止线程的设计模式 思考&#xff1a;在一个线程 T1 中如何优雅的终止线程 T2&#xff1f; 正确思路&#xff1a;两阶段终止模式 1.1 两阶段终止&#xff08;Two-phase Termination&#xff09;模式——优雅的终止线程 两阶段终止&#xff08;Two-phase Termination…

新160个crackme - 065-Eternal Bliss

运行分析 选择验证方式&#xff0c;破解字符串标题提示为vb程序 PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用VB Decompiler进行分析&#xff0c;发现Command1_Click_403604为check按钮事件&#xff0c;需要使Me 1 CBool(expression) 将表达…

CSS 中的文本相关属性(line - height、font、letter - 属性、text - 属性)

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与行高的取值约定 行高与盒子高度的关系 font、letter -属性 、text -属性 font属性 letter -属性 text - 属性 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与…

SQLI—LABS刷题 | SQL总结

Less1-2&#xff08;联合注入&#xff09; ?id1 查询到用户名及密码 ​​​​​​​?id1 报错&#xff1a;You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 1 LIMIT 0,1 at li…