一、博客背景
当你的项目需要兼容多种数据库,当你在mapper接口中定义一个方法时,你的xml中需要有一个id为你的方法名的标签实现语句,但是在一个xml中id只能唯一,但是你又需要兼容多个数据库,这时你要怎么处理。
有两种方法可以处理
1.在mapper中定义多个方法,分别对应不同的数据库,xml针对不同的方法写sql,这样就不会存在id冲突的情况了
2.在mapper文件中定义一个方法,xml中使用多个id相同的sql语句,且用databaseId标识,这样同样可以解决上面的问题,下面就来讲解具体的用法
二、使用详解
代码中设置多数据库支持的bean
@Bean
public DatabaseIdProvider getDatabaseIdProvider() {
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.setProperty("Oracle", "oracle");
properties.setProperty("MySQL", "mysql");
properties.setProperty("DB2", "db2");
properties.setProperty("SQL Server", "sqlserver");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
配置文件中设置好,需要使用的数据库
#database.type=mysql
database.type=oracle
mybatis-plus.configuration.database-id=${database.type}
设置完之后,一个xml中就可以写多个id相同的sql了,如下所示
mapper接口文件定义
int getMtHisTableExists(@Param("dbName") String dbName, @Param("tableName") String tableName);
xm实现sql
<!-- 查看某表是否存在 -->
<select id="getMtHisTableExists" resultType="java.lang.Integer">
select count(*) ICOUNT from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA=#{dbName} and TABLE_NAME=upper(#{tableName})
</select>
<!-- oracle方言查看某表是否存在 -->
<select id="getMtHisTableExists" resultType="java.lang.Integer" databaseId="oracle">
SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=upper(#{tableName})
</select>
<!-- sqlserver方言查看某表是否存在 -->
<select id="getMtHisTableExists" resultType="java.lang.Integer" databaseId="sqlserver">
select count(*) from dbo.sysobjects where id = object_id(upper(#{tableName})) and OBJECTPROPERTY(id, N'IsUserTable') = 1
</select>
上面的三条语句中两条设置了databaseId值,一条并未设置值。而databaseId的值与上面java代码中bean的配置的value值要一样。
databaseId值为oracle表示:当数据库连接为oracle数据库时,该语句才会被执行,如果此时项目使用的是mysql数据则该条语句不会被执行。
没有设置databaseId表示:无论当前连接的什么数据库,该条语句都能被使用。但是如上面这种情况,如果使用的oracle数据库则databaseId=oracle且id为getMtHisTableExists的语句可以执行,而同时id也是getMtHisTableExists且没指定的databaseId的语句也可以被执行。这时系统将执行指定更加精确的databaseId=oracle且id为getMtHisTableExists的语句