第二十节 SpringBoot项目适配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>

如果本系列文章对你有帮助,不妨请我喝瓶可乐吧!

你的打赏是对我最好的支持!

                    

posted @ 2022-07-17 12:14  小大宇  阅读(439)  评论(0编辑  收藏  举报