【SpringBoot】之Mybatis=Plus集成及使用(入门级)

 🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《SpringBoot开发之Mybatis-Plus系列》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁


 前言

        在之前的几期有关SpringBoot开发系列的博客的分享中,我们学到了SpringBoot的一些基础使用、Freemarker的集成使用以及自定义Starter的集成及运用。今天我给各位老铁带来的是与数据库相关的知识分享,也是集成到我们的SpringBoot之中方便我们后续的开发。

一、Mybatis-Plus简介

1. 概述(基本概念)

        MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了一些常用功能的增强,使得开发者可以更加便捷地进行数据库访问操作。

        虽然MyBatis-Plus有许多优点,但它也可能存在不足之处。因此,在使用时需要根据项目需求和个人喜好进行选择。

        官网:MyBatis-Plus (baomidou.com)

2. 主要特性与功能

        以下是Mybatis-Plus的一些主要特性及功能:

Mybatis-Plus的主要特性及功能
主要特性及功能说明
简化 CRUD 操作MyBatis-Plus 提供了一套简单而强大的 CRUD 操作方法,通过继承 接口,可以直接使用它提供的方法,无需手写 SQL 语句,减少了重复的代码。
条件构造器MyBatis-Plus 提供了灵活的条件构造器,可以方便地拼接查询条件,支持链式调用,使得动态 SQL 的构建更加简便。
分页插件MyBatis-Plus 集成了分页插件,可以方便地进行分页查询。
主键生成策略MyBatis-Plus 支持多种主键生成策略,包括雪花算法、UUID、自增等,可以根据需求灵活配置。
自动填充MyBatis-Plus 支持自动填充功能,可以在插入或更新数据时自动填充指定字段的值。

3. 特点

MyBatis-Plus的特点包括:

  1. 无侵入:它在MyBatis的基础上进行增强,没有改变MyBatis的原有架构,因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。
  2. 依赖少:使用起来相对方便、快捷。
  3. 集MyBatis与Hibernate的优点于一身。

4. 结构

图示

        MyBatis-Plus 的结构组成主要包括核心模块、插件模块以及代码生成器。下面是对这些组成部分的简要描述:

  1. 核心模块(Core Module):

    • BaseMapper 接口: 定义了常用的 CRUD 操作,如 、、、 等,开发者可以通过继承该接口来获得这些基本的数据库操作方法,无需手动编写 SQL 语句。insertupdatedeleteselect
    • Wrapper 类: 提供了条件构造器,用于灵活地拼接查询条件,支持链式调用,使得动态 SQL 的构建更加方便。
  2. 插件模块(Plugin Module):

    • 分页插件: 集成了分页插件,使得在进行分页查询时更加便捷。
    • 逻辑删除插件: 支持逻辑删除的功能,通过注解和配置实现逻辑删除。
    • 性能分析插件: 提供了性能分析的功能,可以输出 SQL 的执行时间等信息,方便开发者进行性能优化。
    • 动态表名插件: 允许在运行时动态指定表名,适用于一些需要动态切换表的场景。
  3. 代码生成器(Code Generator):

    • MyBatis-Plus 提供了一个代码生成器工具,可以根据数据库表自动生成对应的 Entity、Mapper 接口以及 Service 类,减少了开发者的重复劳动,提高了开发效率。
    • 通过配置代码生成器,可以灵活地指定生成的代码结构和规范。
  4. 注解(Annotation):

    • MyBatis-Plus 使用了一系列注解来辅助开发,如 用于指定数据库表名, 用于指定主键, 用于指定数据库字段与实体类属性的映射关系, 用于指定逻辑删除字段等。@TableName@TableId@TableField@TableLogic
  5. 配置项(Configuration):

    • MyBatis-Plus 支持丰富的配置选项,通过配置文件或者注解,可以对其行为进行定制,包括主键策略、逻辑删除配置、自动填充配置等。

5. 数据库

        MyBatis-Plus 作为 MyBatis 的增强工具库,对数据库的使用没有特殊的要求。它与 MyBatis 一样,可以与各种支持 JDBC 的关系型数据库集成,包括但不限于 MySQL、Oracle、SQL Server、PostgreSQL 等。

        但Mybatis-Plus在使用上数据库中还是有一些注意事项和要求:

