昨天遇到一个 mybatis SQL bug,排查了半天才定位到问题。同时使用了三个不同模型,都没有很好地定位到问题。但,这不完全是 AI 的问题,还是旧系统的表设计太随意了。
报错信息
Error querying database. Cause: java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配
但是我肉眼看了半天也没看出有什么问题,无非就是 date 类型转字符串的问题。AI 也一段乱改,也没有修复。而这个 SQL 100 多行,看起来头痛。所以想能不能打开 debug 日志,看看具体传递给 mybatis xml 中的参数值是什么类型,以及什么值。
启用 debug 日志
<configuration>
...
<!-- MyBatis SQL 日志 -->
<logger name="cn.xxx.business.stats.mapper" level="DEBUG" />
<logger name="org.mybatis" level="DEBUG" />
<logger name="java.sql" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
</configuration>
启用之后,就能看到 SQL 对应的参数值,即,每个 ? 对应的实际值和类型。以 RuoYi 的用户表为例:
19:37:07.588 [debug,137] - ==> Preparing: update sys_user SET login_ip = ?, login_date = ?, update_time = sysdate where user_id = ?
19:37:07.598 [debug,137] - ==> Parameters: 127.0.0.1(String), 2026-07-17 16:37:06.979(Timestamp), 1(Long)
也确实靠这个方法定位到了问题,原来是联表查询时,关联了两个表,但是两个表的日期字段使用不同的字段类型,一个是日期类型,另一个是字符串类型。所以,参数类型转换的方法应该是不同的,而 AI 想当然的以为是同类型的。。。看来以后在让 AI 排查 SQL 问题时,一定要把建表语句提前给到 AI。
开发环境与生产环境启用不同的日志级别
开发环境配置文件 application-dev.yml
# 日志配置(开发环境:开启 MyBatis SQL 调试日志)
logging:
level:
cn.xxx: debug
org.mybatis: debug
生产环境配置文件 application-prod.yml
# 日志配置(生产环境:关闭 SQL 日志,仅保留 info 及以上)
logging:
level:
cn.xxx: info
org.mybatis: warn
公共配置文件 application.yml
# 日志配置
logging:
level:
cn.xxx: info
org.springframework: warn
日志记录的目录也做区分
这个则需要把 logback.xml 改为 logback-spring.xml。
因为 logback-spring.xml 是 Spring Boot 的“一等公民”。Spring Boot 在启动时会主动找到它,插入自身的上下文信息,这使得日志配置能感知并利用 Spring 的强大功能。而 logback.xml 则是一个独立的 Logback 配置文件。
logback-spring.xml 中的日志路径配置
<springProperty name="log.path" source="logging.path" defaultValue="/home/ruoyi/logs" />
application-dev.yml 中的日志路径配置
logging:
path: logs
application-prod.yml 中的日志路径配置
logging:
path: /var/logs/xxx/
AI Skill
遇到类似的 “ORA-01861: 文字与格式字符串不匹配” 时,让 AI 去指定的目录或文件中查看对应的表结构。
但是这个方案,还是浪费时间,应该在写代码时,就让 AI 去对应的建表语句文件参考对应表的结构。
补充
今天外出溜达时,看了一下 mybatis 教程,发现还有比 debug 更低的日志级别:
MyBatis日志的最低级别是TRACE,在这个日志级别下,MyBatis会输出执行SQL过程中的详细信息,这个级别特别适合在开发时使用。
mybatis 最常用的是以下五个级别(按输出信息量从多到少排序):
- TRACE:最详细级别,输出 SQL 参数绑定、结果集映射等调试信息。
- DEBUG:输出 MyBatis 核心日志(如执行的 SQL 语句)。想看到 SQL 语句至少应设为该级别。
- INFO:输出应用运行过程中的一般信息。
- WARN:输出潜在问题或警告信息。
- ERROR:仅输出错误和异常信息。
关于作者 🌱
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式