当前位置: 首页 > news >正文

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.propertiesapplication.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 配置类 代码生成器&#xff1a;MybatisPlusGeneratormaven依赖代码生成器核心类 概述 介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 M…...

SpringBoot 整合 Avro 与 Kafka

优质博文&#xff1a;IT-BLOG-CN 【需求】&#xff1a;生产者发送数据至 kafka 序列化使用 Avro&#xff0c;消费者通过 Avro 进行反序列化&#xff0c;并将数据通过 MyBatisPlus 存入数据库。 一、环境介绍 【1】Apache Avro 1.8&#xff1b;【2】Spring Kafka 1.2&#xf…...

支持JT1078和GB28181的流媒体服务器-LKM启动配置文件参数说明

流媒体服务器地址&#xff1a;https://github.com/lkmio/lkm GB28181信令&#xff0c;模拟多个国标设备工具&#xff1a;https://github.com/lkmio/gb-cms 文章目录 gop_cachegop_buffer_sizeprobe_timeoutwrite_timeoutmw_latencylisten_ippublic_ipidle_timeoutreceive_timeo…...

什么是隐式类型转换?隐式类型转换可能带来哪些问题? 显式类型转换(如强制类型转换)有哪些风险?

C 中的隐式类型转换 定义&#xff1a;在 C 中&#xff0c;隐式类型转换是指由编译器自动执行的类型转换&#xff0c;不需要程序员显式地进行操作。这种转换在很多情况下会自动发生&#xff0c;比如在表达式求值、函数调用传参等过程中。常见场景 算术运算中的转换&#xff1a;…...

量化交易新利器:阿布量化(AbuQuant)——金融研究者的得力助手

&#x1f680; 量化交易新利器&#xff1a;阿布量化&#xff08;AbuQuant&#xff09;——金融研究者的得力助手 &#x1f680; 文章目录 &#x1f680; 量化交易新利器&#xff1a;阿布量化&#xff08;AbuQuant&#xff09;——金融研究者的得力助手 &#x1f680;&#x1f3…...

UI设计从入门到进阶,全能实战课

课程内容&#xff1a; ├── 【宣导片】从入门到进阶!你的第一门UI必修课!.mp4 ├── 第0课&#xff1a;UI知识体系梳理 学习路径.mp4 ├── 第1课&#xff1a;IOS设计规范——基础规范与切图.mp4 ├── 第2课&#xff1a;IOS新趋势解析——模块规范与设计原则(上).mp4…...

Uniapp自动调整元素高度

获取设备的像素 如果你想让元素的高度相对于整个屏幕的高度占用一定的比例&#xff0c;可以通过获取屏幕的高度&#xff0c;然后计算出你想要的比例来设置元素的高度。以下是如何实现的示例&#xff1a; <script setup> import { ref, onMounted } from vue;// 定义一个…...

软考高项经验分享:我的备考之路与实战心得

软考&#xff0c;尤其是信息系统项目管理师&#xff08;高项&#xff09;考试&#xff0c;对于众多追求职业提升与专业认可的人士来说&#xff0c;是一场充满挑战与机遇的征程。我在当年参加软考高项的经历&#xff0c;可谓是一波三折&#xff0c;其中既有成功的喜悦&#xff0…...

安全关系型数据库查询新选择:Rust 语言的 rust-query 库深度解析

在当今这个数据驱动的时代&#xff0c;数据库作为信息存储和检索的核心组件&#xff0c;其重要性不言而喻。然而&#xff0c;对于开发者而言&#xff0c;如何在保证数据安全的前提下&#xff0c;高效地进行数据库操作却是一项挑战。传统的 SQL 查询虽然强大&#xff0c;但存在诸…...

《C++ 模型训练之早停法:有效预防过拟合的关键策略》

在 C 模型开发的复杂世界里&#xff0c;过拟合犹如一个潜藏的陷阱&#xff0c;常常使我们精心构建的模型在实际应用中表现大打折扣。而早停法&#xff08;Early Stopping&#xff09;作为一种行之有效的策略&#xff0c;能够帮助我们及时察觉模型训练过程中的异常&#xff0c;避…...

5.11【数据库】第一次实验

民宿预定&#xff0c;至少有不同的民宿&#xff0c;民宿下面有不同的房间&#xff08;面积&#xff0c;房间编号&#xff09; 房间类型&#xff0c;单价&#xff0c; 可预订以及不可预订 游客信息 订单信息 公司有很多课程&#xff0c; 学生&#xff0c;课程 每位学生每期…...

