zoukankan      html  css  js  c++  java
  • MyBatis配置文件(八)--databaseIdProvider数据库厂商标识

    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的相关介绍。

  • 相关阅读:
    uniapp解决图形验证码问题及arraybuffer二进制转base64格式图片
    uni-app图片上传接口联调
    Redis与Mysql双写一致性方案解析(转载)
    python 3 for循环倒序、一组数据参数解包
    python使用for循环打印直角三角形、菱形、乘法口诀,1至100的和、奇数和、偶数和
    使用jmeter做接口测试,简单实例
    python发送无参数get请求
    python的第三方库unittestreport 详细功能使用文档(V1.1.1)-转载
    python 3 发送邮件(转载)
    python使用apscheduler执行定时任务时报错:Run time of job "pr (trigger: cron[minute='25'], next run at: 2021-05-05 22:25:00 CST)" was missed by 0:00:01.185258
  • 原文地址:https://www.cnblogs.com/hellowhy/p/9676037.html
Copyright © 2011-2022 走看看