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

【Spring】Sping笔记01

参考学习:b站浪飞yes

----------------------------------------------------

# 一、Spring 引入

**事务实现**

```java
public class EmployeeServiceImpl implements IEmployeeService {
    public void save(Employee employee){
        // 打开资源
        // 开启事务
        try {
            // 保存业务操作
            // 提交事务
        }catch (Exception e){
            // 回滚事务
        }finally{
            // 释放资源
        }
    }
  
    // ...
}
```

**MyBatis框架**

```java
public void update(Employee emp){
    SqlSession session = MyBatisUtil.getSession();
    EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
    employeeMapper.update(emp);
    session.commit();
    session.close();
}
```

**请求接口**

```java
@WebServlet("/list")
public class EmployeeServlet extends HttpServlet {
     @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json;charset=utf-8");
        // 获得字符打印流对象
        PrintWriter out = resp.getWriter();
        // 响应数据给浏览器显示
        String json = "{\"message\":\"success\", \"data\":[{\"id\":1,\"name\":\"dafei\", \"age\":18},{\"id\":2,\"name\":\"xiaoye\", \"age\":16}]}";
        out.print(json);
    }
}
```

如果说下面代码等价上面的,有啥感想?

**事务实现**

```java
public class EmployeeServiceImpl implements IEmployeeService {
    @Transactional
    public void save(Employee employee){
       
    }
    // ...
}
```

**MyBatis框架**

```java
@Autowired
private EmployeeMapper employeeMapper;
public void update(Employee emp){
    employeeMapper.update(emp);
}
```

**请求接口**

```java
@RequestMapping("/list")
public class EmployeeController {
    @ResponseBody
    protected R service() {
        return new R.ok(Arrays.asList(new Employee(1L, "dafei",18), new Employee(2L,"xiaoye", 16)));
    }
}
```

请使用:**Spring框架**

# 二、Spring 介绍

## 2.1 简介

官网:https://spring.io/projects/spring-framework#learn

Spring 是一个轻量级的 **IoC / DI和 AOP 容器**的开源框架,致力于构建轻量级的 JavaEE 应用,**简化应用开发**,本身涵盖了传统应用开发,还拓展到移动端,大数据等领域。

什么是容器(Container):从程序设计角度看就是**装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期**。

**大白话:Spring是一个可以存放对象的容器,并管理这些对象的生老病死,我们可以通过Spring API随意操作这些对象。**

## 2.2 Spring 优势

Spring 不能帮我们写业务逻辑,但是可以能帮助我们简化开发,作用如下

- Spring 能帮我们低侵入/低耦合地根据配置文件创建及组装对象之间的依赖关系。
- Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制等。
- Spring 能非常简单的且强大的声明式事务管理。
- Spring 提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,且自己也提供了一套 JDBC 模板来方便数据库访问。
- Spring 提供与第三方 Web(如 MyBatis)框架无缝集成,且自己也提供了一套 Spring MVC 框架,来方便 Web 层搭建。
- Spring 能方便的与如 Java Mail、任务调度、缓存框架等技术整合,降低开发难度。

**一句话:牛逼**

## 2.3 Spring 架构体系

![Spring FrameWork 体系]

- Core Container(核心容器 IoC)包含有 Beans、Core、Context 和 SpEL 模块。
- Test 模块支持使用 JUnit 和 TestNG 对 Spring 组件进行测试。
- AOP 模块提供了一个符合 AOP 联盟标准的面向切面编程的实现。
- Data Access / Integration 层包含有 JDBC、ORM、OXM、JMS 和 Transaction 模块。
- Web 层包含了 Web、Web-Servlet、WebSocket、Web-Porlet 模块。

课程重点设涉及 **Test、Core Container、AOP、TX、MVC。**

## 2.4 Spring 版本

```java
snapshot:是工程版本上的概念,表示快照版本,也就是相对稳定版本,但是会再进行改进,最好不要用于生产环境
    
Alpha:内测版,BUG多,开发人员开发过程中使用,希腊字母α,第一,指最初版

Beta:早期版本,有缺陷,没有严重BUG,可能加入新功能,进一步开发完善

Gamma: 经Beta 版,完善修改,成为正式发布的候选版本(Release Candidate)

RC:(Release Candidate):候选版本,几乎就是正式版了

GA:(Ggeneral Availability):发行稳定版,官方推荐使用此版本

R,RELEASE:正式版,等价于GA
```

**JDK版本要求**:

| Spring Framework版本 | JDK版本   |
| -------------------- | --------- |
| 6.0.x                | JDK 17-21 |
| 5.3.x                | JDK 8-19  |
| 5.2.x                | JDK 8-15  |
| 5.1.x                | JDK 8-12  |
| 5.0.x                | JDK 8-10  |
| 4.3.x                | JDK 6-8   |

https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions

**Spring 6.x之后JDK版本要求是JDK17,而当前我们使用JDK11,所以选择5.3.x版本,新版本控的同学自己选择。**

此处选择Spring版本:**Spring-5.3.34**

# 三、Spring 入门案例

**需求:使用spring容器管理对象**

**步骤1:创建标准maven项目:spring_ioc_di_aop**

**步骤2:导入Spring依赖**

```xml
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.34</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.26</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>
```

**步骤3:创建普通domain对象**

```java
package cn.wolfcode.spring._01_hello;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
public class User {
    private String username;
    private String password;
}

```

**步骤4:创建Spring容器文件:01.hello.xml**

```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="cn.wolfcode.spring._01_hello.User"></bean>
</beans>
```

**步骤5:测试Spring容器**

添加junit5测试依赖

```xml
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>
```

**HelloTest测试类**

```java
package cn.wolfcode.spring.test._01_hello;

import cn.wolfcode.spring._01_hello.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloTest {
    @Test
    public void testHello(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:01.hello.xml");
        User user = context.getBean("user", User.class);
        System.out.println(user);
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
    }
}
```

# 四、Spring 入门解析

## 4.1 hello.xml

在hello.xml文件中最核心的代码

```xml
<bean id="user"  class="cn.wolfcode.spring._01_hello.User">
    <property name="username" value="dafei"></property>
    <property name="password" value="666"></property>
</bean>
```

xml文件+上面代码,Spring做了一下操作:

- 借助xml文件创建了Spring容器
- 解析class指定的全限定类名,并通过反射创建了User对象,并初始化属性
- 将创建User对象缓存在spring容器中
- 建立起 user<---->User对象的映射,后续可以通过id获取User对象

## 4.2 HelloTest.java

### 4.2.1 ClassPathXmlApplicationContext

HelloTest测试案例里面有2行核心代码

```java
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:01.hello.xml");
```

- **ClassPathXmlApplicationContext**:Spring框架的上下文对象,一般可以理解为Spring容器的化身之一,操作它的API,等价于操作Spring容器。
- 框架启动时,ClassPathXmlApplicationContext 会从classpath加载配置文件,并初始化 Spring 容器,并根据配置文件中的信息创建和管理相应的 Bean 实例(比如案例中User对象,Spring容器对象称之为Bean)。
- 通过 ClassPathXmlApplicationContext 提供的API可以操作容器中的Bean实例。

**Spring容器各种化身体系(继承)**

**BeanFactory**:

- **功能**:是 Spring 框架最基本的 IoC 容器,提供了最基本的 IoC 功能,包括依赖注入和 Bean 的生命周期管理。
- **特点**:BeanFactory 是 Spring IoC 容器的最底层接口,提供了延迟加载 Bean 的特性,当获取 Bean 时才进行实例化和初始化。
- **使用场景**:适用于资源受限或需要手动控制 Bean 实例化的场景,如移动设备或性能要求较高的环境。

**ApplicationContext**:

- **功能**:是 BeanFactory 接口的扩展,提供了更多高级特性,如国际化支持、事件传播、AOP 集成等,是 Spring 中最常用的 IoC 容器接口。
- **特点**:ApplicationContext 在 BeanFactory 的基础上增加了更多的功能和便利性,例如自动注册 BeanPostProcessor、Bean 生命周期管理、资源加载、消息源等。
- **使用场景**:几乎所有 Spring 应用都应该使用 ApplicationContext,除非有特殊需求需要直接使用 BeanFactory。

**AnnotationConfigApplicationContext**:

- **功能**:用于基于注解配置的 Spring 应用上下文。通过 Java 配置类(使用注解如 @Configuration、@ComponentScan、@Bean 等)来定义和管理 Spring Bean。
- **使用场景**:适用于完全基于注解配置的 Spring 应用,不依赖 XML 配置文件。

**ClassPathXmlApplicationContext**:

- **功能**:用于基于 XML 配置的 Spring 应用上下文。从类路径下加载指定的 XML 配置文件,并初始化 Spring 容器和 Bean。
- **使用场景**:适用于传统的基于 XML 配置的 Spring 应用,配置信息存储在 XML 文件中。

**总结:开发涉及到操作Spring 容器,一般使用ApplicationContext即可**

**注意:上面类虽说可以认为是Spring容器化身,但它们都是独立对象。不能直接画等号。**

### 4.2.2 getBean

getBean:从Spring容器中获取Bean对象,常规用法:

```java
//通过name/id获取Bean对象
User user = (User) context.getBean("user");
//通过对象类型获取Bean对象,如果容器中存在多个相同User实例会报错
User user = context.getBean(User.class);
//通过name/id  + 类型获取Bean对象,如果容器中存在多个相同User,但是name/id不一样,不报错
User user = context.getBean("user", User.class);
```

## 4.3 常见异常

