MyBatis基础篇之如何通过databaseIdProvider属性支持多数据库

一、前言

MyBatis可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的databaseId属性。MyBatis会加载不带databaseId属性和带有匹配当前数据库databaseId属性的所有语句。如果同时找到带有databaseId和不带databaseId的相同语句,则后者会被舍弃。为支持多厂商特性只要像下面这样在mybatis-config.xml文件中加入databaseId即可。

<databaseIdProvider type="DB_VENDOR" />

DB_VENDOR 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。 由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短,如下:

<databaseIdProvider type="DB_VENDOR">
	<!-- 为不同的数据库厂商起别名 -->
	<property name="MySQL" value="mysql"/>
	<property name="Oracle" value="oracle"/>
	<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>

在有 properties 时,DB_VENDOR databaseIdProvider 的将被设置为第一个能匹配数据库产品名称的属性键对应的值,如果没有匹配的属性将会设置为“null”。 在这个例子中,如果 getDatabaseProductName() 返回“Oracle (DataDirect)”,databaseId 将被设置为“oracle”。
你可以通过实现接口 org.apache.ibatis.mapping.DatabaseIdProvider 并在 mybatis-config.xml 中注册来构建自己的 DatabaseIdProvider:

public interface DatabaseIdProvider {
       void setProperties(Properties p);
       String getDatabaseId(DataSource dataSource) throws SQLException;
}

二、步骤

♦拷贝<<MyBatis基础篇之使用typeAliases别名>>本篇文章的代码,搭建工程MyBatisDBProviderDemo,完整目录结构如下:
MyBatis基础篇之如何通过databaseIdProvider属性支持多数据库的照片 - 1

♦为了支持多数据库,我们首先修改mybatis-config.xml文件,添加以下配置

<databaseIdProvider type="DB_VENDOR">
	<!-- 为不同的数据库厂商起别名 -->
	<property name="MySQL" value="mysql" />
	<property name="Oracle" value="oracle" />
	<property name="SQL Server" value="sqlserver" />
</databaseIdProvider>

♦同时还要修改environments环境配置,增加数据源配置,默认现在使用的mysql开发环境

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

♦修改db.properties文件,增加Oracle数据源连接信息

oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@localhost:1521:orcl
oracle.username=SCOTT
oracle.password=SCOTT

<<MyBatis基础篇之使用typeAliases别名>>工程原先是基于MySQL的,现在有针对Oracle,需要在POM文件中增加Oracle数据库的相关依赖信息。

<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc14</artifactId>
	<version>10.2.0.1.0</version>
</dependency>

♦在Oracle数据库下新建一张数据库表t_user,并插入几条数据

CREATE TABLE t_user (
  id varchar(50) NOT NULL,
  loginId varchar(20) DEFAULT NULL,
  userName varchar(100) DEFAULT NULL,
  role varchar(255) DEFAULT NULL,
  note varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
);
INSERT INTO t_user VALUES ('1', 'Sabot_oracle', '萨博_oracle', '革命军_oracle', '革命军的二号人物,同艾斯一样,为蒙奇·D·路飞的哥哥(义兄)。');
INSERT INTO t_user VALUES ('10', 'Gol.D.Roger_oracle', '哥尔·D·罗杰_oracle', '海贼王_oracle', '【船长】“海贼王”哥尔·D·罗杰(已故)');

♦接着UserMapper.xml文件也要做如下修改
如果环境配置的MySQL,映射文件中SQL语句写法

<select id="findUserById" resultType="user" databaseId="mysql">
	select id, loginId, userName, role, note from t_user where id = #{id}
</select>

如果环境配置的Oracle,映射文件中SQL语句写法

<select id="findUserById" resultType="user" databaseId="oracle">
	select id, loginId, userName, role, note from t_user where id = #{id}
</select>

dababaseId就是你在mybatis-config.xml文件中配置的别名。

♦打开MyBatisTest测试,控制台打印如下:

2017-07-30 14:57:59,814 [main] [com.queen.mybatis.mapper.UserMapper.findUserById]-[DEBUG] <==      Total: 1
User [id=1, loginId=Sabot, userName=萨博, role=革命军, note=革命军的二号人物,同艾斯一样,为蒙奇·D·路飞的哥哥(义兄)。]
2017-07-30 14:57:59,816 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@43523784]

修改environments,将default修改成dev_oracle,再次执行一下,控制台打印如下:

2017-07-30 15:02:47,272 [main] [com.queen.mybatis.mapper.UserMapper.findUserById]-[DEBUG] <==      Total: 1
User [id=1, loginId=Sabot_oracle, userName=萨博_oracle, role=革命军_oracle, note=革命军的二号人物,同艾斯一样,为蒙奇·D·路飞的哥哥(义兄)。]
2017-07-30 15:02:47,273 [main] [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-[DEBUG] Resetting autocommit to true on JDBC Connection [oracle.jdbc.driver.T4CConnection@49b880ae]

两次查询到的数据不一样,说明配置成功。
至此,MyBatis基础篇之如何通过databaseIdProvider属性支持多数据库介绍完毕,需要大家动手实践一下。

博客地址:http://www.marsitman.com/mybatis/mybatis-dbprovider.html
版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。

 

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!






文件名称:MyBatis基础篇之如何通过databaseIdProvider属性支持多数据库

更新日期:2017-07-30

作者信息:榕瑾

提示:下载后请检查MD5值,欢迎捐赠本站以及广告合作!

下载地址:点击下载 【文件大小:18 KB】

点赞
  1. 陈城说道:

    如何在spring boot 中使用呢?

  2. 阿信sxq说道:

    赞一个吧

发表评论

电子邮件地址不会被公开。 必填项已用*标注