MyBatis-Plus介绍及基本使用
文章目录
- 概述
- 介绍
- MyBatis-Plus 常用配置
- 分页插件配置类
- 注解配置
- 快速入门
- maven 依赖
- 编写配置文件
- 编写启动类
- 编写 MybatisPlus 配置类
- 代码生成器:MybatisPlusGenerator
- maven依赖
- 代码生成器核心类
概述
介绍
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
主页: 传送门
引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。
特性:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
- 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
MyBatis-Plus 常用配置
MyBatis-Plus 的配置可以通过 application.properties 或 application.yml 文件进行。以下是一些常用的配置选项及其说明。
mybatis-plus:# 指定MyBatis-Plus映射文件的位置mapper-locations: classpath:mapper/*.xml# 指定MyBatis-Plus映射文件的位置。递归查找所有子目录中符合.xml格式的文件#mapper-locations: "classpath*:/mapper/**/*.xml"# 指定实体类的包路径,自动扫描并注册别名type-aliases-package: com.example.yourproject.entity# 全局配置。用于设置MyBatis-Plus的一些整体行为global-config:db-config:# 主键生成策略。默认auto。可选值有auto(自动增长)、none(无)、input(手动输入)、id_worker(雪花算法)、uuid等id-type: auto# 表前缀,用于生成 SQL 时自动去掉前缀table-prefix: t_# 配置逻辑删除字段(如果使用了逻辑删除功能)logic-delete-field: deleted# 逻辑删除字段的值,表示已删除logic-delete-value: 1# 逻辑删除字段的值,表示未删除logic-not-delete-value: 0# 字段策略,可选值有 not_null(非空插入)、not_empty(非空插入)、ignore(忽略)等field-strategy: not_empty# 是否开启大写模式,生成的 SQL 字段名将全部大写capital-mode: true# 是否刷新缓存,默认为 truerefresh: true# 分页配置。用于启用分页功能pagination:# 每页大小。默认10page-size: 10# 是否统计总记录数。默认truetotal: true# 是否合理化分页,当分页参数不合理时,自动调整。默认falsereasonable: true# 是否支持方法参数作为分页参数。默认falsesupport-methods-arguments: true# 分页参数名,可以自定义params: null# 配置。用于configuration:# 开启下划线转驼峰命名规则。默认truemap-underscore-to-camel-case: true# 设置MyBatis-Plus的日志输出。日志实现类,org...logging.stdout.StdOutImpl (控制台输出)或其他日志实现类log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
注:
-
mybatis-plus.mapper-locations:指定MyBatis-Plus映射文件的位置。若不指定,MyBatis-Plus 会尝试从
resources/mapper/目录下加载 XML 文件(这是 Spring Boot 和 MyBatis 的默认行为) -
type-aliases-package:指定实体类的包路径,自动扫描并注册别名。如果实体类名与数据库表名一致,或者已经通过@TableName 注解指定了正确的表名,则该配置可以缺省
该配置缺省时,MyBatis-Plus会自动识别实体类并映射到相应的数据库表,但在 XML 中引用实体类时需要使用全限定名
分页插件配置类
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {/*** 分页插件* 注:3.5.9版本,MyBatis-Plus 对分页插件做了拆分,需要单独引用mybatis-plus-jsqlparser依赖以支持PaginationInnerInterceptor类*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
注解配置
-
@MapperScan:用于扫描 Mapper 接口,并将这些接口注册为 Spring 容器中的 Bean
-
注解位置:通常放在 Spring Boot 应用的主类上,或者放在配置类上
-
支持通配符:支持使用通配符
*来匹配一级包路径,如果需要匹配多级包路径,可以使用**来代替 -
属性:
-
value 或 basePackages:指定需要扫描的包路径。可以是一个或多个包路径,用逗号分隔。
-
markerInterface:指定一个标记接口,只有实现了该接口的 Mapper 接口才会被扫描。
这个参数可以用于更细粒度地控制扫描范围。
-
sqlSessionFactoryRef:指定 SQL 会话工厂的引用名称。
-
这个参数通常用于多数据源配置时,指定不同数据源对应的 SQL 会话工厂。
-
-
注意:
- 包路径的正确性:在使用
@MapperScan注解时,需要确保指定的包路径是正确的,并且包含了所有需要扫描的 Mapper 接口。 - 避免重复扫描:如果项目中已经通过其他方式(如
@Mapper注解)将 Mapper 接口注册为 Bean,那么在使用@MapperScan注解时,需要避免重复扫描这些接口,否则可能会导致 Bean 冲突或性能问题。 - 多数据源配置:在配置多数据源时,需要注意
sqlSessionFactoryRef参数的使用,以确保不同数据源对应的 Mapper 接口能够正确注册和使用。
- 包路径的正确性:在使用
-
-
@TableName:指定实体类对应的数据库表名
-
说明:如果实体类的名称与数据库表名在命名上保持一致(即遵循驼峰转下划线的命名规则),则此注解不是必需的。但如果命名不一致,则需要使用此注解来明确指定表名。
-
示例:
@TableName("user") public class User {// 实体类属性 }
-
-
@TableId:指定实体类中的主键字段
-
说明:如果实体类中有一个名为
id的字段,并且希望它作为主键,则此注解不是必需的,因为 MyBatis-Plus 默认会将名为id的字段作为主键。但如果主键字段的名称不是id,或者需要指定主键的生成策略(如自增、UUID等),则需要使用此注解。 -
属性:
value:字段名。type:主键类型。可选值有IdType.AUTO(自增)、IdType.NONE(无主键)、IdType.ASSIGN_ID(全局唯一ID)、IdType.ASSIGN_UUID(全局唯一UUID)等。
-
示例:
@TableId(value = "id", type = IdType.AUTO) private Long id;
-
-
@TableField:指定实体类中的普通字段与数据库表字段之间的映射关系
-
说明:如果实体类的字段名与数据库表的字段名在命名上保持一致(即遵循驼峰转下划线的命名规则),则此注解不是必需的。但如果字段名不一致,或者字段名与数据库的关键字冲突,或者需要处理成员变量以
is开头且是布尔值的情况,则需要使用此注解。 -
属性:
-
value:字段名。 -
exist:字段是否存在,默认为true。如果实体类中有一些字段不需要映射到数据库表中,则可以设置为
false -
fill:字段填充策略,可选值有FieldFill.INSERT(插入时填充)、FieldFill.UPDATE(更新时填充)等。
-
-
示例:
@TableField(value = "name", fill = FieldFill.INSERT) private String name;
-
-
@TableLogic:指定逻辑删除字段
-
属性:
value:字段名。delval:删除标记值。undelval:未删除标记值。
-
示例:
@TableLogic(value = "0", delval = "1") private Integer deleted; -
是否必需:如果需要使用逻辑删除功能,则必须使用此注解。
-
-
@Version:指定乐观锁字段
-
示例:
@Version private Integer version; -
是否必需:如果需要使用乐观锁功能,则必须使用此注解。
@KeySequence:指定 Oracle 数据库的序列
-
属性:
value:序列名。
-
示例:
@TableId(type = IdType.SEQUENCE, value = "user_seq") private Long id; -
是否必需:如果使用 Oracle 数据库的序列生成主键,则必须使用此注解。
@Transient:指定不持久化的字段
-
示例:
@Transient private String tempField; -
是否必需:如果实体类中有一些临时字段不需要持久化到数据库,则可以使用此注解。
-
快速入门
maven 依赖
<!-- MyBatis-plus启动器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.9</version><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></exclusion></exclusions>
</dependency>
<!--引入较新的mybatis-spring,支持springboot3-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version>
</dependency>
<!--3.5.9版本,MyBatis-Plus 对分页插件做了拆分,需要单独引用依赖。jdk8引入mybatis-plus-jsqlparser-4.9 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-jsqlparser</artifactId><version>3.5.9</version>
</dependency><!-- MyBatis-plus-generator 代码生成器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.9</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>
编写配置文件
application.yml
spring:application:name: plus-testdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///mytest?characterEncoding=UTF-8username: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSource# myBatis-plus
mybatis-plus:# 指定MyBatis-Plus映射文件的位置mapper-locations: classpath*:mapper/*.xml# 指定实体类的包路径,自动扫描并注册别名type-aliases-package: com.example.entityconfiguration:# 设置MyBatis-Plus的日志输出。日志实现类,org...logging.stdout.StdOutImpl (控制台输出)或其他日志实现类log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
编写启动类
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.**.mapper")
public class SpringBootRunner {public static void main(String[] args) {SpringApplication.run(SpringBootRunner.class,args);}
}
编写 MybatisPlus 配置类
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {/*** 分页插件* 注:3.5.9版本,MyBatis-Plus 对分页插件做了拆分,需要单独引用mybatis-plus-jsqlparser依赖以支持PaginationInnerInterceptor类*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
代码生成器:MybatisPlusGenerator
maven依赖
<!-- MyBatis-plus-generator 代码生成器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>
代码生成器核心类
示例是将代码生成器集成到 Spring 环境中,部分配置参数放到了配置文件中。
-
核心类
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.stereotype.Component;import java.util.Arrays; import java.util.Collections;/*** MyBatis-Plus代码生成器*/ @Component public class MybatisPlusGeneratorRunner {@Autowiredprivate DataSourceProperties dbProp;@Autowiredprivate MybatisPlusGeneratorProperties generatorProp;@PostConstructpublic void run() {execute();}private void execute() {FastAutoGenerator// 数据库配置.create(dbProp.getUrl(), dbProp.getUsername(), dbProp.getPassword())// 全局配置.globalConfig((builder) -> {// 设置注释信息-作者builder.author(generatorProp.getAuthor());// 设置swagger注解//builder.enableSwagger();// 设置代码生成的路径builder.outputDir(generatorProp.getOutputDirRoot() + "/src/main/java");// 完成后不打开文件夹builder.disableOpenDir();// 不生成service接口,但是依然会生成serviceImpl//builder.disableServiceInterface();})// 包配置.packageConfig((builder) -> {// 设置父包路径builder.parent(generatorProp.getPackagePath());//设置xml文件路径builder.pathInfo(Collections.singletonMap(OutputFile.xml,generatorProp.getOutputDirRoot() + "/src/main/resources/mapper"));// 设置实体类包名builder.entity(generatorProp.getPackageEntity());// 设置Mapper接口包名//builder.mapper("mapper");// 设置Service接口包名//builder.service("service");// 设置Service实现类包名//builder.serviceImpl("service.impl");})// 策略配置.strategyConfig((builder) -> {// 指定表builder.addInclude("all".equals(generatorProp.getDbTables()) ?Collections.emptyList() : Arrays.asList(generatorProp.getDbTables().split(",")));// controller的策略配置builder.controllerBuilder()// 启用rest风格.enableRestStyle()// 开启驼峰转连字符.enableHyphenStyle()// 禁用生成.disable()// 覆盖已有文件//.enableFileOverride().build();// service的策略配置builder.serviceBuilder()// 格式化service接口文件名称.formatServiceFileName("%sService")// 格式化service实现类文件名称.formatServiceImplFileName("%sServiceImp")// 禁用生成.disable()// 覆盖已有文件//.enableFileOverride().build();// entity的策略配置builder.entityBuilder()// 启用Lombok插件.enableLombok()// 启用表字段注解.enableTableFieldAnnotation()// 版本字段名称.versionColumnName(generatorProp.getVersionColumnName())// 逻辑删除字段名称.logicDeleteColumnName(generatorProp.getLogicDeleteColumnName())// 设置字段名的命名策略为下划线转驼峰命名.columnNaming(NamingStrategy.underline_to_camel)// 主键策略递增.idType(IdType.ASSIGN_UUID)// 格式化实体类名称.formatFileName("%sEntity")// 覆盖已有文件//.enableFileOverride().build();// mapper的策略配置builder.mapperBuilder().enableBaseColumnList().enableBaseResultMap();}).execute();} } -
配置类
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component;@Data @Component @RefreshScope @ConfigurationProperties(prefix = "mybatis-plus.generator") public class MybatisPlusGeneratorProperties {// 作者private String author = "blackcrow";// 代码生成的模块路径,例如:D:\IdeaProjects\open_multielement\userprivate String outputDirRoot;// 父包路径,例如:com.example.userprivate String packagePath;// 实体类包名,例如:entityprivate String packageEntity = "entity";// 表名,多个英文逗号分隔,所有输入 allprivate String dbTables;// 版本字段名称private String versionColumnName = "version";// 逻辑删除字段名称private String logicDeleteColumnName = "is_delete"; }
相关文章:
MyBatis-Plus介绍及基本使用
文章目录 概述介绍MyBatis-Plus 常用配置分页插件配置类注解配置 快速入门maven 依赖编写配置文件编写启动类编写 MybatisPlus 配置类 代码生成器:MybatisPlusGeneratormaven依赖代码生成器核心类 概述 介绍 MyBatis-Plus(简称 MP)是一个 M…...
SpringBoot 整合 Avro 与 Kafka
优质博文:IT-BLOG-CN 【需求】:生产者发送数据至 kafka 序列化使用 Avro,消费者通过 Avro 进行反序列化,并将数据通过 MyBatisPlus 存入数据库。 一、环境介绍 【1】Apache Avro 1.8;【2】Spring Kafka 1.2…...
支持JT1078和GB28181的流媒体服务器-LKM启动配置文件参数说明
流媒体服务器地址:https://github.com/lkmio/lkm GB28181信令,模拟多个国标设备工具:https://github.com/lkmio/gb-cms 文章目录 gop_cachegop_buffer_sizeprobe_timeoutwrite_timeoutmw_latencylisten_ippublic_ipidle_timeoutreceive_timeo…...
什么是隐式类型转换?隐式类型转换可能带来哪些问题? 显式类型转换(如强制类型转换)有哪些风险?
C 中的隐式类型转换 定义:在 C 中,隐式类型转换是指由编译器自动执行的类型转换,不需要程序员显式地进行操作。这种转换在很多情况下会自动发生,比如在表达式求值、函数调用传参等过程中。常见场景 算术运算中的转换:…...
量化交易新利器:阿布量化(AbuQuant)——金融研究者的得力助手
🚀 量化交易新利器:阿布量化(AbuQuant)——金融研究者的得力助手 🚀 文章目录 🚀 量化交易新利器:阿布量化(AbuQuant)——金融研究者的得力助手 🚀dz…...
UI设计从入门到进阶,全能实战课
课程内容: ├── 【宣导片】从入门到进阶!你的第一门UI必修课!.mp4 ├── 第0课:UI知识体系梳理 学习路径.mp4 ├── 第1课:IOS设计规范——基础规范与切图.mp4 ├── 第2课:IOS新趋势解析——模块规范与设计原则(上).mp4…...
Uniapp自动调整元素高度
获取设备的像素 如果你想让元素的高度相对于整个屏幕的高度占用一定的比例,可以通过获取屏幕的高度,然后计算出你想要的比例来设置元素的高度。以下是如何实现的示例: <script setup> import { ref, onMounted } from vue;// 定义一个…...
软考高项经验分享:我的备考之路与实战心得
软考,尤其是信息系统项目管理师(高项)考试,对于众多追求职业提升与专业认可的人士来说,是一场充满挑战与机遇的征程。我在当年参加软考高项的经历,可谓是一波三折,其中既有成功的喜悦࿰…...
安全关系型数据库查询新选择:Rust 语言的 rust-query 库深度解析
在当今这个数据驱动的时代,数据库作为信息存储和检索的核心组件,其重要性不言而喻。然而,对于开发者而言,如何在保证数据安全的前提下,高效地进行数据库操作却是一项挑战。传统的 SQL 查询虽然强大,但存在诸…...
《C++ 模型训练之早停法:有效预防过拟合的关键策略》
在 C 模型开发的复杂世界里,过拟合犹如一个潜藏的陷阱,常常使我们精心构建的模型在实际应用中表现大打折扣。而早停法(Early Stopping)作为一种行之有效的策略,能够帮助我们及时察觉模型训练过程中的异常,避…...
5.11【数据库】第一次实验
民宿预定,至少有不同的民宿,民宿下面有不同的房间(面积,房间编号) 房间类型,单价, 可预订以及不可预订 游客信息 订单信息 公司有很多课程, 学生,课程 每位学生每期…...
【CSS in Depth 2 精译_062】第 10 章 CSS 中的容器查询(@container)概述 + 10.1 容器查询的一个简单示例
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 ✔️ 10.1.1 容器尺寸查询的用法 ✔️ 10.2 深入理解容器10.3 与容器相关的单位10.4 容器样式查询的用法10.5 本章小结 文章目录 第 10…...
蓝桥杯每日真题 - 第23天
题目:(直线) 题目描述(12届 C&C B组C题) 解题思路: 题目理解: 在平面直角坐标系中,从给定的点集中确定唯一的直线。 两点确定一条直线,判断两条直线是否相同,可通过…...
# Vue 入门级教程三
在前两篇 Vue 入门教程中,我们已经熟悉了 Vue 的基础语法、数据绑定、指令以及组件化开发等核心概念。在本教程中,我们将进一步探索 Vue 的高级特性,包括过滤器、自定义指令、过渡效果以及 Vue 与后端数据交互等内容,让你能够构建…...
hint: Updates were rejected because the tip of your current branch is behind!
问题 本地仓库往远段仓库推代码时候提示: error: failed to push some refs to 192.168.2.1:java-base/java-cloud.git hint: Updates were rejected because the tip of your current branch is behind! refs/heads/master:refs/heads/master [rejected] (…...
PHP 方头像转为圆图
业务需要把创建海报上的用户头像由方形转为圆形,前端的样式设置不能用。 故采用GD的函数来对方图进行裁剪处理为圆图。 目录 裁剪函数 本地图片 远程图片 效果 参考文章 总结 裁剪函数 从网上找的一个裁剪图片的函数。 代码如下: /* * 将图片切…...
centos 7 离线安装postgis插件
前一段时间记录了下如何在centos7中离线安装postgresql,因为工作需要,我不仅要安装postgresql,还需要安装postgis插件,这篇文章记录下postgis插件的安装过程。 1. 安装前的参考 如下的链接都是官网上的链接,对你安装p…...
pyinstaller打包的时候将ffmpeg也加进包中(包括打包文件夹的方法)
在使用 PyInstaller 打包包含 pydub 的 Python 应用程序时,由于 pydub 需要依赖 ffmpeg,你需要确保 ffmpeg 被正确包含进打包后的程序。以下是操作步骤: 1. 准备 ffmpeg 首先,确保你已经下载并安装了 ffmpeg。可以通过以下方式获取…...
JVM面试知识点1
内存结构(掌握内存结构划分、熟知各区域结构功能) 经典的JVM内存结构: 按照线程是否共享来划分: Heap (堆区) 1. 堆区的介绍 堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域,被所有线程共…...
wordpress
2024年自己建网站的步骤,新手自学建站教程 – 奶爸建站笔记 超详细图解:从 0 搭建一个个人网站,也太简单了吧 - 王一白 - 博客园 如何使用插件或者自定义页面创建一个WordPress着陆页 - 闪电博...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
