第二十節 Mybatis框架MySQL適配Oracle

一、面臨問題

        當前項目的開發全部是基於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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章