MySQL 存储函数及调用
1.mysql 存储函数及调用
在MySQL中,存储函数(Stored Function)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单和高效。
下面是一个具体的MySQL存储函数的示例,该函数接受一个整数参数并返回该整数的平方值。
1.1创建存储函数
首先,我们需要在MySQL数据库中创建一个存储函数。这里我们使用CREATE FUNCTION
语句来定义存储函数。
DELIMITER //
CREATE FUNCTION square_number(num INT) RETURNS INT
BEGIN DECLARE result INT; SET result = num * num; RETURN result;
END //
DELIMITER ;
在这个示例中:
(1)DELIMITER //
和 DELIMITER ;
是用来改变MySQL语句的结束符的,因为存储函数的定义中可能包含多个分号,这会导致MySQL解释器在存储函数定义内部错误地结束语句。
(2)CREATE FUNCTION square_number(num INT) RETURNS INT
声明了一个名为square_number
的存储函数,它接受一个整数参数num
,并返回一个整数结果。
(3)在BEGIN ... END
块中,我们定义了存储函数的主体逻辑。这里我们声明了一个变量result
,并计算num
的平方值,然后将结果赋值给result
。
(4)RETURN result;
语句将计算得到的result
值返回给调用者。
1.2调用存储函数
一旦存储函数被创建,我们就可以在SQL查询中像调用普通函数一样调用它。下面是一个示例,展示如何在SELECT语句中调用square_number
函数:
sql复制代码
SELECT square_number(5); -- 返回 25
在这个示例中,我们调用了square_number
函数并传入参数值5,函数返回了25作为结果。
1.3删除存储函数
如果我们不再需要某个存储函数,可以使用DROP FUNCTION
语句来删除它:
sql复制代码
DROP FUNCTION square_number;
这个语句将删除名为square_number
的存储函数。
1.4注意事项
(1)存储函数只能返回单一的值,而存储过程(Stored Procedure)可以返回多个值或结果集。
(2)存储函数可以在SQL语句的任何地方调用,就像调用内置函数一样。
(3)存储函数通常用于执行计算、数据转换或复杂的业务逻辑,这些逻辑在多个地方被重复使用。
2.MySQL存储函数的示例
以下是一些关于MySQL存储函数的示例,这些示例涵盖了不同的场景和功能。
2.1示例1:计算两个数的和
假设我们想要创建一个存储函数来计算两个数的和。
DELIMITER //
CREATE FUNCTION add_numbers(num1 INT, num2 INT) RETURNS INT
BEGIN DECLARE sum_result INT; SET sum_result = num1 + num2; RETURN sum_result;
END //
DELIMITER ; -- 调用存储函数
SELECT add_numbers(3, 5); -- 返回 8
2.2示例2:获取字符串的长度
虽然MySQL已经有一个内建的LENGTH()
函数来获取字符串的长度,但我们可以为了示例目的创建一个类似的存储函数。
DELIMITER //
CREATE FUNCTION my_string_length(input_string VARCHAR(255)) RETURNS INT
BEGIN RETURN LENGTH(input_string);
END //
DELIMITER ; -- 调用存储函数
SELECT my_string_length('Hello, World!'); -- 返回 13
2.3示例3:将整数转换为字符串
我们可以创建一个将整数转换为字符串的存储函数。
DELIMITER //
CREATE FUNCTION int_to_string(num INT) RETURNS VARCHAR(255)
BEGIN RETURN CAST(num AS CHAR);
END //
DELIMITER ; -- 调用存储函数
SELECT int_to_string(123); -- 返回 '123'
2.4示例4:判断是否为闰年
我们可以创建一个存储函数来判断一个给定的年份是否为闰年。
DELIMITER //
CREATE FUNCTION is_leap_year(year_value INT) RETURNS BOOLEAN
BEGIN IF (year_value % 4 = 0 AND year_value % 100 != 0) OR (year_value % 400 = 0) THEN RETURN TRUE; ELSE RETURN FALSE; END IF;
END //
DELIMITER ; -- 调用存储函数
SELECT is_leap_year(2020); -- 返回 1(TRUE)
SELECT is_leap_year(2021); -- 返回 0(FALSE)
请注意,MySQL的BOOLEAN类型实际上是TINYINT(1)的一个别名,所以TRUE返回1,FALSE返回0。
2.5示例5:计算字符串中某个字符的出现次数
这个示例展示了如何计算一个字符串中某个字符的出现次数。
DELIMITER //
CREATE FUNCTION char_count(input_string VARCHAR(255), search_char CHAR(1)) RETURNS INT
BEGIN DECLARE char_count_result INT DEFAULT 0; DECLARE str_len INT DEFAULT LENGTH(input_string); DECLARE i INT DEFAULT 1; WHILE i <= str_len DO IF SUBSTRING(input_string, i, 1) = search_char THEN SET char_count_result = char_count_result + 1; END IF; SET i = i + 1; END WHILE; RETURN char_count_result;
END //
DELIMITER ; -- 调用存储函数
SELECT char_count('hello world', 'o'); -- 返回 2
这些示例涵盖了从简单到稍微复杂的存储函数功能,并且应该能够帮助我们理解如何在MySQL中创建和使用存储函数。
3.如何在MySQL中创建存储函数
在MySQL中创建存储函数,我们需要使用CREATE FUNCTION
语句。以下是一个基本的步骤和示例,说明如何创建一个简单的存储函数。
3.1创建存储函数的步骤
(1)选择数据库(如果尚未选择):
sql复制代码
USE your_database_name;
(2)编写存储函数: 使用CREATE FUNCTION
语句,指定函数名、参数、返回类型和函数体。
(3)执行创建语句: 在我们的MySQL客户端(如MySQL命令行、MySQL Workbench等)中执行上述SQL语句。
(3)测试存储函数: 在SELECT语句或其他SQL语句中调用存储函数,以验证其是否按预期工作。
3.2创建存储函数的示例
以下是一个简单的示例,展示如何创建一个存储函数来计算一个整数的平方:
DELIMITER //
CREATE FUNCTION square(num INT) RETURNS INT
BEGIN RETURN num * num;
END //
DELIMITER ;
在这个示例中:
(1)DELIMITER //
和 DELIMITER ;
用于更改默认的语句结束符,以便在函数定义中使用分号(;
)。
(2)CREATE FUNCTION square(num INT) RETURNS INT
定义了一个名为square
的函数,它接受一个整数参数num
,并返回一个整数。
(3)在BEGIN ... END
块中,我们定义了函数的主体,它返回num
的平方。
3.3调用存储函数
一旦存储函数被创建,我们就可以在SQL查询中像调用内置函数一样调用它:
sql复制代码
SELECT square(5); -- 返回 25
3.4删除存储函数
如果我们不再需要某个存储函数,可以使用DROP FUNCTION
语句来删除它:
sql复制代码
DROP FUNCTION square;
这个语句将删除名为square
的存储函数。请注意,在删除存储函数之前,确保没有其他的数据库对象(如表或视图)依赖于该函数,否则可能会导致错误。
4.存储函数和函数有什么区别
在MySQL的上下文中,当我们提到“存储函数”(Stored Function)时,我们通常指的是在数据库中定义的、可以像内置函数一样在SQL查询中调用的特殊函数。这些存储函数通常用于封装复杂的SQL逻辑,以便在多个地方重复使用。
然而,当我们提到“函数”(Function)时,这个术语可能具有更广泛的意义,它取决于上下文。在编程和数据库领域,函数通常指的是一个可以接收输入(参数)并返回输出的代码块。这个术语可以应用于多种不同的环境和语言,包括编程语言(如C、Java、Python等)、数据库(如MySQL、PostgreSQL等)以及数学和逻辑运算。
在MySQL的特定上下文中,我们可以将“函数”分为两种主要类型:
(1)内置函数(Built-in Functions):这些是MySQL数据库管理系统提供的预定义函数,用于执行各种常见的数据库操作,如字符串操作、日期和时间计算、数值计算等。例如,CONCAT()
函数用于连接两个或多个字符串,NOW()
函数返回当前日期和时间。
(2)存储函数(Stored Functions):这些是用户定义的函数,它们使用CREATE FUNCTION
语句在数据库中创建,并像内置函数一样在SQL查询中调用。存储函数封装了复杂的SQL逻辑,可以在多个地方重复使用,从而提高了代码的可维护性和重用性。
(3)存储函数和内置函数的区别:
-
定义者:内置函数是由数据库管理系统提供的,而存储函数是由数据库用户定义的。
-
可定制性:内置函数的功能是固定的,用户无法更改它们的行为。而存储函数允许用户定义自己的逻辑,并根据需要进行修改。
-
使用场景:内置函数通常用于执行常见的、简单的数据库操作。而存储函数则更适用于封装复杂的SQL逻辑,以便在多个地方重复使用。
(4)存储函数和存储过程(Stored Procedures)的区别:
-
返回值:存储函数必须返回一个值,而存储过程可以返回多个值或结果集,也可以不返回任何值。
-
调用方式:存储函数可以在SELECT语句中直接调用,并像其他列一样在结果集中显示。而存储过程通常需要使用CALL语句来调用,并且它们的输出通常需要通过输出参数或结果集来获取。
-
语法和用途:存储函数的语法类似于其他编程语言中的函数,而存储过程则更类似于一组为了完成特定功能的SQL语句集合。在用途上,存储函数通常用于计算或转换数据,而存储过程则更适用于执行复杂的数据库操作或事务处理。
5.触发器和函数的区别
触发器和函数在MySQL中有显著的不同,主要体现在以下几个方面:
(1)用途:
-
函数(Function):通常用于封装可重复使用的逻辑,这些逻辑可以在多个地方被其他过程或触发器主动调用。函数体现的是一个独立的功能,它们封装了用于执行特定任务的代码,并返回一个值。
-
触发器(Trigger):通常用于在数据库发生特定事件时自动执行一些逻辑。触发器与表相关联,并在表的数据发生变化(如INSERT、UPDATE、DELETE操作)时触发执行。它们主要用于实现数据完整性、审计、日志记录等自动化操作。
(2)触发方式:
-
函数:可以由其他过程主动调用,是显式的执行方式。
-
触发器:只能在特定条件下自动触发执行,是隐式的执行方式。它们不需要手动调用,而是在满足定义的条件时自动执行。
(3)执行时机:
-
函数:在具体需要时被调用执行。
-
触发器:在触发条件满足时自动执行。它们可以在数据库操作之前或之后触发,具体取决于触发器的定义。
(4)返回值:
-
函数:必须返回一个值,这个值可以是任何数据类型,取决于函数的定义。
-
触发器:不直接返回值。它们通过执行一系列的动作来影响数据库的状态,如修改表中的数据、插入数据到其他表、调用其他存储过程等。
(5)应用场景:
-
函数:常用于封装复杂的逻辑运算、数据转换等任务,以提高代码的复用性和可维护性。
-
触发器:常用于实现数据完整性约束、日志记录和审计、数据的备份和同步等自动化操作。它们可以在数据发生变化时自动执行相应的逻辑,以确保数据的准确性和一致性。
触发器和函数在MySQL中各有其独特的作用和应用场景。函数主要用于封装可重复使用的逻辑并返回结果值,而触发器则用于在数据库发生特定事件时自动执行相应的逻辑。
6.如何在MySQL中创建触发器
在MySQL中,触发器(Trigger)是一种特殊的存储过程,它会在指定的表上进行INSERT、UPDATE或DELETE操作之前或之后自动执行。要使用触发器,我们需要使用CREATE TRIGGER
语句。
以下是创建触发器的基本步骤和示例:
6.1创建触发器的步骤
(1)选择数据库(如果尚未选择):
sql复制代码
USE your_database_name;
(2)编写触发器: 使用CREATE TRIGGER
语句,指定触发器的名称、触发时间(BEFORE或AFTER)、触发事件(INSERT、UPDATE或DELETE)、关联的表和要执行的SQL语句。
(3)执行创建语句: 在我们的MySQL客户端(如MySQL命令行、MySQL Workbench等)中执行上述SQL语句。
6.2创建触发器的示例
假设我们有一个名为orders
的表,每当有新订单(即插入新行)时,我们想要记录一条日志到另一个名为order_logs
的表中。
首先,确保我们有order_logs
表,其结构可能如下:
CREATE TABLE order_logs ( log_id INT AUTO_INCREMENT PRIMARY KEY, order_id INT, log_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, action VARCHAR(50) NOT NULL
);
然后,我们可以创建一个触发器,当在orders
表中插入新行时,向order_logs
表中插入一条日志记录:
DELIMITER //
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN INSERT INTO order_logs (order_id, action) VALUES (NEW.order_id, 'Order inserted');
END;
//
DELIMITER ;
在这个示例中:
-
after_order_insert
是触发器的名称。 -
AFTER INSERT ON orders
指定触发器在orders
表上插入新行之后触发。 -
FOR EACH ROW
表示触发器会对受影响的每一行执行一次。 -
在
BEGIN ... END
块中,我们定义了触发器要执行的SQL语句,即向order_logs
表中插入一条记录。注意,我们使用NEW.order_id
来引用新插入的orders
表中的order_id
值。
6.3注意事项
-
触发器中的SQL语句通常是对数据表进行增删改查的操作,但不能调用存储过程。
-
触发器中的SQL语句可以引用被触发表中的列,但只能引用被触发行的列(使用
NEW
或OLD
关键字,具体取决于触发时间)。 -
触发器是基于表的,不是基于整个数据库的。每个触发器只能和一个表关联。
-
触发器不能通过直接调用执行,只能通过触发事件隐式触发。
-
如果触发器中的SQL语句执行失败,那么原始操作(INSERT、UPDATE或DELETE)也会被回滚。
-
触发器可以嵌套使用,即一个触发器可以调用另一个触发器,但嵌套的最大层数取决于MySQL服务器的配置。
6.4删除触发器
如果我们不再需要某个触发器,可以使用DROP TRIGGER
语句来删除它:
sql复制代码
DROP TRIGGER after_order_insert;
这个语句将删除名为after_order_insert
的触发器。请注意,删除触发器时不需要指定数据库名称,只需要指定触发器的名称。
相关文章:
MySQL 存储函数及调用
1.mysql 存储函数及调用 在MySQL中,存储函数(Stored Function)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单…...
设计模式七大原则-单一职责原则SingleResponsibility
七大原则是在设计“设计模式”的时候需要用到的原则,它们的存在是为了保证设计模式达到以下几种目的: 1.代码重用性 2.可读性 3.可拓展性 4.可靠性(增加新的功能后,对原来的功能没有影响) 5.使程序呈现高内聚、低耦合的…...

