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)
| 类名 | 作用 | 关键方法 |
|---|---|---|
SQLParser | SQL词法分析和语法分析 | parse(), parseToTree(), tokenize(), validateSyntax(), detectSqlInjection() |
ParseTree | 存储SQL解析后的结构化信息 | 数据载体,包含SQL各组成部分 |
QueryOptimizer | 查询优化和执行计划生成 | optimize(), estimateCost() |
QueryExecutor | 执行SQL查询 | execute(), executeQuery(), executeUpdate() |
存储引擎层 (Storage Engine Layer)
| 类名 | 作用 | 关键方法 |
|---|---|---|
StorageEngine | 存储引擎接口定义 | open(), close(), read(), write() |
InnoDBEngine | InnoDB引擎实现 | 实现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字符串解析成结构化的数据对象
核心功能:
- 词法分析:将SQL拆分为Token(关键字、标识符、操作符等)
- 语法分析:识别SQL类型(SELECT/INSERT/UPDATE/DELETE)
- 信息提取:提取表名、列名、WHERE条件、ORDER BY等
- SQL注入检测:检测常见的SQL注入攻击模式
- 语法验证:验证括号匹配等基本语法规则
使用示例:
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并生成最优执行计划
核心功能:
执行策略选择:
FULL_SCAN- 全表扫描INDEX_SCAN- 索引扫描RANGE_SCAN- 范围扫描CONST- 常量查询
成本估算:根据策略和条件估算查询成本
优化建议:提供索引建议和风险警告
使用示例:
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 - 连接管理器
作用:管理数据库连接池和用户会话
核心功能:
- 会话管理:创建、查询、关闭会话
- 连接获取:从连接池获取数据库连接
- 连接池监控:获取连接池统计信息
使用示例:
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 - 认证器
作用:用户认证、密码验证和权限检查
核心功能:
- 用户认证:验证用户名和密码
- 密码加密:使用SHA-256加密密码
- 权限检查:检查用户角色权限
使用示例:
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 test3.2 运行特定测试类
bash
# SQL解析器测试
mvn test -Dtest=SQLParserTest
# 查询优化器测试
mvn test -Dtest=QueryOptimizerTest
# 连接管理器测试
mvn test -Dtest=ConnectionManagerTest
# 认证器测试
mvn test -Dtest=AuthenticatorTest
# 集成测试
mvn test -Dtest=MySQLArchitectureIntegrationTest3.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#testParseSimpleSelect3.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=falseQueryOptimizerTest 预期结果
测试通过场景:
✅ testOptimizeSimpleQuery_FullScan - 无WHERE条件时策略为FULL_SCAN
✅ testOptimizeIndexQuery - 有WHERE条件时策略为INDEX_SCAN,有索引建议
✅ testOptimizeUpdateWithoutWhere - 返回警告信息包含"WHERE"
✅ testOptimizeDeleteWithoutWhere - 返回警告信息包含"WHERE"
✅ testCostEstimation - 估算成本大于0
✅ testOptimizeOrderBy - needSort=true
✅ testOptimizeLimit - hasLimit=true
测试失败场景:
❌ testOptimizeFailedParse - 解析失败时返回ExecutionPlan.success=falseConnectionManagerTest 预期结果
测试通过场景:
✅ 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()=false4.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返回true4.3 测试覆盖率预期
| 模块 | 预期覆盖率 | 说明 |
|---|---|---|
| SQLParser | >90% | 核心解析逻辑全覆盖 |
| ParseTree | 100% | 数据载体,所有字段都应被使用 |
| 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 调试技巧
查看详细日志:
bashmvn test -Dtest=SQLParserTest -X只运行失败的测试:
bashmvn test -Dtest=SQLParserTest#testParseSimpleSelect生成测试报告:
bashmvn test # 报告位置:target/surefire-reports/
六、扩展开发指南
6.1 添加新的SQL解析功能
- 在
SQLParser.java中添加新的提取方法 - 在
ParseTree.java中添加对应字段 - 在
SQLParserTest.java中添加测试用例
6.2 添加新的优化策略
- 在
QueryOptimizer.ExecutionStrategy中添加新策略 - 在对应优化方法中实现策略选择逻辑
- 在
QueryOptimizerTest.java中添加测试用例
6.3 添加新的认证方式
- 在
Authenticator.java中添加新方法 - 更新
AuthResult类以支持新功能 - 在
AuthenticatorTest.java中添加测试用例
本文档与代码版本保持一致,如有更新请参考最新代码。