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.