U42 MyBatis / Spring 与 MySQL 实验
固定工程为 Liberica JDK 21、Spring Boot 4.0.9(Framework 7.0.10)、MyBatis 3.5.19、MyBatis-Spring 4.0.0、starter 4.0.1 与 Connector/J 9.7.0;本机 DBngin MySQL 8.4.7。本机已有 Maven 3.9 和对应本地缓存时,从仓库根运行:
python3 labs/mybatis-u42/run.pyrunner 离线构建,使用回环 MySQL;默认 root 空密码,可用 U42_MYSQL_USER / U42_MYSQL_PASSWORD 设置凭据(不写入证据)。runner 生成唯一 study_u42_* schema,程序仅在创建成功后报告归属,显式创建并预检仅指向该 schema 的数据源;同时放入无害的错误 SPRING_DATASOURCE_URL,验证它不能重定向实验。实验只操作创建成功的专用 schema,关闭连接池后 DROP 并复查。启动失败/清理失败时退出非零;观察到创建标记但未观察到正常清理时,runner 启动应急清理并核对该 schema。若进程在创建与标记之间中断,runner 报告待检查的 schema,不凭猜测删除;失败重跑不覆盖上次成功证据。清理只针对本次确认创建的 schema。用于验证异常清理的受控反例是在命令前设置 U42_TEST_ABORT_AFTER_CREATE=1;子进程创建 schema 并打印归属标记后立即退出,runner 应急删除并复查,整个命令预期非零且保留上次成功证据。这模拟进程突然终止,不等于真实 120 秒超时测试。
实验覆盖原生配置与属性优先级/databaseId、Mapper 扫描/XML resultMap/association/collection、动态条件(空 SET 报错与有效值恢复、bind 前缀)、枚举/null/非法值恢复、search 查询的空集合与跨租户反例、SQL builder 执行、插件链、Spring 事务/批执行器/REQUIRES_NEW、事务外重复键异常翻译和后续独立查询、Cursor 关闭及资源清理。错误包扫描只证明无注册,正确包来自另一个上下文,不代表自动修复原上下文。新基线没有复现旧基线二级缓存提交失败窗口,也不证明跨主机故障或生产容量。
文件:运行入口、POM、实验主程序、插件、应急清理、Mapper、商品模型、分类模型、状态枚举、SQL builder、原生配置、配置属性、Mapper XML、运行证据、异常清理反例证据。