当前位置: 首页 > 知识库问答 >
问题:

java - mybatis编写xml时,怎么根据变量值,执行不同的sql语句?

柴耀
2024-02-01

mybatis编写xml时,怎么根据读取配置文件/内存对象的变量,执行动态的sql语句?

比如有一个全局配置类:

public class GlobalVariable {    public int databaseType; //数据库类型,1mysql,2达梦}

然后xml文件实现类似下面的判断效果:

...<select id="selectOne">    <if test="databaseType='1'">        ...    </if>    <if test="databaseType='2'">        ...    </if></select>...

该需求主要要程序需要兼容mysql数据库和达梦数据库,但是两者的语句在某些场景下不同。

共有3个答案

益楷
2024-02-01

mybatis 有自带的数据库厂商标识(databaseIdProvider)
https://mybatis.net.cn/configuration.html#databaseIdProvider

<select id="selectAll" resultType="com.alen.trial.multilds.model.Multil" databaseId="mysql">     select * from multil</select><select id="selectAll" resultType="com.alen.trial.multilds.model.Multil" databaseId="oracle">       select id from multil</select>

https://blog.csdn.net/zhaizhisheng/article/details/105834300

郁景龙
2024-02-01

mybatis的xml不是可以传参的吗?那就在调用这个SQL的时候往里传就好了呀(假设是用map传参):

<select id="selectOne" parameterType="map" resultType="YourResultType">    SELECT * FROM your_table    <if test="databaseType == '1'">        WHERE condition_for_mysql    </if>    <if test="databaseType == '2'">        WHERE condition_for_达梦    </if></select>
南门刚捷
2024-02-01

在 MyBatis 中,你可以使用 <if> 元素来根据条件动态地构建 SQL 语句。在你的例子中,你希望根据 databaseType 的值来选择不同的 SQL 语句。

首先,你需要在你的全局配置类中添加一个方法来获取 databaseType 的值。假设你的全局配置类名为 GlobalVariable,你可以添加一个名为 getDatabaseType 的方法:

public class GlobalVariable {    private int databaseType; //数据库类型,1mysql,2达梦    public int getDatabaseType() {        return databaseType;    }    public void setDatabaseType(int databaseType) {        this.databaseType = databaseType;    }}

然后,在你的 MyBatis 的 XML 映射文件中,你可以使用 <if> 元素来根据 databaseType 的值动态地构建 SQL 语句:

<select id="selectOne" parameterType="map" resultType="YourResultType">    SELECT * FROM your_table    <if test="databaseType == '1'">        WHERE condition_for_mysql    </if>    <if test="databaseType == '2'">        WHERE condition_for_达梦    </if></select>

在这个例子中,你需要将 YourResultType 替换为你查询结果的类型,将 your_table 替换为你的表名,将 condition_for_mysqlcondition_for_达梦 替换为对应的条件。当 databaseType 的值为 1 时,会执行 WHERE condition_for_mysql 的 SQL 语句;当 databaseType 的值为 2 时,会执行 WHERE condition_for_达梦 的 SQL 语句。

 类似资料:
  • 问题内容: 我正在编写一个一次性Java程序,以将CSV文件中的一堆行添加到MySQL数据库。是否有任何Java类/工具包可以帮助您解决此问题?会逃脱必要字符等的东西吗?(例如,准备好的陈述) 还是我应该自己写语句,像这样: 问题答案: 如果使用的是JDBC,请使用PreparedStatement。此类将为您节省手动转义输入的麻烦。 该代码基本上看起来像这样(完全是从内存中开始的-希望我不要忽略

  • 本文向大家介绍MyBatis 执行动态 SQL语句详解,包括了MyBatis 执行动态 SQL语句详解的使用技巧和注意事项,需要的朋友参考一下 大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: 你可以如下调用: 或者你可以在 XXMapper.java 接口中定义如下方法: 然后使用接口调用方法: 上面这些内容可能都会,下面在此

  • 我正在努力学习汇编语言。我注意到它与Java等高级编程语言完全不同。 因此,我了解到数据传输指令遵循以下语法: 我将其视为换句话说,将值分配给内存。 我在《数据段声明》一书中看到了一个示例。 怎么会有 我会很感激任何解释。 谢谢

  • 问题内容: 以下查询将在约22秒内运行: 问题出在 变量赋值上 (实际上是这一行:)。删除作业时,它最多可以加快15毫秒!我通过将结果插入到临时表中解决了这个问题,但我认为这是一种不好的方法。 任何人都可以帮助我解决问题的根源吗? 聚苯乙烯 错误的执行计划(22 s ):https : //www.brentozar.com/pastetheplan/?id=Sy6a4c9bW 良好的执行计划(2

  • 问题内容: 我有交易数据框。每行代表两个项目的交易(可想而知,就像两张事件票之类的交易一样)。我想根据售出的数量重复每一行。 这是示例代码: 这将产生一个看起来像这样的数据框 因此,在上述情况下,每一行将转换为两个重复的行。如果“数量”列为3,则该行将转换为三个重复的行。 问题答案: 首先,我使用整数而不是文本重新创建了您的数据。我还更改了数量,以便可以更轻松地理解问题。 我通过使用嵌套列表理解结

  • 编程最简单的算法之一,莫过于变量交换。交换变量的常见算法需要一个中间变量进行变量的临时保存。用传统方法编写变量交换代码如下: 在计算机刚发明时,内存非常“精贵”。这种变量交换往往是非常奢侈的。于是计算机“大牛”发明了一些算法来避免使用中间变量: 这样的算法很多,但是都有一定的数值范围和类型要求。 到了Go语言时,内存不再是紧缺资源,而且写法可以更简单。使用 Go 的“多重赋值”特性,可以轻松完成变