【Spring Boot后端组件】mybatis-plus使用
文章目录
- mybatis-plus使用
- 一、依赖引入
- 二、添加相关配置项
- 三、功能详解
- 1.自增主键
- 2.逻辑删除
- 3.操作时间自动填充
- 4.其他字段自动填充
- 5.分页查询
- 6.自定义动态查询
- 7.代码生成器
- 8.代码生成器(自定义模板)
mybatis-plus使用
一、依赖引入
pom.xml文件
<?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 http://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.7.4</version><relativePath/></parent><artifactId>mybatis-plus-demo</artifactId><dependencies><!-- 实现对数据库连接池的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <!-- 本示例,我们使用 MySQL --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><!-- 实现对 MyBatis Plus 的自动化配置 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>
二、添加相关配置项
application.yaml
spring:# datasource 数据源配置内容datasource:url: jdbc:mysql://127.0.0.1:3306/test-user?useSSL=false&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: root1234
三、功能详解
1.自增主键
CREATE TABLE auto_increment (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',name VARCHAR(100) NOT NULL COMMENT '名称',create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT='主键自增表';
表单说明:在数据库软件如navicat中直接插入数据时,数据呈现主键自增情况,但使用mybatis-plus直接插入数据则不会。
(1)直接为实体id字段添加注解@TableId(type = IdType.AUTO)
,加上此注解后插入的数据就可以实现主键自增了。
实体类如下:
@TableName(value = "auto_increment")
@Data
public class AutoIncrementDO {@TableId(type = IdType.AUTO)private Long id;private String name;private LocalDateTime createTime;
}
(2)全局配置,在配置文件中加入以下配置
mybatis-plus:global-config:db-config:id-type: auto # 全局主键策略
实体类如下:
@TableName(value = "auto_increment")
@Data
public class AutoIncrementDO {// 字段名id时会自动识别为主键,否则需要加上 @TableId 注解private Long id;private String name;private LocalDateTime createTime;
}
ps:数据库主键必须设置为自增,否则会报错
2.逻辑删除
CREATE TABLE logic_delete (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',name VARCHAR(50) NOT NULL COMMENT '名称',create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',deleted BIT NOT NULL DEFAULT FALSE COMMENT '是否删除'
) COMMENT='逻辑删除表';
表单说明:deleted字段默认设为false即0,删除数据时值需要将deleted字段置为1即可,不需要真正的删除数据。
mybatis-plus如何实现这一需求呢?
(1)直接在表示逻辑删除的字段上添加注解@TableLogic
即可,默认值为0,删除值为1,若想反过来需要自定义@TableLogic(value = "1", delval = "0")
或者@TableLogic(value = "false", delval = "true")
(2)全局配置:表示删除的字段上添加注解@TableLogic
,全局配置默认值和删除值,配置如下。
mybatis-plus:global-config:db-config:logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)logic-delete-value: 1 # 逻辑已删除值(默认为 1)
ps:若字段上的注解不仅仅为@TableLogic,而是例如@TableLogic(value = "1", delval = "0")等情况,那么该表的逻辑删除按该注解来,即该表0表示删除
3.操作时间自动填充
CREATE TABLE auto_update_time (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',content VARCHAR(255) NOT NULL COMMENT '名称',create_time TIMESTAMP DEFAULT NULL COMMENT '创建时间',update_time TIMESTAMP DEFAULT NULL COMMENT '更新时间'
)COMMENT='时间自动更新表';
表单说明:为不产生影响,数据库中创建时间与更新时间不设置默认值,也不自动更新。
mybatis-plus实现操作时间自动填充以及更新步骤如下:
①字段上添加如下注解:
@Data
@TableName("auto_update_time")
public class AutoUpdateTimeDO {@TableId(type = IdType.AUTO)private Long id;private String content;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}
②实现 MetaObjectHandler 接口:
@Component
public class DefaultDBFieldHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);setInsertFieldValByName("updateTime", LocalDateTime.now(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);}
}
4.其他字段自动填充
如创建人与更新人自动填充,这里会和创建时间以及更新时间自动填充一起,二者实现都需要实现MetaObjectHandler接口。
实现如下:
①字段上添加如下注解:
@Data
@TableName(value = "auto_fill_operator")
public class AutoFillOperatorDO extends BaseDO{@TableId(type = IdType.AUTO)private Long id;private String content;
}
@Data
public class BaseDO {@TableField(fill = FieldFill.INSERT)private String creator;@TableField(fill = FieldFill.INSERT_UPDATE)private String updater;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}
②实现 MetaObjectHandler 接口:
@Component
public class DefaultDBFieldHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {if (metaObject.getOriginalObject() instanceof BaseDO) {BaseDO baseDO = (BaseDO) metaObject.getOriginalObject();LocalDateTime current = LocalDateTime.now();// 创建时间为空,则填充当前时间if (Objects.isNull(baseDO.getCreateTime())) {baseDO.setCreateTime(current);}// 更新时间为空,则填充当前时间if (Objects.isNull(baseDO.getUpdateTime())) {baseDO.setUpdateTime(current);}String user = "creator";// 创建人为空,则填充当前用户if (Objects.isNull(baseDO.getCreator())) {baseDO.setCreator(user);}// 更新人为空,则填充当前用户if (Objects.isNull(baseDO.getUpdater())) {baseDO.setUpdater(user);}}}@Overridepublic void updateFill(MetaObject metaObject) {// 更新时间为空,则以当前时间为更新时间Object modifyTime = getFieldValByName("updateTime", metaObject);if (Objects.isNull(modifyTime)) {setFieldValByName("updateTime", LocalDateTime.now(), metaObject);}// 当前登录用户不为空,更新人为空,则当前登录用户为更新人Object modifier = getFieldValByName("updater", metaObject);String user = "updater";if (Objects.isNull(modifier)) {setFieldValByName("updater", user, metaObject);}}
}
5.分页查询
@Mapper
public interface CrudBaseMaoper extends BaseMapper<CrudBaseDO> {
}
@Service
public class CrudBaseServiceImpl {@Resourceprivate CrudBaseMaoper crudBaseMaoper;public IPage<CrudBaseDO> page(String name) {// 构造分页参数Page<CrudBaseDO> page = new Page<>(1, 10); // 当前页, 每页显示条数QueryWrapper<CrudBaseDO> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().like(CrudBaseDO::getCompanyName, name);return crudBaseMaoper.selectPage(page, queryWrapper);}
分页查询total为0,需要配置分页插件,如下:
@Configuration
public class MybatisPlusConfig {// 分页查询拦截器,可以获取total值@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 根据数据库类型选择return interceptor;}
}
6.自定义动态查询
场景:在数据库查询中,经常遇到需要根据多个可选字段进行动态查询的情况。传统写法需要为每个字段编写判空逻辑,代码冗长且重复。
通过自定义 LambdaQueryWrapper 扩展方法,实现简洁的动态查询:
示例:
public class LambdaQueryWrapperX<T> extends LambdaQueryWrapper<T> {public LambdaQueryWrapperX<T> likeIfPresent(SFunction<T, ?> column, String val) {if (StringUtils.hasText(val)) {return (LambdaQueryWrapperX<T>) super.like(column, val);}return this;}
}
@Mapper
public interface CrudProMapper extends BaseMapper<CrudProDO> {
}
@Service
public class CrudProServiceImpl implements CrudProService {@Resourceprivate CrudProMapper crudProMapper;@Overridepublic IPage<CrudProDO> getCrudProPage(CrudProPageReqVO reqVO) {IPage<CrudProDO> page = new Page<>(1, 10);return crudProMapper.selectPage(page, new LambdaQueryWrapperX<CrudProDO>().likeIfPresent(CrudProDO::getCompanyName, reqVO.getCompanyName()).likeIfPresent(CrudProDO::getCompanyCode, reqVO.getCompanyCode()));}
}
其他方法也可以一样的实现,比如eqIfPresent
7.代码生成器
(1)相关依赖
<!-- 实现对 MyBatis Plus 的自动化配置 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!-- 代码自动生成器--><!-- 与mybatis-plus版本保持一致--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3.1</version></dependency><!-- 模板引擎依赖,默认使用 Velocity --><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency>
(2)生成器代码
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.Collections;public class CodeGenerator {public static void main(String[] args) {// 多模块地址前缀,没有可不写String prefixPath = "/kaishu-sql-crud/kaishu-sql-crud-mybatis-plus-pro/";FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/test-user?useSSL=false&useUnicode=true&characterEncoding=UTF-8","root","root1234").globalConfig(builder -> {builder.author("kaishu") // 设置作者.outputDir(System.getProperty("user.dir") + prefixPath + "/src/main/java") // 输出目录.enableSwagger() // 开启swagger.fileOverride(); // 覆盖已生成文件}).packageConfig(builder -> {builder.parent("org.kaishu.sql.crud.mybatis.plus.pro") // 设置父包名.moduleName("generatordemo") // 设置父包模块名.pathInfo(Collections.singletonMap(OutputFile.xml,System.getProperty("user.dir") + prefixPath + "/src/main/resources/mapper")); // 设置mapperXml路径}).strategyConfig(builder -> {builder.addInclude("t_auto_genarater", "t_test_auto_genarater") // 设置需要生成的表名.addTablePrefix("t_", "t_") // 设置过滤表前缀.entityBuilder() // 实体类配置.enableLombok() // 启用Lombok.controllerBuilder() // Controller配置.enableRestStyle() // 启用@RestController.mapperBuilder() // Mapper配置.enableMapperAnnotation(); // 启用@Mapper}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎.execute();}
}
更详细的配置参考如下:
(1)实体类生成配置
.strategyConfig(builder -> {builder.entityBuilder().enableLombok() // 使用Lombok.enableChainModel() // 链式模型.enableRemoveIsPrefix() // 移除is前缀.enableTableFieldAnnotation() // 字段注解.versionColumnName("version") // 乐观锁字段名.logicDeleteColumnName("deleted") // 逻辑删除字段名.naming(NamingStrategy.underline_to_camel) // 命名策略.columnNaming(NamingStrategy.underline_to_camel).addSuperEntityColumns("id", "create_time", "update_time") // 公共字段.formatFileName("%sEntity") // 文件名称格式.addIgnoreColumns("is_deleted"); // 忽略字段
})
(2)Mapper生成配置
.strategyConfig(builder -> {builder.mapperBuilder().enableBaseResultMap() // 生成resultMap.enableBaseColumnList() // 生成columnList.enableMapperAnnotation() // @Mapper注解.formatMapperFileName("%sDao") // Mapper文件命名.formatXmlFileName("%sXml"); // Xml文件命名
})
(3)Service生成配置
.strategyConfig(builder -> {builder.serviceBuilder().formatServiceFileName("%sService") // Service接口命名.formatServiceImplFileName("%sServiceImpl"); // Service实现类命名
})
(4)Controller生成配置
.strategyConfig(builder -> {builder.controllerBuilder().enableRestStyle() // 使用@RestController.enableHyphenStyle() // 使用驼峰转连字符.formatFileName("%sController") // 文件命名.enableFileOverride(); // 覆盖已生成文件
})
8.代码生成器(自定义模板)
示例:这里只自定义实体类生成模板,其余照旧,这里我需要让实体类都继承我已定义好的的类BaseDO
(1)依赖同上
(2)生成器代码,基本同上
.strategyConfig(builder -> {...
})
// 加上这行代码即可
.templateConfig(builder -> {builder.entity("/templates/custom-entity.java");})
(2)自定义实体模板文件,在\src\main\resources\templates\
目录下新建custom-entity.java.ftl
文件,文件内容如下
package ${package.Entity};<#-- 基础导入 -->
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
<#-- 导入项目基础类 -->
import org.kaishu.sql.crud.mybatis.plus.pro.dal.dataobject.BaseDO;<#-- 类注释 -->
/**
* ${table.comment!} 实体类
*
* @author ${author}
* @since ${date}
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("${table.name}")
public class ${entity} extends BaseDO {private static final long serialVersionUID = 1L;<#-- 生成字段(自动排除BaseDO中已存在的字段) -->
<#list table.fields as field><#if !['id','create_time','update_time','creator','updater','deleted']?seq_contains(field.name)>/*** ${field.comment!}*/@TableField("${field.name}")private ${field.propertyType} ${field.propertyName};</#if>
</#list>
}
·
相关文章:
【Spring Boot后端组件】mybatis-plus使用
文章目录 mybatis-plus使用一、依赖引入二、添加相关配置项三、功能详解1.自增主键2.逻辑删除3.操作时间自动填充4.其他字段自动填充5.分页查询6.自定义动态查询7.代码生成器8.代码生成器(自定义模板) mybatis-plus使用 一、依赖引入 pom.xml文件 <?xml version"1.…...
Oc语言学习 —— 重点内容总结与拓展(下)
类别(分类)和拓展 分类: 专门用来给类添加新方法 不能给类添加成员属性,添加成员属性也无法取到 注意:其实可与通过runtime 给分类添加属性,即属性关联,重写setter,getter方法 分类…...
智脑进化:神经网络如何从单层感知机迈向深度学习新纪元
第一章:神经元的启示——从生物大脑到人工神经元 1.1 生物神经元的智慧:860亿神经元的协同网络 人类大脑的860亿神经元通过突触形成动态网络,每个神经元通过树突接收信号,在胞体整合后经轴突传递输出。这种“接收-处理-输出”的…...
雷云4 鼠标滚轮单击失灵解决办法
问题现象:打开雷云4 ,滚轮单击才有反应,退出雷云4,滚轮单击没反应。 解决方案: 打开雷云4, 选中鼠标中键,选择鼠标功能,选择滚轮单击,保存 然后退出后, …...
Spring Cloud动态配置刷新:@RefreshScope与@Component的协同机制解析
在微服务架构中,动态配置管理是实现服务灵活部署、快速响应业务变化的关键能力之一。Spring Cloud 提供了基于 RefreshScope 和 Component 的动态配置刷新机制,使得开发者可以在不重启服务的情况下更新配置。 本文将深入解析 RefreshScope 与 Component…...
vue2集成可在线编辑的思维导图(simple-mind-map)
最近要求做一个可在线编辑的思维导图,经过层层调研和实测,最简单的思维导图导图实现还得是simple-mind-map组件 simple-mind-map中文文档 当前我使用的是vue2项目,目前没试过是否支持vue3,但是看官网描述他们也给了有vue3的demo项…...
【开源Agent框架】CAMEL:角色扮演+任务分解
一、项目概览:重新定义智能体协作范式 CAMEL(Communicative Agents for “Mind” Exploration of Large Language Model Society)是由camel-ai社区开发的开源多智能体框架,致力于探索智能体的规模法则(Scaling Laws)。该项目通过构建包含百万级智能体的复杂社会系统,研…...
Elasticsearch-kibana索引操作
1索引模版 添加索引 PUT /_index_template/account_transaction {"priority": 0,"index_patterns": ["account_transaction*"],"template": {"settings": {"index": {"number_of_shards": "50&q…...
【python编程从入门到到实践】第十章 文件和异常
一、读取文件 pi_digits.txt3.1415926535897932384626433832791.读取文件的全部内容 # file_reader.pyfrom pathlib import Pathpath Path("pi_digits.txt") contents path.read_text() print(contents)2.相对文件路径和绝对文件路径 当相对路径行不通时&#x…...
Reactive与Ref的故事
Vue 3的两位"响应式英雄":Reactive与Ref的故事 基本介绍:响应式的两种武器 Vue 3提供了两种创建响应式数据的主要API:reactive()和ref()。它们像两种不同的魔法工具,各有所长,共同构建Vue的响应式王国。 ┌────────────────────────…...
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
1. 引言 在旅游行业和城市规划中,热门景点的数据分析具有重要意义。通过爬取景点数据并生成热力图,可以直观展示游客分布、热门区域及人流趋势,为商业决策、景区管理及智慧城市建设提供数据支持。 然而,单机爬虫在面对大规模数据…...
MySQL数据库——支持远程IP访问的设置方法总结
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…...
现在环保方面有什么新的技术动态
环保领域的技术发展迅速,尤其在“双碳”目标、数字化转型和可持续发展背景下,涌现出许多创新技术和应用。以下是当前环保领域的新技术动态(截至2024年): 一、碳中和与碳减排技术 CCUS(碳捕集、利用与封存&a…...
[模型部署] 1. 模型导出
👋 你好!这里有实用干货与深度分享✨✨ 若有帮助,欢迎: 👍 点赞 | ⭐ 收藏 | 💬 评论 | ➕ 关注 ,解锁更多精彩! 📁 收藏专栏即可第一时间获取最新推送🔔…...
Neo4j 图书馆借阅系统知识图谱设计
一、数据模型设计 节点类型 读者(Reader) 属性: reader_id, name, age, gender, phone, email, register_date 图书(Book) 属性: book_id, title, author, publisher, publish_date, isbn, price, category 图书副本(BookCopy) 属性: copy_id, status (在馆/借出/维修), loca…...
android 安装openwrt 安正步骤
安装 QEMU 模拟器 bash 复制 编辑 pkg install wget pkg install qemu-utils pkg install qemu-system-aarch64-headless 可选 x86 模拟支持: bash 复制 编辑 pkg install qemu-system-x86-64-headless ✅ 下载 OpenWRT 镜像(armvirt 64) bash 复制 编辑 mkdir -p ~/openwr…...
大规模CFD仿真计算中,SIMPLE或者PISO算法中加速压力场方程迭代求解
文章目录 在SIMSOL或PISO算法中加速压力场方程的迭代求解是提高CFD计算效率的关键。以下从算法优化、数值技巧和并行计算等方面总结加速策略:**1. 压力方程求解器的选择与优化****2. 算法层面的加速****3. 离散格式与网格优化****4. 并行计算与硬件加速****5. 代码级…...
【C#】 lock 关键字
在 C# 里,lock 关键字就是对 Monitor.Enter/Exit 的简写。它的作用是保证“同一时刻只有一个线程能进入被保护的代码块”,从而避免多个线程同时修改同一个共享状态导致竞态条件(race condition)。 一、结合Jog 的例子讲解 // Mot…...
前端脚手架开发指南:提高开发效率的核心操作
前端脚手架通过自动化的方式可以提高开发效率并减少重复工作,而最强大的脚手架并不是现成的那些工具而是属于你自己团队量身定制的脚手架!本篇文章将带你了解脚手架开发的基本技巧,帮助你掌握如何构建适合自己需求的工具,并带着你…...
职坐标AIoT技能培训课程实战解析
职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心,构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路,通过分层递进的知识模块帮助学员建立系统…...
Yocto Project 快速构建
此文为机器辅助翻译,仅供个人学习使用,如有翻译不当之处欢迎指正 1 Yocto 项目快速构建 1.1 欢迎! 本简短文档将引导您完成使用 Yocto Project 进行典型镜像构建的流程,并介绍如何为特定硬件配置构建环境。您将使用 Yocto Proj…...
git相关配置
git相关配置 欢迎使用Markdown编辑器修改Git默认编辑器为vimgit配置默认用户名和密码: 欢迎使用Markdown编辑器 修改Git默认编辑器为vim #方法1:直接执行 git config --global core.editor vim#方法2:修改git的配置文件.git/config文件&am…...
ci/cd全流程实操
本次采用架构,gitlab + jenkins + 镜像仓库+ k8s 准备工作 一、gitlab部署 拉取镜像 部署环境: macbook m2中docker部署gitlab (m2平台架构问题,这里只能用yrzr/gitlab-ce-arm64v8 这个容器镜像) docker pull yrzr/gitlab-ce-arm64v8 在 Docker 里,–privileged=tr…...
Python中in和is关键字详解和使用
在 Python 中,in 和 is 是两个常用但含义不同的关键字,初学者很容易混淆它们的用法。下面是关于它们的详细解释、注意事项及常见示例。 一、关键字 in:成员运算符 1. 功能 用于判断某个元素是否存在于序列(如列表、元组、字符串…...
ACM模式用Scanner和System.out超时的解决方案和原理
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:笔试强训 📚本系列文章为个人学…...
微服务中服务降级和异常的区别
在Java中,服务降级和异常处理是两个相关但不同的概念。它们的主要区别如下: 1. 服务降级(Service Degradation): 定义:服务降级是指在系统中某个服务或功能出现问题时,通过采取某些策略来降低服务的质量或…...
MYSQL创建索引的原则
创建索引的原则包括: 表中的数据量超过10万以上时考虑创建索引。 选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。 尽量使用复合索引,覆盖SQL的返回值。 如果字段区分度不高,可以将其放在组合索引的后面。 对于…...
29、魔法微前端——React 19 模块化架构
一、时空结界分割术(模块化架构设计) 1. 次元切割协议 // 主应用入口const HogwartsMain () > {const [subApps] useState({potion: React.lazy(() > import(./PotionShop)),library: React.lazy(() > import(./LibraryApp)),quidditch: R…...
【PmHub后端篇】PmHub 中缓存与数据库一致性的实现方案及分析
在软件开发项目中,缓存的使用十分普遍。缓存作为一种存储机制,能够暂时保存数据,从而加速数据的读取和访问。然而,当数据同时存在于缓存和数据库中时,如何保证两者的数据一致性成为了一个关键问题。在 PmHub 项目中&am…...
Verilog HDL 语言整理
Verilog HDL 语言 Verilog HDL 简介 硬件描述语言Hardware Description Language是一种用形式化方法即文本形式 来描述和设计数字电路和数字系统的高级模块化语言 Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于建模…...
[250516] OpenAI 升级 ChatGPT:GPT-4.1 及 Mini 版上线!
目录 ChatGPT 迎来重要更新:GPT-4.1 和 GPT-4.1 mini 正式上线用户如何访问新模型?技术亮点与用户体验优化 ChatGPT 迎来重要更新:GPT-4.1 和 GPT-4.1 mini 正式上线 OpenAI 宣布在 ChatGPT 平台正式推出其最新的 AI 模型 GPT-4.1 和 GPT-4.…...
R语言学习--Day03--数据清洗技巧
在一般情况下,我们都是在数据分析的需求前提下去选择使用R语言。而实际上,数据分析里,百分之八十的工作,都是在数据清洗。并不只是我们平时会提到的异常值处理或者是整合格式,更多会涉及到将各种各样的数据整合&#x…...
文件系统交互实现
关于之前的搭建看QT控件文件系统的实现-CSDN博客,接下来是对本程序的功能完善,我想着是这样设计的,打开一个目录以后,鼠标选中一个项可以是目录,也可以是文件,右键可以出现一个菜单选择操作,比如…...
SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
/// <summary> /// SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。 /// </summary> public class SqlHelper : IDbHelper {private readonly IDbConnectionFactory _connectionFactory;private…...
DevExpressWinForms-RichEditControl-基础应用
RichEditControl-基础应用 在企业级WinForms应用开发中,富文本编辑与文档处理是常见需求。DevExpress WinForms的RichEditControl作为一款功能强大的富文本编辑控件,提供了媲美Microsoft Word的文档处理能力,支持复杂格式编辑、打印导出、界…...
Elasticsearch 索引副本数
作者:来自 Elastic Kofi Bartlett 解释如何配置 number_of_replicas、它的影响以及最佳实践。 更多阅读:Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica 想获得 Elastic 认证?查看下一期 Elasticsearc…...
RabbitMQ 扇形交换器工作原理详解
目录 一、扇形交换器简介二、扇形交换器工作原理2.1 消息广播机制2.2 路由键的忽略三、代码示例3.1 生产者代码3.2 消费者代码四、实际应用场景4.1 日志收集系统4.2 实时通知系统4.3 事件驱动架构五、总结在 RabbitMQ 的众多交换器类型中,扇形交换器(Fanout Exchange)是一种…...
IDEA中springboot项目中连接docker
具体内容如下: 1、在Linux中安装docker 使用安装命令: apt-get install docker.io 还有一个是更新软件并安装docker: sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io 运行docker systemctl start …...
arxiv等开源外文书数据的获取方式
一、一些基本说明 开放API接口文档:https://info.arxiv.org/help/api/user-manual.html#2-api-quickstart研究领域分类说明文档:https://arxiv.org/category_taxonomy 二、基于url接口方式检索并获取数据 本质是get方式,在url中传检索参数…...
ChatGPT再升级!
近日,OpenAI 正式发布 GPT-4.1 和轻量级版本 GPT-4.1mini,并已全面上线 ChatGPT 平台,迅速引发全球 AI 圈热议,标志着 ChatGPT 在智能化和效率上再登新高峰。 GPT-4.1 是为编程与任务处理优化的高性能模型。相较前作 GPT-4o&#…...
23、电网数据管理与智能分析 - 负载预测模拟 - /能源管理组件/grid-data-smart-analysis
76个工业组件库示例汇总 电网数据管理与智能分析组件 1. 组件概述 本组件旨在模拟一个城市配电网的运行状态,重点关注数据管理、可视化以及基于模拟数据的智能分析,特别是负载预测功能。用户可以通过界面交互式地探索电网拓扑、查看节点状态、控制时间…...
#跟着若城学鸿蒙# web篇-获取定位
前言 在业务中,某些网页上需要获取用户的地理位置,然后按照用户搜索的兴趣点与用户的距离远近进行排序,这就需要h5能够获取到用户的位置。 由于 web 组件基于Chromium M114 版本开发,前端就可以使用navigator.geolocation.getC…...
前端批量下载文件打包为zip
多文件需要一次性下载为zip文件 这是近期遇到的一个需求,本身是多文件上传的,下载时单个下载太慢又繁杂,用户希望能一次性批量下载,就选择了jszip import axios from "axios" import JSZip from "jszip" im…...
Vue百日学习计划Day9-15天详细计划-Gemini版
重要提示: 番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。灵活性: JavaScript 的概念较多,尤其是 this、原型链、闭包和异步编程,可能需要更多…...
MySQL8.x新特性:与mysql5.x的版本区别
MySQL8.x新特性 1.与mysql5.x的区别:MySQL8.x新特性:与mysql5.x的版本区别-CSDN博客 2.窗口函数(Window Functions):MySQL8.x新特性:窗口函数(Window Functions)-CSDN博客 引言 …...
RabbitMQ 消息模式实战:从简单队列到复杂路由(三)
精准投递:路由模式 路由模式详解 路由模式是 RabbitMQ 中一种功能强大且灵活的消息传递模式,它在发布订阅模式的基础上,引入了路由键(Routing Key)的概念,实现了消息的精准路由和分发 。在路由模式中&…...
STM32 定时器主从模式配置解析
STM32 定时器主从模式配置解析 下面这两行代码是配置STM32定时器主从模式的关键设置 代码功能解析 TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); // 选择从模式输出的触发源 TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 选择从模式1. TIM_SelectInputTrigger(T…...
Leetcode76覆盖最小子串
覆盖最小子串 代码来自b站左程云 class Solution {public String minWindow(String str, String tar) {char[] s str.toCharArray();char[] t tar.toCharArray();int[] cnt new int[256];for (char cha : t) { cnt[cha]--;}int len Integer.MAX_VALUE;int debt t.length…...
Perl语言深度考查:从文本处理到正则表达式的全面掌握
阅读原文 前言:为什么Perl依然值得学习? "这个脚本用Perl写只需要5分钟!"——在当今Python大行其道的时代,你依然能在不少企业的运维部门听到这样的对话。Perl作为一门有着30多年历史的语言,凭借其强大的文…...
idea中Lombok失效的解决方案
Lombok 是一个 Java 库,旨在通过注解简化 Java 代码的编写,减少样板代码,提高开发效率。它通过自动生成常见的代码(如 getter、setter、构造函数等)来减少开发者的手动编码工作。 一般Lombok失效有四步排查方案&#…...