1、databaseIdProvider 简介

MyBatis可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃,如下所示,只会执行上面的一条SQL语句:

<select id="getAllProduct" resultType="product" databaseId="mysql">
         SELECT * FROM product
</select>

<select id="getAllProduct" resultType="product">
         SELECT * FROM product
</select>

为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:

<!--数据库厂商标示 -->
<databaseIdProvider type="DB_VENDOR">
    <property name="Oracle" value="oracle"/>
    <property name="MySQL" value="mysql"/>
</databaseIdProvider>

说明:

(1)databaseIdProvidertype属性是必须的,不配置时会报错。DB_VENDOR这个属性值使用的是VendorDatabaseIdProvider类的别名。

(2)property子元素是配置一个数据库,其中的name属性是数据库名称,value是我们自定义的别名,通过别名我们可以在SQL语句中标识适用于哪种数据库运行。

2、mysql和oracle两种数据库的应用实例

下面,我们就实现mysql的获取系统时间函数now()和oracle的获取系统时间to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) 的分别执行。

2.1、首先配置 mybatis-config.xml

<properties resource="jdbc.properties" />

<environments default="dev">
    <environment id="dev">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="${driver}" />
            <property name="url" value="${url}" />
            <property name="username" value="${username}" />
            <property name="password" value="${password}" />
        </dataSource>
    </environment>
</environments>

<databaseIdProvider type="DB_VENDOR">
    <property name="MySQL" value="mysql" />
    <property name="Oracle" value="oracle" />
</databaseIdProvider>

<mappers>
    <mapper class="cn.mybatis.mapper.TimeMapper" />
</mappers>

2.2、定义接口和mapper xml文件

package cn.mybatis.mapper;

public interface TimeMapper {

    String getTime();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.mybatis.mapper.TimeMapper" >

  <select id="getTime"  resultType="string" databaseId="mysql">
   select  now() from dual 
  </select>

  <select id="getTime"   resultType="string" databaseId="oracle">
   select  'oralce'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  from dual 
  </select>

</mapper>

上面的mapper文件具有相同的id,但是它们的databaseId分别是mysqloralce

2.3、设置配置文件: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

这个配置文件注销了mysql的链接,启用的是oralce的链接

2.4、编写测试类


import cn.mybatis.mysession.SqlSession;
import cn.mybatis.mysession.SqlSessionFactory;
import cn.mybatis.mysession.SqlSessionFactoryBuilder;

public class Test
{
    public static void main(String[] args)
    {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        try
        {
            TimeMapper mapper = (TimeMapper ) session.getMapper(TimeMapper.class);

            System.out.println(mapper.getTime());
        }
        finally
        {
            session.close();
        }
    }
}

结果说明:如果当前启用的是oracle则执行databaseId="oracle"的语句,否则执行databaseId="mysql"的语句。

标签: none

添加新评论