返回介绍

3.8 databaseIdProvider 数据库厂商标识

发布于 2025-04-26 13:08:33 字数 3254 浏览 0 评论 0 收藏

在相同数据库厂商的环境下,数据库厂商标识没有什么意义,在实际的应用中使用得比较少,因为使用不同厂商数据库的系统还是比较少的。MyBatis 可能会运行在不同厂商的数据库中,它为此提供一个数据库标识,并提供自定义,它的作用在于指定 SQL 到对应的数据库厂商提供的数据库中运行。

3.8.1 使用系统默认规则

MyBatis 提供默认的配置规则,如代码清单 3-30 所示。

代码清单 3-30:使用默认数据库标签

<databaseIdProvider type="DB_VENDOR">
        <property name="SQL Server" value="sqlserver"/>
        <property name="MySQL" value="mysql"/>
        <property name="DB2" value="db2"/>        
        <property name="Oracle" value="oracle" />
</databaseIdProvider>

type="DB_VENDOR"是启动 MyBatis 内部注册的策略器。首先 MyBatis 会将你的配置读入 Configuration 类里面,在连接数据库后调用 getDatabaseProductName() 方法去获取数据库的信息,然后用我们配置的 name 值去做匹配来得到 DatabaseId。我们把这些配置到我们的例子里,而我们的例子使用的正是 MySQL 数据库。这个时候,我们可以用下面的代码来获得数据库的 ID,显然结果就是 MySQL。

sqlSessionFactory.getConfiguration().getDatabaseId();

我们也可以指定 SQL 在哪个数据库厂商执行,我们把 Mapper 的 XML 配置修改一下,如代码清单 3-31 所示。

代码清单 3-31:定义数据库标签

<select parameterType="string" id="getRole" resultType="role" databaseId= "mysql">
    select role_no as roleNo, role_name as roleName, note from t_role 
    where role_no =#{roleNo, javaType=String, jdbcType=VARCHAR}
</select>

在多了一个 databaseId 属性的情况下,MyBatis 将提供如下规则。

  • 如果没有配置 databaseIdProvider 标签,那么 databaseId 就会返回 null。

  • 如果配置了 databaseIdProvider 标签,MyBatis 就会用配置的 name 值去匹配数据库信息,如果匹配得上就会设置 databaseId,否则依旧为 null。

  • 如果 Configuration 的 databaseId 不为空,则它只会找到配置 databaseId 的 SQL 语句。

  • MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。

3.8.2 不使用系统默认规则

MyBatis 也提供规则允许自定义,我们只要实现 databaseIdProvider 接口,并且实现配置即可,下面我们来看一个实例。

首先,写好我们自定义的规则类,如代码清单 3-32 所示。

代码清单 3-32:MydatabaseIdProvider.java

package com.learn.chapter3.databaseIdprovider;

import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.mapping.DatabaseIdProvider;
public class MydatabaseIdProvider implements DatabaseIdProvider{

    private Properties properties = null;
    
    @Override
    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public String getDatabaseId(DataSource ds) throws SQLException {
        String dbName = ds.getConnection().getMetaData().getDatabaseProductName();
        String dbId = (String)this.properties.get(dbName);
        return dbId;
    }
    
}

其次,注册这个类到 MyBatis 上下文环境中,我们这样配置 databaseIdProvider 标签,如代码清单 3-33 所示。

代码清单 3-33:配置 databaseIdProvider

<databaseIdProvider type="com.learn.chapter3.databaseIdprovider.MydatabaseIdProvider">
        <property name="SQL Server" value="sqlserver"/>
        <property name="MySQL" value="mysql"/>
        <property name="DB2" value="db2"/>        
        <property name="Oracle" value="oracle" />
</databaseIdProvider>

我们把 type 修改为我们自己实现的类,类里面 setProperties 方法的参数传递进去的将会是我们在 XML 里面配置的信息,我们保存在类的变量 properties 里,方便以后读出。在方法 getDatabaseId 中,传递的参数是数据库数据源,我们获取其名称,然后通过 properties 的键值找到对应的 databaseId。

如有特殊的要求,我们可以根据自己所需要的规则来编写 databaseIdProvider。配置 Mapper、使用规则和默认规则是一致的。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。