# SQL调试日志使用说明 - 班级名额查询问题排查 **创建时间**: 2025-01-27 **目的**: 帮助排查班主任批量申请奖学金页面中班级名额和全校名额查询的问题 ## 🎯 功能说明 为了帮助您验证班级名额和全校名额查询的SQL语句执行情况,我们增加了以下功能: ### 1. **详细的业务日志** - 在 `getScholarshipTypesWithQuota` 方法中增加了详细的日志输出 - 记录每一步的执行过程和查询结果 - 包含SQL参数和查询结果的详细信息 ### 2. **MyBatis SQL日志** - 配置了MyBatis的SQL日志输出 - 可以看到实际执行的SQL语句和参数绑定 - 包含查询结果和执行时间 ### 3. **专用调试接口** - 提供了专门的调试API接口 - 可以单独测试班级名额查询和全校名额查询 - 返回详细的调试信息 ## 🔧 配置说明 ### 已添加的配置项 在 `backend/ruoyi-admin/src/main/resources/application-dev.yml` 中添加了: ```yaml # SQL日志配置(用于调试班级名额查询问题) logging: level: # 开启 MyBatis SQL 日志 org.dromara.jcbt.mapper: DEBUG org.dromara.jcbt.service: DEBUG # 开启 MyBatis-Plus SQL 日志 com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor: DEBUG # 开启 HikariCP 连接池日志(可选) com.zaxxer.hikari: DEBUG # 开启 P6Spy SQL 日志(更详细的SQL执行日志) p6spy: INFO # MyBatis 配置 mybatis-plus: configuration: # 开启 SQL 日志打印 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启驼峰命名转换 map-underscore-to-camel-case: true ``` ## 📋 使用方法 ### 方法一:调用现有接口观察日志 1. **启动后端服务** ```bash cd backend ./start-main.sh ``` 2. **调用接口** ```http GET http://localhost:8080/jcbt/scholarshipApplication/scholarshipTypesWithQuota?batchId=1&classId=123 ``` 3. **观察控制台日志输出** - 查看详细的业务流程日志 - 查看MyBatis执行的SQL语句 - 查看查询结果和处理过程 ### 方法二:使用专用调试接口 #### 1. 完整流程测试 ```http GET http://localhost:8080/jcbt/scholarshipApplication/debug/sqlLogs?batchId=1&classId=123 ``` #### 2. 单个奖学金类型测试 ```http GET http://localhost:8080/jcbt/scholarshipApplication/debug/sqlLogs?batchId=1&classId=123&scholarshipTypeId=1 ``` ## 📊 日志输出示例 ### 业务日志示例 ``` 2025-01-27 16:20:00.123 INFO --- [http-nio-8080-exec-1] o.d.j.s.i.JcbtScholarshipApplicationServiceImpl : === 开始获取带名额信息的奖学金类型 === 2025-01-27 16:20:00.124 INFO --- [http-nio-8080-exec-1] o.d.j.s.i.JcbtScholarshipApplicationServiceImpl : 输入参数 - 批次ID: 1, 班级ID: 123 2025-01-27 16:20:00.125 INFO --- [http-nio-8080-exec-1] o.d.j.s.i.JcbtScholarshipApplicationServiceImpl : --- 处理奖学金类型ID: 1 --- 2025-01-27 16:20:00.126 INFO --- [http-nio-8080-exec-1] o.d.j.s.i.JcbtScholarshipApplicationServiceImpl : 开始查询班级名额 - SQL参数: classId=123, scholarshipTypeId=1, batchId=1 2025-01-27 16:20:00.127 INFO --- [http-nio-8080-exec-1] o.d.j.s.i.JcbtScholarshipApplicationServiceImpl : 执行SQL: SELECT * FROM jcbt_scholarship_class_quota WHERE class_id = 123 AND scholarship_type_id = 1 AND batch_id = 1 AND status = '1' AND deleted = 0 ``` ### MyBatis SQL日志示例 ``` 2025-01-27 16:20:00.128 DEBUG --- [http-nio-8080-exec-1] o.d.j.m.JcbtScholarshipClassQuotaMapper.selectAvailableQuota : ==> Preparing: select id, batch_id, scholarship_type_id, dept_id, class_id, total_quota, used_quota, available_quota, status, remark, create_by, create_time, update_by, update_time from jcbt_scholarship_class_quota where class_id = ? and scholarship_type_id = ? and batch_id = ? and status = '1' and deleted = 0 2025-01-27 16:20:00.129 DEBUG --- [http-nio-8080-exec-1] o.d.j.m.JcbtScholarshipClassQuotaMapper.selectAvailableQuota : ==> Parameters: 123(Long), 1(Long), 1(Long) 2025-01-27 16:20:00.135 DEBUG --- [http-nio-8080-exec-1] o.d.j.m.JcbtScholarshipClassQuotaMapper.selectAvailableQuota : <== Total: 1 ``` ## 🔍 问题排查指南 ### 1. 班级名额查询问题 **如果查询结果为空,可能的原因:** 1. **数据不存在** - 检查 `jcbt_scholarship_class_quota` 表中是否有对应记录 - 确认 `class_id`, `scholarship_type_id`, `batch_id` 参数值正确 2. **状态问题** - 检查记录的 `status` 字段是否为 '1'(启用状态) - 检查记录的 `deleted` 字段是否为 0(未删除) 3. **权限问题** - 确认当前用户有查询权限 - 检查多租户配置是否正确 ### 2. 全校名额查询问题 **如果查询结果为空,可能的原因:** 1. **数据不存在** - 检查 `jcbt_scholarship_quota` 表中是否有对应记录 - 确认 `batch_id`, `scholarship_type_id` 参数值正确 2. **关联表问题** - 检查与 `jcbt_scholarship_batch` 表的关联 - 检查与 `jcbt_scholarship_type` 表的关联 - 检查与 `sys_dept` 表的关联 ### 3. 性能问题 **如果查询速度慢:** 1. **索引检查** ```sql -- 检查班级名额表的索引 SHOW INDEX FROM jcbt_scholarship_class_quota; -- 检查全校名额表的索引 SHOW INDEX FROM jcbt_scholarship_quota; ``` 2. **建议添加的索引** ```sql -- 班级名额表复合索引 CREATE INDEX idx_class_quota_query ON jcbt_scholarship_class_quota(class_id, scholarship_type_id, batch_id, status, deleted); -- 全校名额表复合索引 CREATE INDEX idx_school_quota_query ON jcbt_scholarship_quota(batch_id, scholarship_type_id, deleted); ``` ## 🚨 注意事项 ### 1. **生产环境使用** - 这些调试配置仅适用于开发和测试环境 - 生产环境请关闭详细的SQL日志,避免性能影响 - 可以将日志级别调整为 WARN 或 ERROR ### 2. **日志文件大小** - SQL日志会产生大量输出,注意日志文件大小 - 建议配置日志轮转和清理策略 ### 3. **敏感信息** - 注意日志中可能包含敏感的业务数据 - 生产环境需要对日志进行脱敏处理 ## 📞 使用步骤总结 1. **确保配置生效**:重启后端服务 2. **调用调试接口**:使用提供的调试API 3. **观察日志输出**:查看控制台的详细日志 4. **分析问题原因**:根据日志信息排查问题 5. **验证修复效果**:修复后重新测试 ## 🔧 临时关闭调试日志 如果需要临时关闭调试日志,可以修改配置: ```yaml logging: level: org.dromara.jcbt.mapper: INFO org.dromara.jcbt.service: INFO mybatis-plus: configuration: # 关闭 SQL 日志打印 # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` --- **创建者**: Cursor AI Assistant **更新时间**: 2025-01-27 16:30:00 **状态**: 已配置完成,可直接使用