0%

MySQL 存储过程详解:预编译 SQL 的高效应用

存储过程(Stored Procedure)是一组预先编译好的 SQL 语句集合,存储在数据库中,可通过名称直接调用。它能简化复杂操作、提高代码重用性,并减少数据库交互次数,是提升数据库性能的重要工具。

存储过程的核心优势

  1. 代码重用:一次定义,多次调用,避免重复编写相同 SQL。
  2. 减少网络交互:将多步 SQL 合并为一个存储过程,减少与数据库的连接次数。
  3. 提高安全性:可通过权限控制存储过程的调用,限制直接访问表的权限。
  4. 预编译优化:创建时编译一次,后续调用无需重新编译,提升执行效率。

存储过程的基本语法

创建存储过程

1
2
3
4
5
6
7
-- 语法
DELIMITER 自定义结束符 -- 因存储过程体含分号,需临时修改SQL结束符(如$)
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
-- 存储过程体(SQL语句集合)
END 自定义结束符
DELIMITER ; -- 恢复默认结束符(;)
参数列表格式:

参数由 “参数模式 + 参数名 + 数据类型” 组成,支持三种模式:

  • IN:输入参数(调用时需传入值)。
  • OUT:输出参数(作为返回值,需用用户变量接收)。
  • INOUT:既作为输入,也作为输出。

调用存储过程

1
CALL 存储过程名(参数列表);  -- 参数列表需与定义时的顺序和模式匹配

删除存储过程

阅读全文 »

MySQL 变量详解:系统变量与自定义变量的使用

MySQL 中的变量是存储数据的容器,分为系统变量(MySQL 内置,控制数据库行为)和自定义变量(用户定义,用于查询或存储过程中传递数据)。合理使用变量可简化操作、提升脚本灵活性。本文详细解析两类变量的定义、使用及区别。

系统变量:控制 MySQL 运行行为

系统变量是 MySQL 预定义的变量,用于配置数据库的运行参数(如连接数、缓存大小等),分为全局变量(影响所有会话)和会话变量(仅影响当前会话)。

系统变量的分类与作用

类型 作用范围 生效时机 示例
全局变量 所有会话(连接) 重启 MySQL 或通过 SET GLOBAL 修改后生效 max_connections(最大连接数)
会话变量 当前会话(连接) 会话启动时继承全局变量,SET SESSION 修改后立即生效 autocommit(自动提交开关)

查看系统变量

(1)查看所有系统变量
1
2
3
4
5
-- 查看所有全局变量
SHOW GLOBAL VARIABLES;

-- 查看所有会话变量(默认显示当前会话)
SHOW SESSION VARIABLES; -- 或简写为 SHOW VARIABLES;
(2)过滤查询特定变量

使用 LIKE 匹配变量名(支持通配符 %):

1
2
3
4
5
-- 查看所有包含“timeout”的全局变量
SHOW GLOBAL VARIABLES LIKE '%timeout%';

-- 查看当前会话的字符集变量
SHOW SESSION VARIABLES LIKE 'character_set_%';
(3)查询单个变量的值

通过 @@ 符号访问变量:

阅读全文 »

MySQL 视图详解:虚拟表的创建与应用

视图(View)是 MySQL 中一种虚拟存在的表,它不存储实际数据,而是保存查询逻辑,动态生成结果。合理使用视图可以简化复杂查询、提高数据访问的安全性和一致性。本文详细解析视图的概念、操作及适用场景。

视图的核心概念

视图是基于一个或多个表的查询结果构建的虚拟表,具有以下特性:

  • 不存储数据:仅保存 SQL 查询逻辑,每次使用视图时,MySQL 会动态执行查询并返回结果。
  • 结构依赖源表:视图的字段来自定义视图时的 SELECT 语句,源表结构变化可能导致视图失效。
  • 无物理存储:不占用额外存储空间(除视图定义本身),也不能创建索引、触发器或默认值。

视图的应用场景

视图适用于以下场景,帮助简化操作和提升安全性:

  1. 简化复杂查询:将多表关联、聚合计算等复杂查询封装为视图,后续使用时直接查询视图即可。
  2. 重用查询逻辑:多个业务场景需要相同的查询结果时,视图可避免重复编写 SQL。
  3. 限制数据访问:通过视图只暴露部分字段(如隐藏密码、身份证号等敏感信息),保护原始数据。
  4. 统一数据接口:当源表结构变更时,只需修改视图定义,无需修改依赖该视图的应用代码。

