mybatis--基础--2.8--xml配置--数据库厂商标识(databaseIdProvider)

mybatis–基础–2.8–xml配置–数据库厂商标识(databaseIdProvider)


代码地址

https://gitee.com/DanShenGuiZu/learnDemo/tree/mysql_mybaties_DB/mybatis-learn-master

1、数据库厂商标识(databaseIdProvider)

  1. 可以根据不同的数据库厂商执行不同的语句。
    1. 比如在公司开发使用的数据库都是PG(Postgresql),但是客户要求使用MySql。
    2. 可以使用databaseIdProvider这个元素实现数据库兼容不同厂商。
  2. 多厂商的支持是基于映射语句中的databaseId属性

1.1、databaseId属性

在这里插入图片描述

  1. MyBatis会加载带有匹配当前数据库databaseId属性和所有不带databaseId属性的语句。如果同时找到带有databaseId和不带databaseId的相同语句,则后者会被舍弃。
  2. 使用多数据库SQL时需要配置databaseIdProvider属性。
    1. 当databaseId属性被配置的时候,系统会优先获取和数据库配置一致的SQL,
    2. 否则取没有配置databaseId的SQL,可以把它当默认值;
    3. 如果还是取不到,就会抛出异常。

2、配置支持多厂商特性

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>
  1. databaseIdProvider 的type属性是必须的,不配置时会报错
  2. property子元素是配置一个数据库
    1. name:数据库名称
    2. value:数据库别名
      1. 实现一种功能,数据库别名和真实数据库名称一一映射关系,通过别名,找到真正的数据库名称。
      2. 好处:真实情况数据库名称很长,通过设置数据库别名来使其变短

2.1、案例

在这里插入图片描述

在这里插入图片描述

我们当前使用的是mysql数据库,假设客户要使用oracle数据,我们应该修改sql 语句 databaseId=“oracle”

3、构建自己的 DatabaseIdProvider

  1. 实现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>

	<!--&lt;!&ndash;数据库厂商标示 &ndash;&gt;-->
	<!--<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;
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值