Skip to content

MySQL 逻辑架构 - 代码使用指南

本文档详细介绍 MySQL 逻辑架构示例代码的结构、作用、测试方法和执行预期结果


一、代码结构

1.1 项目结构

linsir-abc-mysql/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/linsir/abc/mysql/
│   │   │       ├── MySQLApplication.java              # 应用入口
│   │   │       ├── chapter01/
│   │   │       │   └── architecture/
│   │   │       │       ├── client/                    # 客户端层
│   │   │       │       │   ├── auth/
│   │   │       │       │   │   ├── AuthManager.java   # 认证管理器
│   │   │       │       │   │   └── Authenticator.java # 认证器
│   │   │       │       │   ├── connection/
│   │   │       │       │   │   ├── ConnectionManager.java  # 连接管理器
│   │   │       │       │   │   └── ConnectionPool.java     # 连接池
│   │   │       │       │   └── session/
│   │   │       │       │       └── SessionManager.java     # 会话管理器
│   │   │       │       ├── server/                    # 服务层
│   │   │       │       │   ├── executor/
│   │   │       │       │   │   └── QueryExecutor.java      # 查询执行器
│   │   │       │       │   ├── optimizer/
│   │   │       │       │   │   └── QueryOptimizer.java     # 查询优化器
│   │   │       │       │   └── parser/
│   │   │       │       │       ├── ParseTree.java          # SQL解析树
│   │   │       │       │       └── SQLParser.java          # SQL解析器
│   │   │       │       ├── engine/                    # 存储引擎层
│   │   │       │       │   ├── InnoDBEngine.java      # InnoDB引擎实现
│   │   │       │       │   ├── StorageEngine.java     # 存储引擎接口
│   │   │       │       │   └── TransactionManager.java # 事务管理器
│   │   │       │       ├── entity/                    # 实体类
│   │   │       │       │   ├── ConnectionSession.java # 连接会话
│   │   │       │       │   ├── User.java              # 用户实体
│   │   │       │       │   ├── Product.java           # 产品实体
│   │   │       │       │   ├── Order.java             # 订单实体
│   │   │       │       │   └── OrderItem.java         # 订单项实体
│   │   │       │       └── mapper/                    # MyBatis映射器
│   │   │       │           ├── ConnectionSessionMapper.java
│   │   │       │           ├── UserMapper.java
│   │   │       │           ├── ProductMapper.java
│   │   │       │           ├── OrderMapper.java
│   │   │       │           └── OrderItemMapper.java
│   │   │       └── config/
│   │   │           ├── MyBatisConfig.java             # MyBatis配置
│   │   │           └── WebConfig.java                 # Web配置
│   │   └── resources/
│   │       ├── db/                                    # 数据库脚本
│   │       │   ├── common/init/                       # 公共初始化脚本
│   │       │   └── chapter01/architecture/init/       # 架构模块脚本
│   │       └── application.yml                        # 应用配置
│   └── test/
│       ├── java/
│       │   └── com/linsir/abc/mysql/
│       │       └── chapter01/
│       │           └── architecture/
│       │               ├── client/
│       │               │   ├── AuthenticatorTest.java      # 认证器测试
│       │               │   └── ConnectionManagerTest.java  # 连接管理器测试
│       │               ├── server/
│       │               │   ├── SQLParserTest.java          # SQL解析器测试
│       │               │   └── QueryOptimizerTest.java     # 查询优化器测试
│       │               └── MySQLArchitectureIntegrationTest.java  # 集成测试
│       └── resources/
│           └── application-test.yml                   # 测试配置
└── pom.xml                                            # Maven配置

1.2 核心类说明

客户端层 (Client Layer)

类名作用关键方法
ConnectionManager管理数据库连接和会话createSession(), getConnection(), closeSession(), getPoolStats()
Authenticator用户认证和密码验证authenticate(), encodePassword(), verifyPassword(), checkPermission()
SessionManager管理用户会话生命周期createSession(), getSession(), closeSession()