视图的基本操作

创建视图

语法

阅读全文 »

MySQL 事务详解:ACID 特性、隔离级别与实践

事务是数据库操作的基本单位,确保一组 SQL 语句要么全部成功执行,要么全部失败回滚,是保证数据一致性的核心机制。MySQL 中仅 InnoDB 存储引擎支持事务,本文详细解析事务的特性、隔离级别及实际应用。

事务的基本概念

事务(Transaction):由一个或多个 SQL 语句组成的执行单元,具备 “原子性”—— 要么所有语句执行成功(提交),要么全部失败(回滚),不存在部分执行的情况。

  • 支持情况:MySQL 中只有 InnoDB 引擎支持事务(MyISAM、MEMORY 等引擎不支持)。
  • 典型场景:转账操作(扣减 A 账户金额 + 增加 B 账户金额,两步必须同时成功或失败)。

事务的 ACID 特性

事务的四大核心特性(ACID)是保证数据可靠性的基础:

特性 含义说明 示例
原子性(Atomicity) 事务是不可分割的最小单位,操作要么全执行,要么全不执行。 转账时,若扣减 A 账户后系统崩溃,B 账户不会增加金额(事务回滚,恢复 A 账户)。
一致性(Consistency) 事务执行前后,数据库从一个一致性状态切换到另一个一致性状态(数据规则不变)。 转账前 A+B 总金额为 1000,转账后总金额仍为 1000(不会多增或少减)。
隔离性(Isolation) 多个事务并发执行时,彼此不干扰,每个事务感觉不到其他事务的存在。 事务 1 查询余额时,事务 2 的转账操作不会影响事务 1 的查询结果(隔离级别决定影响程度)。
持久性(Durability) 事务提交后,对数据的修改永久生效,即使系统崩溃也不会丢失。 事务提交后,数据写入磁盘,重启数据库后修改仍存在。

事务的创建与控制

MySQL 默认开启 “自动提交”(autocommit=ON),即每条 SQL 语句自动作为一个事务提交。如需手动控制事务,需先关闭自动提交。

事务控制的核心语句

阅读全文 »

Java 编程细节:提升代码质量的关键注意事项

在 Java 开发中,一些看似微小的细节往往决定了代码的健壮性、可读性和性能。本文总结了日常编程中容易忽略的关键细节,涵盖方法重写、对象比较、异常处理等核心场景,帮助开发者写出更可靠的代码。

重写 equalshashCode 的注意事项

equalshashCodeObject 类的核心方法,用于对象比较和哈希表操作,重写时需严格遵循规范,否则可能导致集合框架(如 HashMapHashSet)行为异常。

重写 equals 时必须使用 @Override 注解

  • 错误示例:误将参数类型改为具体类(如User),导致实际是重载而非重写。

    1
    2
    3
    4
    // 错误:这是重载(参数类型为 User),而非重写 Object 的 equals
    public boolean equals(User other) {
    return this.id == other.id;
    }
  • 正确做法:参数类型必须为Object,并添加@Override注解,让编译器校验正确性。

    1
    2
    3
    4
    5
    6
    7
    @Override // 强制编译器检查是否正确重写
    public boolean equals(Object obj) {
    if (this == obj) return true; // 自身比较
    if (obj == null || getClass() != obj.getClass()) return false; // 类型不一致
    User other = (User) obj; // 强制转型
    return this.id == other.id; // 核心比较逻辑
    }

重写 equals 必须同时重写 hashCode

  • 规范要求Object 类文档明确规定:

    若两个对象通过 equals 比较相等,则它们的 hashCode 必须返回相同的值。
    若两个对象 hashCode 不同,则 equals 一定返回 false

  • 后果:若仅重写 equals 而忽略 hashCode,会导致对象在哈希集合(如 HashSet)中无法正确去重,或在 HashMap 中作为键时无法被正确查找。

  • 正确示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    public boolean equals(Object obj) {
    // 省略 equals 实现...
    }

    @Override
    public int hashCode() {
    // 确保 equals 相等的对象,hashCode 也相等
    return Objects.hash(id, name); // 推荐使用 Objects.hash 组合字段
    }
  • 最佳实践

    • 参与 equals 比较的字段(如 idname),必须全部纳入 hashCode 计算。
    • 避免使用可变字段作为 hashCode 计算依据(对象修改后哈希值变化,导致集合操作异常)。
阅读全文 »