美文网首页
多数据库执行不同SQL语句的支持

多数据库执行不同SQL语句的支持

作者: 问瑾遗 | 来源:发表于2019-04-06 21:48 被阅读0次

相关文章:配置多个environment环境

在一个项目中如果要支持多个不同厂商的数据库,怎么办?
首先,连接不同数据库的驱动要有。
配置文件mybatis-config.xml的代码如下:

<?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>
    <!--属性文件配置-->
    <properties resource="db.properties"></properties>
    <!--默认使用id="mysql1"的environment-->
    <environments default="mysql">
        <!--环境配置一-->
        <environment id="mysql">
            <!--事务管理配置-->
            <transactionManager type="JDBC"/>
            <!--数据源配置-->
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
        
        <!--环境配置二-->
        <environment id="oracle">
            <!--事务管理配置-->
            <transactionManager type="JDBC"/>
            <!--数据源配置-->
            <dataSource type="POOLED">
                <property name="driver" value="${oracle.driver}"/>
                <property name="url" value="${oracle.url}"/>
                <property name="username" value="${oracle.username}"/>
                <property name="password" value="${oracle.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--不同厂商数据库配置-->
    <databaseIdProvider type="DB_VENDOR">
        <!--name代表数据库的产品名称,区分大小写,不能随便填写-->
        <!--value代表这个数据库的产品名称的别名,可以随便起名,但尽量命名的有意义-->
        <property name="MySQL" value="yyyMySQL"/>
        <property name="Oracle" value="xxxOracle"/>
    </databaseIdProvider>
    
    <mappers>
        <!--这里的resource对应上一步自动生成的mapping/UserinfoMapper.xml文件-->
        <mapper resource="mapping/UserinfoMapper.xml"/>
    </mappers>
</configuration>

不同厂商数据库的SQL语句也不尽然相同,xxxMapper.xml映射文件配置如下:

<?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="mapping.UserinfoMapper">
    <!--以下两个select的id相同,databaseId的值为上一步databaseIdProvider中配置的数据库别名-->
    <select id="getAllUserinfo" resultType="userinfo" databaseId="xxxOracle">
    Oracle SQL语句
    </select>
    <select id="getAllUserinfo" resultType="userinfo" databaseId="yyyMySQL">
    MySQL SQL语句
    </select>
</mapper>

这样,在不同的SQL映射上引用不同的数据库别名xxxOracle和yyyMySQL,就可以达到SQL映射的id值一样,但在不同的数据库中可以执行不同的SQL语句的目的了。
如何在java代码中获取不同厂商数据库产品的名称呢?代码如下:

factory.getConfiguration().getEnvironment().getDataSource()
.getConnection().getMetaData().getDatabaseProductName();

相关文章

网友评论

      本文标题:多数据库执行不同SQL语句的支持

      本文链接:https://www.haomeiwen.com/subject/oyediqtx.html