Mybatis-Plus在数据库中使用注意事项
注意点事项说明
数据库兼容性MyBatis-Plus 可以与多种数据库进行兼容,但需要注意数据库驱动和版本的选择。通常,你需要根据你所使用的数据库,选择相应的 JDBC 驱动,并确保驱动的版本和 MyBatis-Plus 版本兼容。
主键策略MyBatis-Plus 提供了多种主键生成策略,包括雪花算法、UUID、自增等。在使用时,需要根据数据库支持的主键生成方式进行配置,以确保生成的主键能够被数据库正确识别和处理。
数据库连接配置和 MyBatis 一样,MyBatis-Plus 使用数据源来管理数据库连接。你需要配置数据源的相关信息,包括数据库 URL、用户名、密码等。数据源的配置通常在项目的配置文件中进行。
表和实体类映射MyBatis-Plus 通过注解 来指定实体类对应的数据库表名,而通过 注解来指定数据库字段与实体类属性的映射关系。确保实体类和数据库表之间的映射关系正确,以避免出现数据操作的错误。@TableName@TableField

         总的来说,MyBatis-Plus 并没有对数据库的使用提出过多的特殊要求。你可以根据自己项目的实际情况选择合适的数据库,并按照 MyBatis 和 MyBatis-Plus 的配置规范进行配置,就能够顺利地进行数据库操作。

二、SpringBoot集成Mybatis-Plus

1. pom依赖导入

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yx</groupId>
    <artifactId>Mybatis-Plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Mybatis-Plus</name>
    <description>Mybatis-Plus</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
<!--        导入Mybatis-Plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
<!--     导入mybatis-plus生成器的依赖   -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
<!--        数据库依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.yx.mybatisplus.MybatisPlusApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2. yml文件配置

application.yml

spring:
#  数据库连接
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
    url: jdcb:mysql://localhost:3306/bookshop
mybatis-plus:
#  类别名
    type-aliases-package: com.yx.mybatisplus.pojo
    configuration:
#      是否启用驼峰命名
      map-underscore-to-camel-case: true
logging:
  level:
    com.yx.mybatisplus.mapper: debug

3. 生成Mybatis生成类

        我们可以官网上去查找到生成器,但是官网的生成器并不是最完整的,因此我在下面放了我自己整合的生成器,较为完整。生成器的一些配置需要根据自身的项目信息就行修改。

 MySQLGenerator.java

package com.yx.mybatisplus.config;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@Slf4j
public class MySQLGenerator {

    private final static String URL = "jdbc:mysql://localhost:3306/bookshop";
    private final static String USERNAME = "root";
    private final static String PASSWORD = "123456";

    private final static DataSourceConfig.Builder DATA_SOURCE_CONFIG =
            new DataSourceConfig.Builder(URL, USERNAME, PASSWORD);

    public static void main(String[] args) {
        FastAutoGenerator.create(DATA_SOURCE_CONFIG)
                .globalConfig(
                        (scanner, builder) ->
                                builder.author(scanner.apply("请输入作者名称?"))
                                        .outputDir(System.getProperty("user.dir") + "\\src\\main\\java")
                                        .commentDate("yyyy-MM-dd")
                                        .dateType(DateType.TIME_PACK)
                )
                .packageConfig((builder) ->
                        builder.parent("com.yx.mybatisplus")
                                .entity("pojo")
                                .service("service")
                                .serviceImpl("service.impl")
                                .mapper("mapper")
                                .xml("mapper.xml")
                                .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))
                )
                .injectionConfig((builder) ->
                        builder.beforeOutputFile(
                                (a, b) -> log.warn("tableInfo: " + a.getEntityName())
                        )
                )
                .strategyConfig((scanner, builder) ->
                        builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
                                .addTablePrefix("tb_", "t_", "lay_", "meeting_", "sys_")
                                .entityBuilder()
                                .enableChainModel()
                                .enableLombok()
                                .enableTableFieldAnnotation()
                                .controllerBuilder()
                                .enableRestStyle()
                                .enableHyphenStyle()
                                .build()
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

}

4. 生成代码

        当我们对其配置根据我们的项目信息就行了修改之后,我们就可以运行生成器类进行生成代码。 

 

         由下面动图可以得知BookMapper.xml、BookMapper、Service层和Controller层都没有代码,其中BookMapper.xml、BookMapper、Service层都是Mybatis-Plus自带了方法代码,其中只要我们在Controller层编写请求代码即可。我们要记得在一些类上打上注解。

         注意事项:在启动类上记得添加mapper扫描类注解

5. 初步测试

        我们在controller层编写一个查询的请求,在网页进行访问查看是否显示数据。

         我们在网页访问查看方法的请求路径即可

 

三、延伸

1. 第三方测试工具使用

        在我们的一些请求方法中它发送的有时不一定是post请求,有get、del、put等等请求类型,因此我们要借助第三方工具进行测试,因为子啊网页测试路径不会显示。推荐使用Apifox

官网:

        可以使用网页版也可以使用应用版

Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。

         我们接下来编写一个新增的请求,使用第三方工具进行测试

        对应的数据我们可以去数据库进行查看 

