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