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的相關介紹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM