mybatis 多数据库支持

本文介绍了如何使用MyBatis的databaseIdProvider标签来实现多数据库支持。通过设置statement的databaseId属性和配置databaseIdProvider,可以根据当前数据库类型选择执行相应的SQL,解决了在不同数据库环境下需要编写不同SQL的问题。详细解释了databaseId的工作原理,包括通过DatabaseMetadata获取数据库产品名进行匹配。
摘要由CSDN通过智能技术生成

使用databaseIdProvider标签实现多数据库支持

当应用需要支持不同数据库产商,并且依赖了不同数据库特有的函数或者语法时,我们通常需要书写2套或以上是SQL来支持不同的场景。

场景

  • 获取数据库时间:Oracle使用sysdate,而MySQL使用now()
  • 获取列表:Oracle 12c后使用listagg(),而MySQL使用group_concat()
  • 其他场景…

一些可能的方案

假设没有<databaseIdProvider/>标签的情况下,我们可以如何实现我们的需求?我们用获取列表的场景来展示:

  1. 使用不同的statemetnId区分不用数据库的SQL,缺点是API会十分臃肿
  • AccountMapper.xml
<!-- oracle use listagg -->
<select id="listAccountWithOracle" resultType="hashmap">
    select owner, listagg(name, ',') as accounts from account group by owner
</select>

<!-- mysql use group_concat -->
<select id="listAccountWithMySQL" resultType="hashmap">
    select owner, group_concat(name) as accounts from account group by owner
</select>
  • AccountMapper.java
public interface AccountMapper {
   
	/**
	 * support oracle listagg function
	 * 
	 * @return list of owner and its accounts
	 */
	List<Map<String, Object>> listAccountWithOracle();

	/**
	 * support mysql group_concat function
	 * 
	 * @return list of owner and its accounts
	 */
	List<Map<String, Object>> listAccountWithMySQL();
}
  1. 定义2套mapper.xml来区分,保持API简洁,缺点是需要手动转换以加载不同的mapper文件,而且通用的语句也需要复制一份到不同的mapper文件中
  • AccountMySQLMapper.xml
<!-- 省略其他的statement -->
<select 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值