服务层 (Server Layer)

类名作用关键方法
SQLParserSQL词法分析和语法分析parse(), parseToTree(), tokenize(), validateSyntax(), detectSqlInjection()
ParseTree存储SQL解析后的结构化信息数据载体,包含SQL各组成部分
QueryOptimizer查询优化和执行计划生成optimize(), estimateCost()
QueryExecutor执行SQL查询execute(), executeQuery(), executeUpdate()

存储引擎层 (Storage Engine Layer)

类名作用关键方法
StorageEngine存储引擎接口定义open(), close(), read(), write()
InnoDBEngineInnoDB引擎实现实现StorageEngine接口
TransactionManager事务管理begin(), commit(), rollback()

二、代码作用

2.1 整体架构模拟

本代码模拟了MySQL的三层逻辑架构:

┌─────────────────────────────────────────────────────────────┐
│                      应用层 (Application)                     │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                      客户端层 (Client Layer)                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
│  │  Connection  │  │Authenticator │  │   Session    │       │
│  │   Manager    │  │              │  │   Manager    │       │
│  └──────────────┘  └──────────────┘  └──────────────┘       │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                      服务层 (Server Layer)                    │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐    │
│  │  Parser  │  │ Optimizer│  │ Executor │  │  Cache   │    │
│  │ (SQL解析) │  │(查询优化) │  │ (执行器)  │  │ (缓存)   │    │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘    │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                    存储引擎层 (Storage Engine)                 │
│              ┌─────────────────────────────┐                │
│              │     MySQL Database          │                │
│              │     (InnoDB Engine)         │                │
│              └─────────────────────────────┘                │
└─────────────────────────────────────────────────────────────┘

2.2 各模块详细作用

2.2.1 SQLParser - SQL解析器

作用:将SQL字符串解析成结构化的数据对象

核心功能

  1. 词法分析:将SQL拆分为Token(关键字、标识符、操作符等)
  2. 语法分析:识别SQL类型(SELECT/INSERT/UPDATE/DELETE)
  3. 信息提取:提取表名、列名、WHERE条件、ORDER BY等
  4. SQL注入检测:检测常见的SQL注入攻击模式
  5. 语法验证:验证括号匹配等基本语法规则

使用示例

java
@Autowired
private SQLParser sqlParser;

public void example() {
    String sql = "SELECT id, name FROM users WHERE status = 1 ORDER BY id DESC LIMIT 10";
    
    // 基础解析
    SQLParser.ParseResult result = sqlParser.parse(sql);
    System.out.println("SQL类型: " + result.getSqlType());  // SELECT
    System.out.println("表名: " + result.getTables());      // [users]
    
    // 解析为树形结构
    ParseTree tree = sqlParser.parseToTree(sql);
    System.out.println("列名: " + tree.getColumns());       // [id, name]
    System.out.println("WHERE条件: " + tree.getWhereClause()); // status = 1
    System.out.println("是否有ORDER BY: " + tree.isHasOrderBy()); // true
}

2.2.2 ParseTree - SQL解析树

作用:存储SQL解析后的结构化信息,作为Parser和Optimizer之间的数据载体

包含字段

  • 基础信息:statementType, tableName, columns
  • 数据操作:values, batchValues, setClauses
  • 查询条件:whereClause, orderByClause, orderByColumns
  • 分页限制:limit, offset, hasLimit
  • 高级特性:hasJoin, joinType, hasAggregateFunction, hasSubquery, hasGroupBy, hasUnion

2.2.3 QueryOptimizer - 查询优化器

作用:分析SQL并生成最优执行计划

核心功能

  1. 执行策略选择

    • FULL_SCAN - 全表扫描
    • INDEX_SCAN - 索引扫描
    • RANGE_SCAN - 范围扫描
    • CONST - 常量查询
  2. 成本估算:根据策略和条件估算查询成本

  3. 优化建议:提供索引建议和风险警告

使用示例

