第二十节 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>
如果本系列文章对你有帮助,不妨请我喝瓶可乐吧!
你的打赏是对我最好的支持!