databaseIdProvider元素主要是为了支持不同厂商的数据库,比如有时候我们在公司内部开发使用的数据库都是PG(Postgresql),但是客户要求使用MySql,那就麻烦了是吧?其实在mybatis中我们可以使用databaseIdProvider这个元素实现数据库兼容不同厂商,即配置多中数据库。

看一下配置方式:

  1. <!--数据库厂商标示 -->
  2. <databaseIdProvider type="DB_VENDOR">
  3. <property name="Oracle" value="oracle"/>
  4. <property name="MySQL" value="mysql"/>
  5. <property name="DB2" value="d2"/>
  6. </databaseIdProvider>

1⃣️databaseIdProvider的type属性是必须的,不配置时会报错。上面这个属性值使用的是VendorDatabaseIdProvider类的别名,这个可以参考我之前写的文章https://www.cnblogs.com/hellowhy/p/9668096.html中系统别名打印结果查看。

2⃣️property子元素是配置一个数据库,其中的name属性是数据库名称,value是我们自定义的别名,通过别名我们可以在SQL语句中标识适用于哪种数据库运行。如果不知道数据库名称,我们可以通过以下代码获取:

  1. /**
  2. * 获取数据库名称
  3. */
  4. public static void getDbInformation() {
  5. SqlSession sqlSession = null;
  6. Connection connection = null;
  7. try {
  8. sqlSession = getSqlSession();
  9. connection = sqlSession.getConnection();
  10. String dbName = connection.getMetaData().getDatabaseProductName();
  11. String dbVersion = connection.getMetaData().getDatabaseProductVersion();
  12. System.out.println("数据库名称是:" + dbName + ";版本是:" + dbVersion);
  13. } catch (SQLException e) {
  14. e.printStackTrace();
  15. }
  16. }

下面我们就可以在自己的sql语句中使用属性databaseId来标示数据库类型了。如下:

  1. <select id="getAllProduct" resultType="product" databaseId="mysql">
  2. SELECT * FROM product
  3. </select>

注意⚠️:在上面的SQL中,我配置的databaseId是mysql,但是我的实际的数据库是pg,看一下执行结果:

可以看到,当数据库名称与实际配置不符时会抛出异常,所以我的配置应该是这样的:

1、在数据库厂商配置中增加postgresql的配置

  1. <!--数据库厂商标示 -->
  2. <databaseIdProvider type="DB_VENDOR">
  3. <property name="Oracle" value="oracle"/>
  4. <property name="MySQL" value="mysql"/>
  5. <property name="DB2" value="d2"/>
  6. <property name="PostgreSQL" value="pg"/>
  7. </databaseIdProvider>

2、在SQL中通过别名标识适用的数据库

  1. <select id="getAllProduct" resultType="product" databaseId="pg">
  2. SELECT * FROM product
  3. </select>

这样就能获取正确结果了。除上述方法之外,我们还可以不在SQL中配置databaseId,这样mybatis会使用默认的配置,也是可以成功运行的。

通过上面的实践知道了:使用多数据库SQL时需要配置databaseIdProvider 属性。当databaseId属性被配置的时候,系统会优先获取和数据库配置一致的SQL,否则取没有配置databaseId的SQL,可以把它当默认值;如果还是取不到,就会抛出异常。