java
@Autowired
private QueryOptimizer queryOptimizer;

public void example() {
    String sql = "SELECT * FROM users WHERE id = 1";
    SQLParser.ParseResult parseResult = sqlParser.parse(sql);
    
    // 生成执行计划
    QueryOptimizer.ExecutionPlan plan = queryOptimizer.optimize(parseResult);
    
    System.out.println("执行策略: " + plan.getStrategy());        // INDEX_SCAN
    System.out.println("索引建议: " + plan.getIndexSuggestion()); // 建议在条件字段上创建索引
    System.out.println("估算成本: " + plan.getEstimatedCost());   // 200
}

2.2.4 ConnectionManager - 连接管理器

作用:管理数据库连接池和用户会话

核心功能

  1. 会话管理:创建、查询、关闭会话
  2. 连接获取:从连接池获取数据库连接
  3. 连接池监控:获取连接池统计信息

使用示例

java
@Autowired
private ConnectionManager connectionManager;

public void example() {
    User user = User.builder().id(1L).username("zhangsan").build();
    
    // 创建会话
    ConnectionSession session = connectionManager.createSession(user, "192.168.1.100", 54321);
    System.out.println("会话ID: " + session.getSessionId());
    
    // 获取连接池统计
    ConnectionManager.ConnectionPoolStats stats = connectionManager.getPoolStats();
    System.out.println("总连接数: " + stats.getTotalConnections());
    System.out.println("活跃连接数: " + stats.getActiveConnections());
    
    // 关闭会话
    connectionManager.closeSession(session.getSessionId());
}

2.2.5 Authenticator - 认证器

作用:用户认证、密码验证和权限检查

核心功能

  1. 用户认证:验证用户名和密码
  2. 密码加密:使用SHA-256加密密码
  3. 权限检查:检查用户角色权限

使用示例

java
@Autowired
private Authenticator authenticator;

public void example() {
    // 用户认证
    Authenticator.AuthResult result = authenticator.authenticate(
        "zhangsan", "password123", "192.168.1.100"
    );
    
    if (result.isSuccess()) {
        User user = result.getUser();
        System.out.println("认证成功: " + user.getUsername());
        
        // 检查权限
        boolean hasPermission = authenticator.checkPermission(user, "ADMIN");
        System.out.println("是否有ADMIN权限: " + hasPermission);
    } else {
        System.out.println("认证失败: " + result.getMessage());
    }
}

三、测试方法

3.1 运行所有测试

bash
cd linsir-abc-mysql
mvn test

3.2 运行特定测试类

bash
# SQL解析器测试
mvn test -Dtest=SQLParserTest

# 查询优化器测试
mvn test -Dtest=QueryOptimizerTest

# 连接管理器测试
mvn test -Dtest=ConnectionManagerTest

# 认证器测试
mvn test -Dtest=AuthenticatorTest

# 集成测试
mvn test -Dtest=MySQLArchitectureIntegrationTest

3.3 测试类详解

3.3.1 SQLParserTest - SQL解析器测试

测试场景

测试方法测试内容
testParseSimpleSelect()简单SELECT语句解析
testParseSelectWithWhere()带WHERE条件的SELECT
testParseSelectWithJoin()带JOIN的SELECT
testParseSelectWithOrderBy()带ORDER BY的SELECT
testParseSelectWithLimit()带LIMIT的SELECT
testParseInsert()INSERT语句解析
testParseUpdate()UPDATE语句解析
testParseDelete()DELETE语句解析
testDetectAggregateFunction()聚合函数检测
testDetectSqlInjection()SQL注入检测
testValidateSyntax()SQL语法验证
testCaseInsensitive()SQL大小写不敏感测试

运行示例

bash
mvn test -Dtest=SQLParserTest#testParseSimpleSelect

3.3.2 QueryOptimizerTest - 查询优化器测试

测试场景