**异常1:NoSuchBeanDefinitionException: No bean named 'user2' available** 

按照 bean 名称去获取 bean 时,不存在名称为 user2的 bean。

**异常2:NoUniqueBeanDefinitionException: No qualifying bean of type 'cn.wolfcode._01_hello.User' available: expected single matching bean but found 2: User,User2**

按照 cn.wolfcode._01_hello.User类型去获取 bean 时,期望找到该类型唯一的一个 bean,可是此时找到了两个。

**异常3:BeanDefinitionParsingException: Configuration problem: Bean name 'User' is already used in this <beans> element Offending resource: class path resource [01.hello.xml]** 

# 五、Spring 测试

Spring 测试有2种场景

## 5.1 场景1:Junit5

每个测试都要重新启动 Spring 容器,启动容器的开销大,测试效率低下。不应该是测试代码管理 Spring 容器,应该是 Spring 容器来管理测试代码。

一般不用

## 5.2 场景2:Spring提供测试

**优势**:

- 只需启动一个容器,并管理测试代码

- 减少很多代码的书写

![使用 Spring 测试]

操作过程

- 添加测试依赖

  ```xml
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.3.34</version>
      <scope>test</scope>
  </dependency>
  ```

- 代码测试

  ```java
  //在测试方法之前启动容器
  //@RunWith(SpringJUnit4ClassRunner.class)  //junit4
  @ExtendWith(SpringExtension.class) //junit5
  @ContextConfiguration("classpath:01.hello.xml") // 指定加载的配置文件
  public class HelloSpringTest {
  
      @Autowired  // @Autowired 后面讲注解使用再说,此处表示从容器中获取ctx对象
      private ApplicationContext ctx;  //spring容器
      @Test
      public void testHello(){
          User user = ctx.getBean("user", User.class);
          System.out.println(user);
      }
  }
  
  ```

  这里注意,

      - 使用junit4 跟 junit5有区别
      - 导入Spring 容器,直接使用ApplicationContext化身

相关文章:

【Spring】Sping笔记01

参考学习&#xff1a;b站浪飞yes ---------------------------------------------------- # 一、Spring 引入 **事务实现** java public class EmployeeServiceImpl implements IEmployeeService { public void save(Employee employee){ // 打开资源 /…...

Gridcontrol纵向/横向合并单元格

指定列值相同&#xff0c;纵向合并&#xff1a; this.gridView1.OptionsView.AllowCellMerge true;//启用合并列 // 启用指定合并列事件 this.gridView1.CellMerge new DevExpress.XtraGrid.Views.Grid.CellMergeEventHandler(gridView1_CellMerge);#region 合并指定的列 pri…...

从周杰伦的《青花瓷》三次更名看方文山的国学情怀与工匠精神

《青花瓷》三次更名&#xff0c;方文山的国学情怀与工匠精神 在华语乐坛上&#xff0c;周杰伦与方文山的合作堪称黄金组合&#xff0c;他们的作品不仅引领了流行音乐的潮流&#xff0c;更让传统文化焕发出新的生机。在这其中&#xff0c;《青花瓷》无疑是他们合作的经典之一&a…...

HATS:分层图注意力神经网络用于股票预测

HATS&#xff1a;分层图注意力神经网络用于股票预测 原创 QuantML QuantML 2024年08月09日 19:08 上海 Content 本文提出了一种名为HATS&#xff08;Hierarchical Graph Attention Network&#xff09;的分层图注意力网络&#xff0c;用于预测股市动向。HATS通过选择性地聚合…...

【日常记录-MySQL】MySQL设置root用户密码

Author&#xff1a;赵志乾 Date&#xff1a;2024-08-09 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 MySQL8.0.30安装后启动&#xff0c;发现root用户尚未设置密码。以下是两种设置root用户密码的方式。 2. 示例 2.1 mysqladmin…...

高级Web安全技术(第二篇)

我们继续第二篇&#xff0c;继续深入了解web的安全 一、概述 在Web应用的开发与部署中&#xff0c;安全问题不仅是技术挑战&#xff0c;更是对系统整体架构的考验。本篇文章将继续深入探讨高级Web安全技术&#xff0c;重点关注API安全的最佳实践、OAuth的安全实施以及安全编码…...

前端实现文件下载常用几种方式

项目中前端下载一般分为两种情况&#xff1a; 后端直接提供一个文件地址&#xff0c;通过浏览器打开就可以下载。需要发送请求&#xff0c;后端返回二进制流数据&#xff0c;前端解析流数据&#xff0c;生成URL实现下载。 前端对应的实质是a标签和Blob文件下载&#xff0c;这…...

Isaac Lab 安装 (ubuntu22.04环境)

