SpringBoot+Mybatis——適配支持各種各樣數據庫的方法


使用mybatis的databaseId屬性直接配置多數據庫支持

    注意事項:

        1、本文針對的是多數據庫切換,而非多數據源切換;

        2、本文所使用的方法是在配置文件中配置好需要使用的數據庫,而不是在項目運行以后隨時切換,若要切換數據庫,需要修改配置文件並重啟項目。

    大家閱讀本文前請注意以上兩條事項,確定本文內容是否符合你的功能要求,再決定是否繼續閱讀本文。

    接下來進入正題,首先是數據庫配置,直接按照常規的配法就可以了,例如:

    spring.datasource.url=jdbc:mysql://localhost:3306/demo
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

 

    而要想使用databaseId的話,需要增加一個bean的配置,如下:

    import java.util.Properties;
     
    import org.apache.ibatis.mapping.DatabaseIdProvider;
    import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
     
    @Configuration
    public class BeanConfig {
     
    @Bean
    public DatabaseIdProvider getDatabaseIdProvider() {
    DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
    Properties p = new Properties();
    p.setProperty("DM DBMS", "dm7");
    p.setProperty("MySQL", "mysql");
    databaseIdProvider.setProperties(p);
    return databaseIdProvider;
    }
    }

 

    在這段代碼中,給Properties設置了兩個對象,對應着兩種數據庫,一個是達夢7,一個是mysql。key的值是對應的數據庫的productName,value則是一個自定義的值,你可以取一個你喜歡的名字,這個名字會在mybatis的mapper里面用到。

    而在這里,也要說到文章開頭時說過的問題。使用databaseId來配置多數據庫的方法網上很多,但是我找到的所有文章,都沒有說到,這個Properties的key和value到底是什么意思,有沒有什么規范。而且網上幾乎都是用oracle和mysql來做例子,但沒有提到其他數據庫的配置方法,這就導致我們在使用類似達夢數據庫的時候,完全不知道該怎么配置。后來我找了官方資料,並結合百度到的信息,得出的結論是,Properties的key就是數據庫的productName。既然知道了這一點,后面就好辦了,百度到了數據庫獲取productName的方法后,自然也就可以獲取到達夢數據庫的productName值了,具體方法如下:不僅僅是達夢數據庫,任何數據庫都是這樣獲取的。

    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.DriverManager;
     
    public class Test {
    public static void main(String[] args) throws Exception {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/";
    String username = "root";
    String password = "root";
    Class.forName(driver);
    Connection con = (Connection) DriverManager.getConnection(url,username,password);
    DatabaseMetaData metaData = (DatabaseMetaData) con.getMetaData();
    System.out.println("數據庫的產品名稱:" + metaData.getDatabaseProductName());
    }
    }

 

    

    獲取到了productName,我們就可以在配置類中將我們需要的數據庫配置好,然后再mapper里寫sql時,加上databaseId,例如:

    這樣一來,配置就完成了,啟動項目也可以正常使用了,在最后,還要提一下mybatis對databaseId的處理方式。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     
    <mapper namespace="com.freddy.mfd7.test.UserMapper">
     
    <select id="findUsers" resultType="com.freddy.mfd7.test.UserEntity" databaseId="dm7">
    select * from "demo";
    </select>
     
    <select id="findUsers" resultType="com.freddy.mfd7.test.UserEntity" databaseId="mysql">
    select * from demo;
    </select>
    </mapper>

 

    mybatis在進行mapper注入時,會出現3種情況,該sql的databaseId和當前數據源的databaseId一樣,該sql的databaseId和當前數據源的databaseId不一樣,或者該sql沒有配置databaseId。mybatis裝配時,當同一方法被找到多個sql時,會優先使用databaseId相同的sql,如果沒有databaseId相同的sql,再使用沒有配置databaseId的sql。databaseId不對應的sql是不會使用的。


免責聲明!

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



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