测试方法测试内容
testOptimizeSimpleQuery_FullScan()简单查询-全表扫描
testOptimizeIndexQuery()带WHERE条件-索引扫描
testOptimizeInsert()INSERT优化
testOptimizeUpdateWithWhere()UPDATE带WHERE条件
testOptimizeUpdateWithoutWhere()UPDATE无WHERE条件(警告)
testOptimizeDeleteWithWhere()DELETE带WHERE条件
testOptimizeDeleteWithoutWhere()DELETE无WHERE条件(警告)
testCostEstimation()成本估算
testOptimizeOrderBy()ORDER BY优化
testOptimizeLimit()LIMIT优化

3.3.3 ConnectionManagerTest - 连接管理器测试

测试场景

测试方法测试内容
testCreateSession()会话创建
testGetConnection()获取数据库连接
testCloseSession()关闭会话
testGetActiveSessionCount()获取活跃会话数
testGetPoolStats()连接池统计
testSessionIdUniqueness()会话ID唯一性

3.3.4 AuthenticatorTest - 认证器测试

测试场景

测试方法测试内容
testAuthenticate_Success()认证成功
testAuthenticate_UserNotFound()用户不存在
testAuthenticate_UserDisabled()用户被禁用
testAuthenticate_WrongPassword()密码错误
testEncodePassword()密码加密
testVerifyPassword_Success()密码验证成功
testVerifyPassword_Fail()密码验证失败
testCheckPermission_HasPermission()权限检查-有权限
testCheckPermission_NoPermission()权限检查-无权限

3.3.5 MySQLArchitectureIntegrationTest - 集成测试

测试场景

测试方法测试内容
testCompleteLoginFlow()完整登录流程
testSqlParseAndOptimizeFlow()SQL解析和优化流程
testAuthenticationFailure()认证失败场景
testPermissionCheck()权限检查
testConnectionPoolStats()连接池统计
testSqlSyntaxValidation()SQL语法验证
testSqlInjectionDetection()SQL注入检测

四、代码执行预期结果

4.1 单元测试预期结果

SQLParserTest 预期结果

测试通过场景:
✅ testParseSimpleSelect - 解析出3个列名(id, username, email),表名为users
✅ testParseSelectWithWhere - 正确提取WHERE条件 "status = 1 AND role = 'ADMIN'"
✅ testParseSelectWithJoin - 识别INNER JOIN,joinTable为orders
✅ testParseSelectWithLimit - limit=10, offset=20
✅ testDetectSqlInjection - 检测到恶意SQL返回true
✅ testValidateSyntax - 括号匹配正确返回true,不匹配返回false
✅ testCaseInsensitive - 大小写不同的SQL都能正确识别为SELECT类型

测试失败场景:
❌ testParseEmptySql - 空SQL返回ParseResult.success=false
❌ testParseNullSql - null SQL返回ParseResult.success=false

QueryOptimizerTest 预期结果

测试通过场景:
✅ testOptimizeSimpleQuery_FullScan - 无WHERE条件时策略为FULL_SCAN
✅ testOptimizeIndexQuery - 有WHERE条件时策略为INDEX_SCAN,有索引建议
✅ testOptimizeUpdateWithoutWhere - 返回警告信息包含"WHERE"
✅ testOptimizeDeleteWithoutWhere - 返回警告信息包含"WHERE"
✅ testCostEstimation - 估算成本大于0
✅ testOptimizeOrderBy - needSort=true
✅ testOptimizeLimit - hasLimit=true

测试失败场景:
❌ testOptimizeFailedParse - 解析失败时返回ExecutionPlan.success=false

ConnectionManagerTest 预期结果

测试通过场景:
✅ testCreateSession - 会话创建成功,sessionId不为null,status=1
✅ testGetConnection - 返回的数据库连接不为null
✅ testCloseSession - 关闭后activeSessionCount=0
✅ testGetActiveSessionCount - 创建2个会话后返回2
✅ testGetPoolStats - 返回的连接池统计对象不为null
✅ testSessionIdUniqueness - 两个会话的sessionId不相同