Windows下的安装见这篇博客&#xff1a; Isaac Lab 安装与初体验 &#xff08;windows环境&#xff09;-CSDN博客 ubuntu22.04下的安装与windows下十分类似&#xff0c;还是参考官方的&#xff0c;Installation using Isaac Sim Binaries Installation using Isaac Sim Bina…...

todoList清单(HTML+CSS+JavaScript)

&#x1f30f;个人博客主页&#xff1a; 前言&#xff1a; 前段时间学习了JavaScript&#xff0c;然后写了一个todoList小项目&#xff0c;现在和大家分享一下我的清单以及如何实现的&#xff0c;希望对大家有所帮助 &#x1f525;&#x1f525;&#x1f525;文章专题&#xff…...

LVS集群实现四层负载均衡详解(以nat,dr模式为例)

目录 一、LVS集群的介绍 1、LVS 相关术语&#xff1a; 2、lvs四层负载均衡工作原理 3、相关名词概念 4、lvs集群的类型 二、lvs的nat模式 1、介绍&#xff1a; 2、数据逻辑&#xff1a; 3、nat实验部署 环境搭建&#xff1a; 1、lvs中要去打开内核路由功能&#xff0c…...

七夕表白网页效果实现与解析

七夕是中国传统的情人节&#xff0c;是一个充满浪漫与爱的节日。在这个特别的日子里&#xff0c;用代码来表达心意也是一种独特且有趣的方式。本篇文章将带你一步步实现一个简单但充满心意的七夕表白网页。通过使用HTML、CSS和少量的JavaScript&#xff0c;我们将创建一个包含跳…...

人工智能算法工程师(高级)课程11-自然语言处理之NLP的语言模型-seq2seq模型,seq+注意力与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程11-自然语言处理之NLP的语言模型-seq2seq模型,seq+注意力,word2vec与代码详解。本课程面向高级人工智能算法工程师,深入讲解自然语言处理(NLP)中的关键语言模型技术,包括seq2seq模型及其增强版加入注意力…...

从PyTorch官方的一篇教程说开去(6.2 - 张量 tensor 矩阵运算等)

您的进步和反馈是我写作最大的动力&#xff0c;小伙伴来个三连呗&#xff01;共勉~ 话不多说&#xff0c;书接上文&#xff0c;需要温习的小伙伴请移步 - 从PyTorch官方的一篇教程说开去&#xff08;6.1 - 张量 tensor 基本操作&#xff09;-CSDN博客 借图镇楼 - 1 - 矩阵乘…...

【网络层】直连路由、静态路由、动态路由

文章目录 路由表直连路由直连路由 技术背景直连路由 实战训练 静态路由静态路由 技术背景静态路由 概述静态路由 配置命令静态路由 实战训练 动态路由动态路由 技术背景路由协议概述路由协议分类 路由表 路由表的形成&#xff0c;路由的来源&#xff1a; 路由来源备注直连路由…...

tkinter用法总结

Tkinter 是 Python 标准库中的一个模块&#xff0c;用于创建图形用户界面 (GUI)。它是 Python 中最常用的 GUI 库之一&#xff0c;因为它集成在 Python 的标准发行版中&#xff0c;无需额外安装即可使用。 一、基本用法 1. 简单示例 import tkinter as tk# 创建主窗口 root …...

iOS基础-Block

系列文章目录 文章目录 系列文章目录一、Block是什么二、Block的使用场景1. 异步操作和完成处理器2. 动画3. 集合操作4. 定时器5. 自定义控件的事件处理6.错误处理 三、Block的底层实现1.结构分析2.Block的类型3.Block的copy4.变量捕捉 四、Block的使用细节1.auto变量的生命周期…...

本地图片瀑布流浏览器asonry Image Viewer

本地图片瀑布流浏览器asonry Image Viewer 前言效果图部分源码领取完整源码下期更新 前言 一款采用 HTML 的瀑布流本地图片浏览器「Masonry Image Viewer」只需要把你的图片文件夹拖到下载的 index 网页文件里面就可以实现瀑布流效果。项目免费开源&#xff0c;据介绍采用了HT…...

macos重装系统 启动U盘制作方法 - createinstallmedia 命令使用方法总结

macos重装系统比windows要稍微复杂一些&#xff0c;不过还好&#xff0c;macos系统安装app这个Apple官方提供的系统软件里面默认就内置了一个可用为我们制作启动盘的工具 createinstallmedia 我们下载的apple安装镜像要门是 dmg/pkg/iso 的压缩档案格式的&#xff0c;要么是 x…...

八问八答搞懂Transformer内部运作原理

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友…...

MySQL增删改查(基础)

1、. 新增&#xff08;Create&#xff09; 语法&#xff1a; INSERT [INTO] table_name[(column [, column] ...)] VALUES (value_list) [, (value_list)] ... 例子&#xff1a; -- 创建一张学生表 DROP TABLE IF EXISTS student; CREATE TABLE student (id INT,sn INT com…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...