【CSS in Depth 2 精译_062】第 10 章 CSS 中的容器查询(@container)概述 + 10.1 容器查询的一个简单示例

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 ✔️ 10.1.1 容器尺寸查询的用法 ✔️ 10.2 深入理解容器10.3 与容器相关的单位10.4 容器样式查询的用法10.5 本章小结 文章目录 第 10…...

蓝桥杯每日真题 - 第23天

题目&#xff1a;&#xff08;直线&#xff09; 题目描述&#xff08;12届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目理解: 在平面直角坐标系中&#xff0c;从给定的点集中确定唯一的直线。 两点确定一条直线&#xff0c;判断两条直线是否相同&#xff0c;可通过…...

# Vue 入门级教程三

在前两篇 Vue 入门教程中&#xff0c;我们已经熟悉了 Vue 的基础语法、数据绑定、指令以及组件化开发等核心概念。在本教程中&#xff0c;我们将进一步探索 Vue 的高级特性&#xff0c;包括过滤器、自定义指令、过渡效果以及 Vue 与后端数据交互等内容&#xff0c;让你能够构建…...

hint: Updates were rejected because the tip of your current branch is behind!

问题 本地仓库往远段仓库推代码时候提示&#xff1a; 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 方头像转为圆图

业务需要把创建海报上的用户头像由方形转为圆形&#xff0c;前端的样式设置不能用。 故采用GD的函数来对方图进行裁剪处理为圆图。 目录 裁剪函数 本地图片 远程图片 效果 参考文章 总结 裁剪函数 从网上找的一个裁剪图片的函数。 代码如下&#xff1a; /* * 将图片切…...

centos 7 离线安装postgis插件

前一段时间记录了下如何在centos7中离线安装postgresql&#xff0c;因为工作需要&#xff0c;我不仅要安装postgresql&#xff0c;还需要安装postgis插件&#xff0c;这篇文章记录下postgis插件的安装过程。 1. 安装前的参考 如下的链接都是官网上的链接&#xff0c;对你安装p…...

pyinstaller打包的时候将ffmpeg也加进包中(包括打包文件夹的方法)

在使用 PyInstaller 打包包含 pydub 的 Python 应用程序时&#xff0c;由于 pydub 需要依赖 ffmpeg&#xff0c;你需要确保 ffmpeg 被正确包含进打包后的程序。以下是操作步骤&#xff1a; 1. 准备 ffmpeg 首先&#xff0c;确保你已经下载并安装了 ffmpeg。可以通过以下方式获取…...

JVM面试知识点1

内存结构&#xff08;掌握内存结构划分、熟知各区域结构功能&#xff09; 经典的JVM内存结构&#xff1a; 按照线程是否共享来划分&#xff1a; Heap (堆区&#xff09; 1. 堆区的介绍 堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域&#xff0c;被所有线程共…...

wordpress

2024年自己建网站的步骤&#xff0c;新手自学建站教程 – 奶爸建站笔记 超详细图解&#xff1a;从 0 搭建一个个人网站&#xff0c;也太简单了吧 - 王一白 - 博客园 如何使用插件或者自定义页面创建一个WordPress着陆页 - 闪电博...

Day33 动态规划part02

62.不同路径 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 代码随想录 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili class Solution {public int uniquePaths(int m, int n) {int dp[][] = new int[m][n];//初…...

渗透测试之Web基础之Linux病毒编写——泷羽sec

声明&#xff1a; 学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。本文只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 (bilibili.com)https://space.bilibili.com/350329294 导读&#xff1a; 时刻…...

jmeter基础07_组件的层级

课程大纲 1. 优先级/执行顺序&#xff08;一般情况&#xff09; 同级组件&#xff1a;按组件先后顺序执行。如&#xff1a;同一层的线程组、同一层的http请求。 上下级组件&#xff1a;先执行外层&#xff08;上级&#xff09;&#xff0c;再执行内层&#xff08;下级&#xff…...

Nginx反向代理和负载均衡配置

一、疑问 在苍穹外卖里&#xff0c;浏览器发送的请求&#xff0c;比如登录&#xff0c;其url为http://localhost/api/employee/login&#xff0c; 而后端的路径是http://localhost:8080/admin/employee/login 两者不一致&#xff0c;数据是如何准确传输的呢&#xff1f; 二、…...

【379】基于springboot的防疫物资管理信息系统

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装防疫物资管理信息系统软件来发挥其高效地信息处理的作用&am…...

Linux 各个目录作用

刚毕业的时候学习Linux基础知识&#xff0c;发现了一份特别好的文档快乐的 Linux 命令行&#xff0c;翻译者是happypeter&#xff0c;作者当年也在慕课录制了react等前端相关的视频&#xff0c;通俗易懂&#xff0c;十分推荐 关于Linux的目录&#xff0c;多数博客已有详细介绍…...

【Linux】文件操作的艺术——从基础到精通

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;前言&#xff1a;一切皆文件 &#x1f4da;一、C语言的文件接口 &#x1f4d6;1.文件打…...

java中的运算符

大家好&#xff0c;今天来看看java中运算符的一些知识点&#xff0c;理解好运算符是我们在写代码的一大重点&#xff0c;那么我们就来看看吧。 运算符:对操作数进行操作时的符号.,不同运算筹操作的含义不同. 一、算术算片. 1、基本四则运算符:加减乘除模(一*/%) 注意:都是二元…...

全面解析 C++ STL 中的 set 和 map

C 标准模板库&#xff08;STL&#xff09;中的关联式容器以其强大的功能和高效性成为开发者解决复杂数据组织问题的重要工具。其中&#xff0c;set 和 map 是最常用的两类关联容器。本篇博客将从基本特性、底层实现、用法详解、高级案例以及性能优化等多个角度&#xff0c;详细…...

css:怎么设置div背景图的透明度为0.6不影响内部元素

目录 1.前言 2.解决思路 3.具体实例 4.另外一种实例 5.总结 1.前言 div背景图为project-bg.png&#xff0c;设置div透明度为0.6&#xff1b;div内的名称、数值受透明度影响颜色显示不正常&#xff1b;怎么设置背景图的透明度为0.6不影响内部元素&#xff1b; 2.解决思路 …...

网站扁平结构/产品营销网站建设

Another Redis Desktop Manager 中文版是mac上一款基于nodejs开发的Redis可视化管理工具&#xff0c;可以运行在Windows、Linux、Mac平台&#xff0c;具有更快、更好、更稳定的特点&#xff0c;更重要的是&#xff0c;当加载大量的key时&#xff0c;它不会崩溃。 - 更好的性能…...

代办注册公司价目表/广州seo公司推荐

前言 其实对于很多人来说&#xff0c;都和我原来有同样一个疑虑&#xff1a;**到底去大厂还是创业型公司&#xff1f;**去大公司一个萝卜一个坑&#xff0c;要往上走需要运气实力足够好才能脱颖而出&#xff0c;创业型公司&#xff0c;可能更容易实现自己的想法和舞台&#xf…...

网站建设的公司有哪些方面/什么叫做seo

百度文库&#xff1a;https://wenku.baidu.com/view/99d39413f78a6529647d5344.html STM32关于使用定时器触发ADC转换的解决办法和详细说明 本人在使用STM32上的TIM2_CC2触发ADC转换的时候&#xff0c;发现始终调不出来&#xff0c;在网上找到了一些有价值的参考信息&#xff…...

网站建设投/河南最近的热搜事件

每当校园里开运动会&#xff0c;各个班级就会比起谁的口号更别致&#xff0c;更响亮&#xff0c;班级团结一致需要口号的&#xff0c;下面小编为大家整理一篇霸气押韵励志的班级口号&#xff0c;希望能够帮助到大家。霸气押韵励志的班级口号(一)激情澎湃&#xff0c;高考不败&a…...

网络技术人员/seo类目链接优化

不重启 Emacs 让新修改的配置内容生效&#xff0c;有四个函数可以做到&#xff1a; M-x eval-last-sexp 使当前 elisp 配置中光标前的那一条语句立刻生效&#xff1b;M-x eval-region 使当前 elisp 配置中选中的 region 中的语句立刻生效&#xff1b;M-x eval-buffer 使当前的 …...

宜州做网站/搜索引擎营销特点是什么

denied /dɪnaɪəd/ adj 拒签 v 拒绝 转载于:https://www.cnblogs.com/BruceAlex/p/9688247.html...