#3550·mybatis-3

使用 databaseId 以适应多个数据库

作者: ttsdmmn创建于 2025年10月16日更新于 2026年5月12日
标签bug

关于虫子...

  • 我检查过这个问题还没有报告。

  • 我确认这个错误存在于 MyBatis的最新版本上.

  • 我确认这个bug复制没有3个政党扩展(例如 mybatis-plus).

QQ 数据库版本

MySQL 8 (英语).

JDBC 驱动程序版本

MySQL 8 (英语).

QQ 问题描述

当我使用数据库Id来适应多个数据库,例如MySQL、Postgrel和Oracle时,我有三组地图员.xml,一组是MySQL(/mapper/xxx.xml),一组是Postgre(/mapper/postgre/xxx.xml),一组是Oracle(/mapper/oracle/xxxx.x.xml)。 由于我的项目之前是基于MySQL,所以我想使用MySQL的映射器.xml作为. 共享 sqls, 这意味着我不会在 /mapper/xxxx.xml 中添加“ databaseId” 的 sqls, 而 /mapper/postgre/xxxxxx.xml 和/mapper/oracle/xxxxx.x.xml 将只包含冲突 sqls , 这些 sqls 已经适应了带有 databaseId 的通讯数据库 。 然而,我发现它不起作用。 如果我想使用 MySQL 的 sqls 作为默认 sqls, 三个 sqls 组必须被放入一个单独的 mapper.xml. 当我把它们分开成三个映射器.xml(用于可读性)时,它会抛出滑动冲突的例外. 似乎以下代码导致了问题: 私有布尔数据库 IdMatchesCurrent( 字符串 id, 字符串数据库 Id, 字符串 需要的 DatabaseId) { 如果( 需要DatabaseId! = 无效) { 返回需要的DatabaseId.equalitys(数据库Id); { 如果(数据库编号!=无效){ 假返回; 否则 id = this.builder Applic. apply CurrentNamespace(id, false); 互联网档案馆的存檔,存档日期2013-12-21. 如果 (!) (这个. confirmation. has statement (id, false)) { 返回真实; 否则 上一个状态 = this. confignation. get Mapped Statement (id, false; ). 返回上一个. getDatabaseId () == 无效; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 对于每个 mapper.xml,代码执行两次,首先需要使用非 nall 要求的DatabaseId,其次需要使用无效的DatabaseId. 例如,MySQL(/mapper/xxx.xml)包含有sqlid'select Test'的 sql,它与后格兼容,但与甲骨文相冲突,因此我将一个有数据库Id="甲骨文"的修改后 sql放入甲骨文(/mapper/oracle/xxx.xml). 如果解析顺序为MySQL(/mapper/xxx.xml),后置格(/mapper/postgre/xxx.xml),则在解析出MySQL(/mapper/xxx.xml)时,会通过数据库IdMatchesCurrent和无效需要的DatabaseId,将带有Sqlid"选择测试"的sql放入语句图. 然而,当它解析到oracle(/mapper/oracle/xx.xml)时,数据库IdMatchesCurrent与非核要求的DatabaseId返回 sql'select Test'时,它会尝试将 sql放入语句图中,然后发生冲突. 有没有办法解决这个问题?

关于你的报告...

  • 我没有使用图像 QQ来显示文本信息(代码,错误等).

  • 我检查了预览 我的报告看起来真棒!

内容来源: mybatis/mybatis-3