mybatis–基础–2.8–xml配置–数据库厂商标识(databaseIdProvider)
代码地址
https://gitee.com/DanShenGuiZu/learnDemo/tree/mysql_mybaties_DB/mybatis-learn-master
1、数据库厂商标识(databaseIdProvider)
- 可以根据不同的数据库厂商执行不同的语句。
- 比如在公司开发使用的数据库都是PG(Postgresql),但是客户要求使用MySql。
- 可以使用databaseIdProvider这个元素实现数据库兼容不同厂商。
- 多厂商的支持是基于映射语句中的databaseId属性
1.1、databaseId属性
- MyBatis会加载带有匹配当前数据库databaseId属性和所有不带databaseId属性的语句。如果同时找到带有databaseId和不带databaseId的相同语句,则后者会被舍弃。
- 使用多数据库SQL时需要配置databaseIdProvider属性。
- 当databaseId属性被配置的时候,系统会优先获取和数据库配置一致的SQL,
- 否则取没有配置databaseId的SQL,可以把它当默认值;
- 如果还是取不到,就会抛出异常。
2、配置支持多厂商特性
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
- databaseIdProvider 的type属性是必须的,不配置时会报错
- property子元素是配置一个数据库
- name:数据库名称
- value:数据库别名
- 实现一种功能,数据库别名和真实数据库名称一一映射关系,通过别名,找到真正的数据库名称。
- 好处:真实情况数据库名称很长,通过设置数据库别名来使其变短
2.1、案例
我们当前使用的是mysql数据库,假设客户要使用oracle数据,我们应该修改sql 语句 databaseId=“oracle”
3、构建自己的 DatabaseIdProvider
- 实现DatabaseIdProvider接口
3.1、代码
<?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.cl.mybatis.learn.day11.UserMapper">
<select id="selectById" resultType="user" databaseId="mysql222">
select * from user where id = #{id}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!-- 使用包名 -->
<package name="com.cl.mybatis.learn.day11"/>
</typeAliases>
<environments default="development1">
<environment id="development1">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://zhoufei.ali.db.com:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--<!–数据库厂商标示 –>-->
<!--<databaseIdProvider type="DB_VENDOR">-->
<!--<property name="Oracle" value="oracle"/>-->
<!--<property name="MySQL" value="mysql222"/>-->
<!--<property name="DB2" value="d2"/>-->
<!--<property name="PostgreSQL" value="pg"/>-->
<!--</databaseIdProvider>-->
<!--数据库厂商标示 -->
<databaseIdProvider type="com.cl.mybatis.learn.day11.MyDatabaseIdProvider">
<property name="Oracle" value="oracle"/>
<property name="MySQL" value="mysql222"/>
<property name="DB2" value="d2"/>
<property name="PostgreSQL" value="pg"/>
</databaseIdProvider>
<mappers>
<mapper resource="day11/UserMapper.xml"/>
</mappers>
</configuration>
package com.cl.mybatis.learn.day11;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
*
* 自定义一个数据库标示提供类,实现DatabaseIdProvider接口
*
* @return
* @author feizhou
* @since 2020/10/17 20:19
*/
public class MyDatabaseIdProvider implements DatabaseIdProvider {
Properties p;
@Override
public void setProperties(Properties p){
System.out.println("要设置的属性:" + p);
// 通过p来设置数据库别名
this.p = p;
}
@Override
public String getDatabaseId(DataSource dataSource)throws SQLException {
Connection conn = dataSource.getConnection();
//真实数据库名称
String dbName = conn.getMetaData().getDatabaseProductName();
//别名
String dbAlias = "";
Set<Map.Entry<Object, Object>> entries = p.entrySet();
for(Map.Entry<Object, Object> entry : entries){
String dbName1 =(String)entry.getKey();
String dbAlias1 =(String)entry.getValue();
if(dbName.equals(dbName1)){
dbAlias = dbAlias1;
break;
}
}
return dbAlias;
}
}