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

posted @ 2018-09-19 19:09  bug改了我  阅读(9117)  评论(1编辑  收藏  举报