AuthenticatorTest 预期结果

测试通过场景:
✅ testAuthenticate_Success - result.isSuccess()=true,user不为null
✅ testEncodePassword - 加密后的密码与原密码不同
✅ testVerifyPassword_Success - 验证正确密码返回true
✅ testVerifyPassword_Fail - 验证错误密码返回false
✅ testCheckPermission_HasPermission - 用户角色匹配返回true
✅ testCheckPermission_NoPermission - 用户角色不匹配返回false

测试失败场景:
❌ testAuthenticate_UserNotFound - 用户不存在时result.isSuccess()=false
❌ testAuthenticate_UserDisabled - 用户状态为0时result.isSuccess()=false
❌ testAuthenticate_WrongPassword - 密码错误时result.isSuccess()=false

4.2 集成测试预期结果

MySQLArchitectureIntegrationTest 预期结果

✅ testCompleteLoginFlow:
   - 用户创建成功
   - 认证通过,authResult.isSuccess()=true
   - 会话创建成功,session.status=1
   - 会话关闭后activeSessionCount=0

✅ testSqlParseAndOptimizeFlow:
   - SQL解析成功,parseResult.isSuccess()=true
   - 优化成功,executionPlan.isSuccess()=true
   - 估算成本大于0

✅ testAuthenticationFailure:
   - 使用错误密码认证失败,authResult.isSuccess()=false
   - 返回错误消息不为null

✅ testPermissionCheck:
   - ADMIN用户检查ADMIN权限返回true
   - ADMIN用户检查SUPER_ADMIN权限返回false

✅ testConnectionPoolStats:
   - 返回的连接池统计对象不为null

✅ testSqlSyntaxValidation:
   - 有效SQL返回true
   - 括号不匹配的SQL返回false

✅ testSqlInjectionDetection:
   - 正常SQL返回false
   - 注入SQL返回true

4.3 测试覆盖率预期

模块预期覆盖率说明
SQLParser>90%核心解析逻辑全覆盖
ParseTree100%数据载体,所有字段都应被使用
QueryOptimizer>85%主要优化策略覆盖
ConnectionManager>80%核心会话管理功能覆盖
Authenticator>85%认证和权限检查覆盖

4.4 性能预期

操作预期性能说明
SQL解析<10ms简单SQL解析时间
查询优化<5ms执行计划生成时间
用户认证<50ms包含数据库查询的完整认证
会话创建<20ms包含数据库插入操作

五、常见问题排查

5.1 测试失败排查

问题现象可能原因解决方案
数据库连接失败H2数据库未配置检查application-test.yml中的H2配置
表不存在错误数据库脚本未执行确认resources/db/下的SQL脚本已加载
空指针异常Mock对象未正确设置检查测试类中的@Mock和@BeforeEach配置
断言失败代码逻辑变更对比实际返回值和预期值,更新测试或代码

5.2 调试技巧

  1. 查看详细日志

    bash
    mvn test -Dtest=SQLParserTest -X
  2. 只运行失败的测试

    bash
    mvn test -Dtest=SQLParserTest#testParseSimpleSelect
  3. 生成测试报告

    bash
    mvn test
    # 报告位置:target/surefire-reports/

六、扩展开发指南

6.1 添加新的SQL解析功能

  1. SQLParser.java 中添加新的提取方法
  2. ParseTree.java 中添加对应字段
  3. SQLParserTest.java 中添加测试用例

6.2 添加新的优化策略

  1. QueryOptimizer.ExecutionStrategy 中添加新策略
  2. 在对应优化方法中实现策略选择逻辑
  3. QueryOptimizerTest.java 中添加测试用例

6.3 添加新的认证方式

  1. Authenticator.java 中添加新方法
  2. 更新 AuthResult 类以支持新功能
  3. AuthenticatorTest.java 中添加测试用例

本文档与代码版本保持一致,如有更新请参考最新代码。

Released under the MIT License.