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数据库和达梦数据库,但是两者的语句在某些场景下不同。
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
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>
在 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_mysql
和 condition_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 的“多重赋值”特性,可以轻松完成变