MyBatis配置多数据库

MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。例如,你也许为开发要设置不同的配置,测试和生产环境。或者你可能有多种生产级数据库却共享相同的模式,所以你会想对不同数据库使用相同的 SQL 映射。这种用例是很多的。一个很重要的问题要记得:你可以配置多种环境,但你只能为每个 SqlSessionFactory实例选择一个。所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,你就需要三个实例,以此类推。记忆起来很简单: 每个数据库对应一个 SqlSessionFactory,为了明确创建哪种环境,你可以将它作为可选的参数传递给 SqlSessionFactoryBuilder。
可以接受环境配置的两个方法签名是:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory  factory  =  sqlSessionFactoryBuilder.build(reader, environment,properties);
如果环境被忽略,那么默认环境将会被加载,如下进行:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
环境元素定义了如何配置环境。
<environments default="development">
 <environment id="development">
  <transactionManager type="JDBC">
   <property name="..." value="..."/>
  </transactionManager>
  <dataSource type="POOLED">
   <property name="driver" value="${driver}"/>
   <property name="url" value="${url}"/>
   <property name="username" value="${username}"/>
   <property name="password" value="${password}"/>
  </dataSource>
 </environment>
</environments>


注意这里的键:
        1   默认的环境 ID(比如:default=”development”)。
2  每个 environment 元素定义的环境 ID(比如:id=”development”)。
覆盖配置类除了用插件来修改 MyBatis 核心行为之外,你也可以完全覆盖配置类。简单扩展它,然后覆盖其中的任意方法,之后传递它sqlSessionFactoryBuilder.build(myConfig) 方法的调用。这可能会严重影响 MyBatis 的行为,所以要小心。 
3  事务管理器的配置(比如:type=”JDBC”)。

4  数据源的配置(比如:type=”POOLED”)。

默认的环境和环境 ID 是自我解释的。你可以使用你喜欢的名称来命名,只要确定默认的要匹配其中之一


测试时我使用了MySql,Sqlserver,Oracle三个数据库,以MySql为默认数据库,如下:

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/company
mysql.username=root
mysql.password=xiaohu

sqlserver.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
sqlserver.url=jdbc:sqlserver://127.0.0.1:1434;database=company
sqlserver.username=sa
sqlserver.password=xiaohu

oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
oracle.username=scott
oracle.password=xiaohu

主配置文件:mybatis/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="jdbc.properties"/>
	
	<!-- 配置类别名 -->
	<typeAliases>
		<typeAlias alias="Emp" type="com.tenghu.mybatis.model.Emp"/>
		<typeAlias alias="Dept" type="com.tenghu.mybatis.model.Dept"/>
	</typeAliases>
	
	<environments default="development">
		<!-- 默认MySq -->
		<environment id="development">
			<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>
		
		<!-- Sqlserver数据库 -->
		<environment id="sqlserver">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="${sqlserver.driver}"/>
				<property name="url" value="${sqlserver.url}"/>
				<property name="username" value="${sqlserver.username}"/>
				<property name="password" value="${sqlserver.password}"/>
			</dataSource>
		</environment>
		
		<!-- Oracle -->
		<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>
	
	<!-- 配置映射文件 -->
	<mappers>
		<mapper resource="com/tenghu/mybatis/mapper/DeptMapper.xml"/>
		<mapper resource="com/tenghu/mybatis/mapper/EmpMapper.xml"/>
	</mappers>
</configuration>

打开SqlSession工具类MyBatiUtil.java:

package com.tenghu.mybatis.util;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {
	private MyBatisUtil(){}
	
	//Mysql Session工厂
	private static SqlSessionFactory mysqlSessionFactory;
	//Sqlserver Session工厂
	private static SqlSessionFactory sqlserverSessionFactory;
	//Oracle Session工厂
	private static SqlSessionFactory oracleSessionFactory;
	
	static{
		try {
			//实例化Mysql Session工厂
			mysqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis/mybatis-config.xml"));
			//实例化SqlServer Session 工厂
			sqlserverSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis/mybatis-config.xml"), "sqlserver");
			//实例化Oracle Session工厂
			oracleSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis/mybatis-config.xml"), "oracle");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 打开MySql会话
	 * @return
	 */
	public static SqlSession openMySqlSession(){
		return mysqlSessionFactory.openSession();
	}
	
	/**
	 * 打开SqlServer会话
	 * @return
	 */
	public static SqlSession openSqlserverSession(){
		return sqlserverSessionFactory.openSession();
	}
	
	/**
	 * 打开Oracle会话
	 * @return
	 */
	public static SqlSession openOracleSession(){
		return oracleSessionFactory.openSession();
	}
	
	/**
	 * 关闭会话
	 * @param sqlSession
	 */
	public static void closeSession(SqlSession sqlSession){
		if(null!=sqlSession)
			sqlSession.close();
	}
}

实体类:

package com.tenghu.mybatis.model;

public class Dept {
	private int deptno;
	private String dname;
	private String loc;	
}
package com.tenghu.mybatis.model;

public class Emp {
	private int id;
	private int age;
	private String name;
}
省略get和set方法

映射文件:EmpMapper.xml和DeptMapper.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="com.tenghu.mybatis.mapper.EmpMapper">
	<select id="queryForList" resultType="Emp">
		select * from emp
	</select>
</mapper>

<?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.tenghu.mybatis.mapper.DeptMapper">
	<select id="queryForList" resultType="Dept">
		select * from dept
	</select>
</mapper>

测试类:

package com.tenghu.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.tenghu.mybatis.model.Dept;
import com.tenghu.mybatis.model.Emp;
import com.tenghu.mybatis.util.MyBatisUtil;

public class EmpMapperTest {
	/**
	 * 测试MySql数据库
	 */
	@Test
	public void testMysqlQueryForList(){
		SqlSession sqlSession=null;
		try {
			//获取sql会话
			sqlSession=MyBatisUtil.openMySqlSession();
			//获取集合
			List<Emp> empList=sqlSession.selectList("com.tenghu.mybatis.mapper.EmpMapper.queryForList");
			for (Emp emp : empList) {
				System.out.println(emp.getAge()+"\t"+emp.getId()+"\t"+emp.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//关闭SqlSession
			MyBatisUtil.closeSession(sqlSession);
		}
	}
	/**
	 * 测试Sqlserver数据库
	 */
	@Test
	public void testSqlServerQueryForList(){
		SqlSession sqlSession=null;
		try {
			//获取sql会话
			sqlSession=MyBatisUtil.openSqlserverSession();
			//获取集合
			List<Emp> empList=sqlSession.selectList("com.tenghu.mybatis.mapper.EmpMapper.queryForList");
			for (Emp emp : empList) {
				System.out.println(emp.getAge()+"\t"+emp.getId()+"\t"+emp.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//关闭SqlSession
			MyBatisUtil.closeSession(sqlSession);
		}
	}
	/**
	 * 测试Oracle数据库
	 */
	@Test
	public void testOracleQueryForList(){
		SqlSession sqlSession=null;
		try {
			//获取Sql会话
			sqlSession=MyBatisUtil.openOracleSession();
			List<Dept> deptList=sqlSession.selectList("com.tenghu.mybatis.mapper.DeptMapper.queryForList");
			for (Dept dept : deptList) {
				System.out.println(dept.getDeptno()+"\t"+dept.getDname()+"\t"+dept.getLoc());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//关闭SqlSession
			MyBatisUtil.closeSession(sqlSession);
		}
	}
}

这样就完成了同时连接多个数据库了



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MyBatis配置两个数据库,可以实现数据的分离,提高系统性能和可维护性。具体操作如下: 1.在MyBatis配置文件中定义两个数据源 <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db1"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db2"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> 2.在MyBatis配置文件中定义两个SqlSessionFactory <sqlSessionFactory dataSource="db1"> <mapper resource="com/example/mapper1.xml"/> </sqlSessionFactory> <sqlSessionFactory dataSource="db2"> <mapper resource="com/example/mapper2.xml"/> </sqlSessionFactory> 3.在MyBatis配置文件中定义两个事务管理器 <transactionManager type="JDBC" dataSource="db1"/> <transactionManager type="JDBC" dataSource="db2"/> 4.在需要访问数据的地方,通过SqlSession选择具体的SqlSessionFactory SqlSession session1 = sqlSessionFactory1.openSession(); SqlSession session2 = sqlSessionFactory2.openSession(); 通过以上步骤,就可以在MyBatis配置两个数据库,实现数据的分离,并且保证数据的一致性。同时,MyBatis还提供了多个数据源的解决方案,如使用第三方组件进行数据源路由或使用动态数据源等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老虎Love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值