2.  主键生成策略

2.1 介绍

        主键生成策略是关系型数据库中用于生成主键值的一种机制。每个数据库表都需要一个主键,它唯一标识表中的每一行数据。当你向表中插入新记录时,需要为主键字段生成一个唯一的值。

常见的主键策略包括以下:

  1. 自增(Auto-increment): 数据库系统会自动为主键字段分配一个唯一的递增值。在MySQL中,通常使用关键字来定义自增主键。AUTO_INCREMENT

  2. 序列(Sequence): 一些数据库系统提供了序列对象,允许你预先定义一组唯一的数字,并在插入记录时使用这些数字。在Oracle数据库中,通常使用序列生成主键值。

  3. UUID(Universally Unique Identifier): 使用UUID算法生成全局唯一的标识符。UUID主键不依赖于数据库的实现,通常以字符串形式存储。

  4. 雪花算法(Snowflake): 通过使用分布式ID生成算法,生成具有一定唯一性和有序性的主键。这对于分布式系统中生成唯一标识符很有用。

实例:

2.2 注解介绍

        @TableId主键注解,放置于实体类中的主键字段上。

 

  • @TableId注解属性

属性类型必须指定默认值描述
valueString""主键字段名
typeEnumIdType.NONE指定主键类型

@TableId注解type属性IdType主键生成策略介绍:

描述
AUTO数据库 ID 自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUTinsert 前自行 set 主键值
ASSIGN_ID分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

         其中如果使用的是AUTO属性时,当你在新增数据时携带了id属性及值,他将不会自增,而是将id赋予你输入的值

雪花算法自动生成

         我们有时会使用id随机生成,这时我们就会使用雪花id,因为自带的可能效果不是很好,因此推荐使用网上的。下面是我推荐的一个雪花id。

网址:多语言新雪花算法(SnowFlake IdGenerator): 💎迄今为止最全面的分布式主键ID生成器。 💎优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 💎原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、Node.js、Ruby 多线程安全调用动态库(FFI)。💎支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。 (gitee.com)

         引入依赖,修改数据类型为bigint,实体对象的id类型改为Long。

 

        最后我们进行测试 

 2.3 自动填充

@TableField字段注解(非主键),其中fill字段自动填充策略,具体策略如下:

描述
DEFAULT默认不处理
INSERT插入时填充字段
UPDATE更新时填充字段
INSERT_UPDATE插入和更新时填充字段

        注解则是指定该属性在对应情况下必有值,如果无值则入库会是null

        自动填充需要借助自定义实现类完成

MyMetaObjectHandler.java

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始新增操作自动填充 ....");
        this.strictInsertFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新操作自动填充 ....");
        this.strictUpdateFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());
    }
}
使用情景

情况一:fill = FieldFill.DEFAULT,无论是新增和更新都不进行自动填充;

情况二:fill = FieldFill.INSERT,执行新增操作自动填充数据;

情况三:fill = FieldFill.UPDATE,执行更新操作,若字段不为空则自动填充数据;再次执行更新操作不会刷新数据

案例演示:

        首先在自定义实现类中指定指定的字段,在不同的情况下填充指定内容

        编写对应的请求方法 

 实体对象的指定字段标记使用实现类

测试结果 

新增

修改 


🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git的安装及使用

git的安装及使用 git的安装 官网地址&#xff1a;https://git-scm.com/download/win 在任何位置输入bash或sh,进入git 设置用户名邮箱。 git config --global user.name “wfyfly” git config --global user.email 2423217861qq.com 查看配置信息 git config --list --globa…

gitlab下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考&#xff1a; 1.下载 根据服务器操作系统版本&#xff0c;下载对应的RPM包。 gitlab官网&#xff1a; The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…

[Application] The app delegate must implement the window property if ..... 错误

在xcode中新建ios项目后再真机上运行&#xff0c;会发现手机上一篇漆黑&#xff0c;仔细观察控制台会发现这样的提示&#xff1a; [Application] The app delegate must implement the window property if it wants to use a main storyboard. 大概意思是&#xff1a; app d…

WebGL+Three.js入门与实战——给画布换颜色、绘制一个点、三维坐标系

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

工业交换机的组网方式有哪些?

工业交换机也称作工业以太网交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;由于采用的网络标准&#xff0c;其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议&#xff0c;以太网已经成为工业控制领域的主要通信标准。 工业交换机的…

解决goview栈内存溢出导致打包报错问题

最近搞低代码大屏使用goview打包时遇到问题 报错&#xff1a; vite v4.3.6 building for production... transforming (8931) node_modules\monaco-editor\esm\vs\base\common\navigator.js <--- Last few GCs ---> [24864:000001B515BA39F0] 65979 ms: Scavenge 2002.0…

