相关文章:配置多个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();