同之前介绍的配置类似,除了系统自定义的标识外,我们也可以自定义一个规则,需要实现MyBatis提供的DatabaseIdProvider接口,如下:

  1. /**
  2. * 自定义一个数据库标示提供类,实现DatabaseIdProvider接口
  3. *
  4. * @author hyc
  5. *
  6. */
  7. public class MyDatabaseIdProvider implements DatabaseIdProvider {
  8. private static final String DATABASE_MYSQL = "MySQL";
  9. private static final String DATABASE_POSTGRESQL = "PostgreSQL";
  10. private static final String DATABASE_ORACLE = "Oracle";
  11. private static final String DATABASE_DB2 = "DB2";
  12.  
  13. @Override
  14. public void setProperties(Properties p) {
  15. System.out.println(p.getProperty("Oracle"));
  16. }
  17.  
  18. @Override
  19. public String getDatabaseId(DataSource dataSource) throws SQLException {
  20. Connection conn = dataSource.getConnection();
  21. String dbName = conn.getMetaData().getDatabaseProductName();
  22. String dbAlias = "";
  23. switch (dbName) {
  24. case DATABASE_MYSQL:
  25. dbAlias = "mysql";
  26. break;
  27. case DATABASE_POSTGRESQL:
  28. dbAlias = "pg";
  29. break;
  30. case DATABASE_ORACLE:
  31. dbAlias = "oracle";
  32. break;
  33. case DATABASE_DB2:
  34. dbAlias = "db2";
  35. break;
  36. default:
  37. break;
  38. }
  39. return dbAlias;
  40. }

然后在databaseIdProvider中做如下配置:

  1. <!--数据库厂商标示 -->
  2. <databaseIdProvider type="com.daily.objectfactory.MyDatabaseIdProvider" />

property属性可以不做配置了,其他都一样。

以上就是数据库厂商标识databaseIdProvider的相关介绍。

MyBatis配置文件(八)--databaseIdProvider数据库厂商标识的更多相关文章

  1. 【Mybatis】MyBatis配置文件的使用(二)

    本例在[Mybatis]MyBatis快速入门(一)基础上继续学习XML映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti ...

  2. 02.MyBatis配置文件详解

        MyBatis入参考文档:http://mybatis.org/mybatis-3/zh/  1.properties 属性 1.在MyBatis配置文件中引用属性文件     MyBatis ...

  3. MyBatis配置文件之概述

    MyBatis配置文件所有元素 <?xml version="1.0" encoding="UTF-8"?> <configuration&g ...

  4. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  5. Mybatis(一):MyBatis配置文件config.xml详解

    MyBatis 配置文件基本结构 在使用mybatis框架时,首先导入其对应的jar包,并进行相应的配置,所以得对配置文件的每个参数都得了解.一个完全的mybatis配置文件结构如下: <?xm ...

  6. Mybatis配置文件

    XML 映射配置文件 MyBatis 的配置文件包含了设置(settings)和属性(properties)信息. properties 这些属性都是可外部配置且可动态替换的,既可以在典型的 Java ...

  7. 详解mybatis配置文件

    在前面两篇文章中,大致与大家分享了基于Java的ORM框架,Mybatis基本架构和Mybatis实现CRUD的基本原理与流程,在本篇文章中,继续与大家分享Mybatis配置文件. 通过研究Mybat ...

  8. Spring+Mybatis+Mysql搭建分布式数据库访问框架

    一.前言 用Java开发企业应用软件, 经常会采用Spring+MyBatis+Mysql搭建数据库框架.如果数据量很大,一个MYSQL库存储数据访问效率很低,往往会采用分库存储管理的方式.本文讲述如 ...

  9. MyBatis配置文件(一)――properties属性

    MyBatis配置文件中有很多配置项,这些配置项分别代表什么,有什么作用,需要理一下了.先通过下面这个例子来看都有哪些配置项 <?xml version="1.0" enco ...

随机推荐

  1. 尚学linux课程---4、linux网络配置及linux文件

    尚学linux课程---4.linux网络配置及linux文件 一.总结 一句话总结: linux下的etc目录是配置文件的目录,所以很多的文件配置操作都可以看到它的身影:比如 init系列命名,比如 ...

  2. VS2010-MFC(MFC常用类:定时器Timer)

    转自:http://www.jizhuomi.com/software/232.html 前面一节讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考 ...

  3. 详解JDBC与Hibernate区别

    详解JDBC与Hibernate区别 引用地址:http://www.cnblogs.com/JemBai/archive/2011/04/13/2014940.html 刚开始学习JAVA时,认为H ...

  4. 第四周——重新clone项目后maven问题

    重新clone项目后,一直报错,"类重复..." clean后install也无效果. 原因是idea在重启项目时会更改maven为默认的idea自带的maven配置,要重新设置

  5. uoj#370【UR #17】滑稽树上滑稽果

    题目 低智选手果然刷不动uoj 首先考虑一下构造一棵树显然是骗你玩的,按位与这个东西越做越小,挂到链的最下面显然不会劣于挂到之前的某一个点下面,所以我们只需要求一个排列使得答案最小就好了 设\(A=\ ...

  6. Django static静态配置文件

    对于Django来说静态文件一般交由Web服务器处理,Django本身不处理静态文件.为了使Django开发环境能够处理静态文件,Django有和生产环境不同的静态文件配置方式. Django 版本: ...

  7. ADS 下 flash 烧写程序原理及结构

    本原理:在 windows 环境下借助 ADS 仿真器将在 SDRAM 中的一段存储区域中的数据写到 Nand flash 存 储空间中.烧写程序在纵向上分三层完成: 第一层: 主烧写函数(完成将在 ...

  8. Luogu P4158 [SCOI2009]粉刷匠(dp+背包)

    P4158 [SCOI2009]粉刷匠 题意 题目描述 \(windy\)有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能 ...

  9. uoj33 树上GCD

    题意:给你一棵树,根节点为1,每条边长度为1.定义f(u,v)=gcd(u-lca(u,v),lca(u,v)-v),求有多少个无序点对f(u,v)=i.对每个i输出答案. n<=20W. 标程 ...

  10. P3718 [AHOI2017初中组]alter

    贪心+二分答案 二分最终答案长度 主要问题在check上 ~~我代码写得巨丑,大家还是不要看我的代码了~~ ------------ 1:当mid大于1的时候,贪心策略是这样的: 当前连续的长度大于m ...