一、面臨問題
當前項目的開發全部是基於MySQL5.7。最近項目需要技術支持另外一所高校,學校使用的生產數據庫是Oracle11。因此,昨天我使用Docker安裝了Oracle11。項目組裏的另外一位大佬引進了一項技術,並且講述了原理。這裏我也記下基本使用情況。具體原理以後再弄。
我這裏的代碼展示瞭如何同時支持Oracle與MySQL數據庫。
步驟非常簡單。分爲兩步。
第一步就是爲系統添加一個配置。源代碼加載過程我就不貼了。
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Configuration
public class DateSourceConfg {
/**
* 自動識別使用的數據庫類型
* 在mapper.xml中databaseId的值就是跟這裏對應,
* 如果沒有databaseId選擇則說明該sql適用所有數據庫
*/
@Bean
public DatabaseIdProvider getDatabaseIdProvider() {
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.setProperty("Oracle", "oracle");
properties.setProperty("MySQL", "mysql");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
}
第二步,在Mybatis的XML中,爲某個具體的SQL語句添加databaseId標籤。如下,假設我有兩個Id相同的SQL語句。以前的話,就會報Id重複的錯。現在,如果數據源是Mysql驅動,那麼就會訪問databaseId爲mysql的SQL語句。如果是Oracle驅動,那麼Mybatis就訪問databaseId爲oracle的SQL語句。
<select id="getUserById" databaseId="mysql"
parameterType="java.lang.Long" resultType="com.tyzhou.login.model.User">
select
id,
username,
age
,now() currentTime
from t_user
where id = #{id,jdbcType=BIGINT}
</select>
<select id="getUserById" databaseId="oracle"
parameterType="java.lang.Long" resultType="com.tyzhou.login.model.User">
select
id,
username,
age,
sysdate currentTime
from t_user
where id = #{id,jdbcType=BIGINT}
</select>