Vue3-20-组件-父组件给子组件传值

情景说明 当父组件使用子组件的时候&#xff0c; 我们可能会需要将某些父组件的变量值 传递 给 子组件&#xff0c;在子组件中进行使用。此时就有一个 【父组件】传值给【子组件】的动作。 这就是本文我们要讨论的问题。主要问题有两个 &#xff1a; 1、【子组件】 如何接收值…

Android--UML类图使用详解

明敕星驰封宝剑&#xff0c;辞君一夜取楼兰 一&#xff0c;定义 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分…

Elasticsearch:相关性工作台 - BM25 及 ELSER 的相关性比较

我们知道 Elastics Learned Sparse EncoderR (ELSER) 可以被用来做语义搜索。它是一个 out-of-domain 的语义搜索模型。无需训练&#xff0c;我们就可以得到很好的相关性。有关 ELSER 的更多知识&#xff0c;请参考文章 “Elastic Learned Sparse Encoder 简介&#xff1a;Elas…

力扣题目学习笔记(OC + Swift) 12. 整数转罗马数字

12. 整数转罗马数字 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1。12 写做 XI…

el-date-picker 选择一个或多个日期

el-date-picker可选择多个日期 type“dates” 加个s即可 <div><span>el-date-picker选择多个日期</span><el-date-pickertype"dates"v-model"dateList"placeholder"选择一个或多个日期"></el-date-picker></di…

【1.6计算机组成与体系结构】存储系统

目录 1.层次化存储结构2.Cache2.1 Cache的介绍2.2 局部性原理2.3 Cache应用 1.层次化存储结构 由 ⬆ CPU&#xff1a;寄存器。 快 ⬆ Cache&#xff1a;按内容存取(相联存储器)。 到 ⬆内存&#xff08;主存&#xff09;&#xff1a;DRAM。 慢 ⬆ 外存&#xff08;辅存&#…

2024年20多个最有创意的AI人工智能点子

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 探索 2024 年将打造的 20 个基于人工智能产品的盈利创意 &#x1f525;&#x1f525;&#x1f525; 直到最近&#xff0c;企业对人工智能还不感兴趣&#xff0c;但…

【云原生kubernets】Pod详解

一、Pod介绍 1.1.概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的State…

算法-----全排列

目录 前言 代码 思路 我的其他博客 前言 全排列是一种组合数学的概念&#xff0c;它表示将一组元素按照一定顺序进行排列的所有可能情况。在计算机编程中&#xff0c;通常使用递归来实现全排列。以下是使用Java语言实现全排列的详细解释&#xff1a; 代码 public class Pe…

【Spring】07 懒加载

文章目录 1.定义2. 作用3. 配置方式1&#xff09;XML配置2&#xff09;Java配置3&#xff09;注解方式 4. 应用场景5. 注意事项总结 1.定义 懒加载&#xff08;Lazy Initialization&#xff09;是Spring 框架中的一项强大的特性&#xff0c;它允许我们推迟 Bean 的初始化&…

Java EE 多线程之 JUC

文章目录 1. Callable 接口2. ReentrantLock3. 信号量4. CountDownLatch JUC这里就是指&#xff08;java.util.concurrent&#xff09; concurrent 就是并发的意思 这个包里的内容&#xff0c;主要就是一些多线程相关的组件 1. Callable 接口 Callable 也是一种创建线程的方式…

大数据技术14:FlinkCDC数据变更捕获

前言&#xff1a;Flink CDC是Flink社区开发的flink-cdc-connectors 组件&#xff0c;这是⼀个可以直接从 MySQL、PostgreSQL 等数据库直接读取全量数据和增量变更数据的 source 组件。 https://github.com/ververica/flink-cdc-connectors 一、CDC 概述 CDC 的全称是 Change …

overleaf 加载pdf格式的矢量图时,visio 图片保存为pdf格式,如何确保pdf页面大小和图片一致

Overleaf支持多种矢量图形格式&#xff0c;其中一些常见的包括&#xff1a; PDF&#xff08;Portable Document Format&#xff09;&#xff1a; PDF是一种常见的矢量图形格式&#xff0c;Overleaf可以直接加载和显示PDF文件。许多绘图工具和LaTeX生成的图形都可以导出为PDF格式…

SCI期刊投稿的不同状态

投稿过程中的不同状态代表了稿件的不同处理阶段 1. Submitted to Journal 已提交至期刊 刚投稿成功&#xff0c;邮箱会收到确认信件&#xff0c;等待编辑处理稿件&#xff0c;这个状态自然形成&#xff0c;无需作者处理。 2. Awaiting admin processing 等待管理员处理 文…