第二十节 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>
发布了315 篇原创文章 · 获赞 243 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/yanluandai1985/article/details/104013936