一、databaseIdProvider官方描述
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。
这里什么意思呢 ,如果你仔细看过mybatis的官方文档中关于XML映射文件章节中的 select
为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:
配置
1
这里的 DB_VENDOR 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置 见JDBC-基础。 由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短,如下:
你可以通过实现接口 org.apache.ibatis.mapping.DatabaseIdProvider 并在 mybatis-config.xml 中注册来构建自己的 DatabaseIdProvider:
public interface DatabaseIdProvider {
void setProperties(Properties p);
String getDatabaseId(DataSource dataSource) throws SQLException;
}
1
2
3
4
应用时可以直接通过Configuration的getDatabaseId方法来获取当前数据的供应商。
二、mysql和oracle两种数据库的应用实例
在这里我们就实现mysql的获取系统时间函数 NOW() 和oracle的获取系统时间to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) 的的执行。
首先配置 mybatis-config.xml
public interface dbMapper {
String SelectTime();
}
1
2
3
4
5
6
jdbc.properties文件
#driver=com.mysql.cj.jdbc.Driver
#url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
#username=mybatis
#password=mybatis
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:mybatis
username=mybatis
password=mybatis
maxActive= 50
1
2
3
4
5
6
7
8
9
10
11
12
13
这个配置文件以及注销了mysql的链接,启用的是oralce的链接
测试类
package com.elements.user;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.elements.user.dao.dbMapper;
public class TestDB {
@Test
public void Testdb() throws IOException
{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
dbMapper user = (dbMapper) session
.getMapper(dbMapper.class);
System.out.println(user.SelectTime());
} finally {
session.close();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
结果说明
如果当前启用的是oracle则执行databaseId=”oracle”的语句,如果mysql值执行databaseId=”mysql”的语句
项目代码地址:http://pan.baidu.com/s/1o8rMc5s
---------------------
作者:火柴盒zhang
来源:CSDN
原文:https://blog.csdn.net/likewindy/article/details/51396576