msfconsole利用Windows server2008cve-2019-0708漏洞入侵
一、环境搭建 Windows系列cve-2019-0708漏洞存在于Windows系统的Remote Desktop Services(远程桌面服务)(端口3389)中,未经身份验证的攻击者可以通过发送特殊构造的数据包触发漏洞,可能导致远程无需用户验…...
Reinforcement Learning学习(三)
前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…...
hw meta10 adb back up DCIM
1. centos install adb 2. HW enable devlepment mode & enalbe adb debug 3. add shell root/zt/adb-sync python3 ./adb-sync --reverse /sdcard/DCIM/Camera /root/zt/meta10...

Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)
上期链接:Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客 上期我们聊到了人物的自身属性和受伤时的计算,我们先给人物和野猪挂上属性和攻击属性的代码,然后通过触发器触发受伤的事件。物体(人物也好敌人也行ÿ…...

从河流到空气,BL340工控机助力全面环保监测网络构建
在环保监测领域,智能化、高效率的监测手段正逐步成为守护绿水青山的新常态。其中,ARMxy工业计算机BL340凭借其强大的处理能力、高度的灵活性以及广泛的兼容性,在水质监测站、空气质量检测、噪音污染监控等多个环保应用场景中脱颖而出…...

零拷贝技术
背景 磁盘可以说是计算机系统重最慢的硬件之一,读写速度相对内存10以上,所以针对优化磁盘的技术非常的多,比如:零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的…...
Flutter_Android上架GooglePlay_问题
上架GooglePlay权限问题 问题描述 REQUEST_INSTALL_PACKAGES 权限问题解决方式 方式1 找到所有使用该权限的库修改删除该权限引用 方式2 打开项目 ~/andoird/app/src/main/AndroidMainfest.xml 添加文本<uses-permission android:name"android.permission.REQUES…...

【Java】解决Java报错:NumberFormatException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 字符串包含非数字字符2.2 空字符串或 null 字符串2.3 数值超出范围 3. 解决方案3.1 验证字符串格式3.2 使用异常处理3.3 处理空字符串和 null 4. 预防措施4.1 数据验证4.2 编写防御性代码4.3 单元测试 结语 引言 在Java编程中&a…...

视觉大模型(VLLM)学习笔记
视觉多模态大模型(VLLM) InternVL 1.5 近日,上海人工智能实验室 OpenGVLab 团队、清华大学、商汤科技合作推出了开源多模态大语言模型项目InternVL 1.5,它不仅挑战了商业模型巨头例如 GPT-4V 的霸主地位,还让我们不禁…...
【软考的系统分析师的考题考点解析2025】
2024-2025系统分析师考试(简称软考)是计算机技术与软件专业技术资格(水平)考试中的高级资格考试,主要考察考生在系统分析、系统设计、项目管理等方面的知识和技能。以下是软考系统分析师的常见考点、考题和重点&#x…...

JavaScript前端技术入门教程
引言 在前端开发的广阔天地中,JavaScript无疑是最耀眼的一颗明星。它赋予了网页动态交互的能力,让网页从静态的文本和图片展示,进化为可以与用户进行实时交互的丰富应用。本文将带您走进JavaScript的世界,为您提供一个入门级的教…...

类和对象(上续)
前言:本文介绍类和对象中的一些比较重要的知识点,为以后的继续学习打好基础。 目录 拷贝构造 拷贝构造的特征: 自定义类型的传值传参 自定义类型在函数中的传值返回 如果返回值时自定义的引用呢? 在什么情况下使用呢&#…...

【C++初阶学习】第十三弹——优先级队列及容器适配器
C语言栈:数据结构——栈(C语言版)-CSDN博客 C语言队列:数据结构——队列(C语言版)-CSDN博客 C栈与队列:【C初阶学习】第十二弹——stack和queue的介绍和使用-CSDN博客 前言: 在前面,我们已经…...

Java(十七)---ArrayList的使用
文章目录 前言1.ArrayList的简介2. ArrayList使用2.1.ArrayList的构造2.2.ArrayList的扩容机制(JDK17) 3.ArrayList的常见操作4. ArrayList的具体使用4.1.[杨辉三角](https://leetcode.cn/problems/pascals-triangle/description/)4.2.简单的洗牌游戏 5.ArrayList的问题及思考 …...

实验六、IPv4 地址的子网划分,第 2 部分《计算机网络》
你有没有发现,困的时候真的清醒不了。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后,您应该能够确定给定 IP 地址和子网掩码的子网信息。 知道 IP 地址、网络掩码和子网掩码后,您应该能够确定有关该 IP 地…...

定个小目标之刷LeetCode热题(12)
这是一道简单题,使用位运算中的异或运算即可,异或运算有以下性质: 1、任何数异或 0 结果仍然是原来的数,即 a⊕0a 2、任何数和其自身做异或运算,结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…...
MYSQL内存占用查询语句
可以通过以下 SQL 语句查询相关配置参数的当前值: InnoDB 缓冲池大小 (innodb_buffer_pool_size): SHOW VARIABLES LIKE innodb_buffer_pool_size;最大连接数 (max_connections): SHOW VARIABLES LIKE max_connections;临时表大小 (tmp_table…...

HikariCP连接池初识
HikariCP的简单介绍 hikari-光,hikariCP取义:像光一样轻和快的Connetion Pool。这个几乎只用java写的中间件连接池,极其轻量并注重性能,HikariCP目前已是SpringBoot默认的连接池,伴随着SpringBoot和微服务的普及&…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 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、…...