1、思路
此图片引用至博客 【Mybatis】MyBatis之配置多数据源 思路描述:
(1)主要通过创建两份配置文件,不同的配置文件中设置不同的数据源(设置不同数据库连接信息);
(2)在每个配置文件中扫描不同的Mapper路径与Mapper.xml配置文件路径;
(3)使用不同的配置文件创建不同的SqlSessionFactory对象,从而实现MyBatis中多数据源的配置
2、直接上代码
2.1 maven 的pom.xml 依赖
因为用的是原生的mybatis框架,故只需要导入一下依赖即可
<dependencies>
<!--mybatis依赖:版本 3.4.5-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--oracle jdbc:因为连接的是 Oracle,所以导入Oracle的连接驱动-->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.8.0.0</version>
</dependency>
<!--druid 阿里巴巴的数据库连接池,如果用其他连接池,导入其他依赖即可-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.19</version>
</dependency>
<!-- lombook插件 为了方便,自动生成get、set-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
</dependency>
</dependencies>
2.2 maven项目的目录结构及介绍
(1)无需关注plugin目录
(2)在 src/main/resources/mybatis-config-bsm.xml 为第一个数据源的mybatis配置文件
(3)在 src/main/resources/mybatis-config-pms.xml 为第二个数据源的mybatis配置文件
2.3 MyBatis的配置文件
mybatis-config-bsm.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>
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="你的数据库url" />
<property name="username" value="你的数据库用户名" />
<property name="password" value="你的数据库密码" />
</properties>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="dataSource-bsm">
<!-- id:唯一标识 -->
<environment id="dataSource-bsm">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" >
<property name="autoCommit" value="false"/>
</transactionManager>
<!-- 数据源,池类型的数据源 :该配置是config目录下配置的Druid数据源 -->
<dataSource type="config.DruidDataSourceFactory">
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="maxWait" value="60000" />
<property name="minIdle" value="1" />
</dataSource>
</environment>
</environments>
<!-- 扫描的mapper路径 -->
<mappers>
<package name="bsmMapper"/>
</mappers>
</configuration>
mybatis-config-pms.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>
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="你的数据库url" />
<property name="username" value="你的数据库用户名" />
<property name="password" value="你的数据库密码" />
</properties>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="dataSource-pms">
<!-- id:唯一标识 -->
<environment id="dataSource-pms">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" >
<property name="autoCommit" value="false"/>
</transactionManager>
<!-- 数据源,池类型的数据源 这个就没有用druid数据源啦 -->
<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>
<!-- 扫描的mapper路径 -->
<mappers>
<package name="pmsMapper"/>
</mappers>
</configuration>
2.4 配置Druid数据源
只需要创建一个类:DruidDataSourceFactory,并继承 PooledDataSourceFactory即可
public class DruidDataSourceFactory extends PooledDataSourceFactory {
public DruidDataSourceFactory() {
this.dataSource=new DruidDataSource();
}
}
2.5 Mapper类及其对应的Mapper.xml文件
(1)student实体类
package entity;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @description:
* @Author:
* @DateTime:
**/
@Data
@Accessors(chain = true)
public class Student implements Serializable {
private static final long serialVersionUID = 586002512508160129L;
private String id;
private String name;
private Integer age;
private String grade;
}
(2) BsmStudentMapper 及 BsmStudentMapper.xml
package bsmMapper;
import entity.Student;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @description:
* @Author: yuyufeng
* @DateTime:
**/
public interface BsmStudentMapper {
/**
* 获取所有Bsm的学生信息
* @return
*/
public List<Student> getAllBsmStudent();
/**
* 新增学生信息
* @param student
*/
public void insertBsmStudent(@Param("student") Student student);
}
<?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="bsmMapper.BsmStudentMapper">
<select id="getAllBsmStudent" resultType="entity.Student">
select
bs.id as id,
bs.name as name,
bs.age as age,
bs.grade as grade
from bsm_student bs
</select>
<insert id="insertBsmStudent">
insert into bsm_student(id,name,age,grade)
values(#{student.id},#{student.name},#{student.age},#{student.grade})
</insert>
</mapper>
(3)PmsStudentMapper 及 PmsStudentMapper.xml 类似
3 测试与总结
3.1 测试代码
import bsmMapper.BsmStudentMapper;
import entity.Student;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.*;
import org.apache.ibatis.transaction.TransactionFactory;
import pmsMapper.PmsStudentMapper;
import utils.UUIDUtils;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
/**
* @description:
* @Author: yuyufeng
* @DateTime:
**/
public class Test1 {
//数据源常量
private static final String DataSource_PMS="dataSource-pms";
private static final String DataSource_BSM="dataSource-bsm";
//配置文件常量
private static final String Config_PMS="mybatis-config-pms.xml";
private static final String Config_BSM="mybatis-config-bsm.xml";
public static void main(String[] args) throws Exception {
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//数据源bsm:
bsmTest(builder);
insertIntoPms(builder);
}
/**
* 插入数据到PMS
* 练习一下事务的提交
* @param builder
*/
public static void insertIntoPms(SqlSessionFactoryBuilder builder){
SqlSession sqlSession=null;
try {
InputStream in_Pms = Resources.getResourceAsStream(Config_BSM);
SqlSessionFactory sqlSessionFactory1 = builder.build(in_Pms,DataSource_BSM);
sqlSession = sqlSessionFactory1.openSession(ExecutorType.BATCH,true);
BsmStudentMapper pmsMapper = sqlSession.getMapper(BsmStudentMapper.class);
// Executor
System.out.println("开始插入");
Student student=new Student().setId(UUIDUtils.get32UUID()).setAge(1).setGrade("小小班").setName("余小小han");
pmsMapper.insertBsmStudent(student);
sqlSession.commit();
System.out.println("结束");
} catch (IOException e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
sqlSession.close();
}
}
/**
* pms测试方法
* @param builder
*/
public static void pmsTest(SqlSessionFactoryBuilder builder){
SqlSession sqlSession=null;
try {
InputStream in_Pms = Resources.getResourceAsStream(Config_PMS);
SqlSessionFactory sqlSessionFactory1 = builder.build(in_Pms,DataSource_PMS);
sqlSession = sqlSessionFactory1.openSession(true);
PmsStudentMapper pmsMapper = sqlSession.getMapper(PmsStudentMapper.class);
List<Student> allPmsStudent = pmsMapper.getAllPmsStudent();
System.out.println(">>>>>>>Pms学生信息:开始<<<<<<<");
System.out.println(allPmsStudent);
System.out.println(">>>>>>>Pms学生信息:结束<<<<<<<");
} catch (IOException e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
sqlSession.close();
}
}
/**
* bsm测试方法
* @param builder
*/
public static void bsmTest(SqlSessionFactoryBuilder builder){
SqlSession sqlSession=null;
try {
InputStream in_Bsm = Resources.getResourceAsStream(Config_BSM);
SqlSessionFactory sqlSessionFactory1 = builder.build(in_Bsm,DataSource_BSM);
Configuration configuration = sqlSessionFactory1.getConfiguration();
Environment environment = configuration.getEnvironment();
DataSource dataSource = environment.getDataSource();
TransactionFactory transactionFactory = environment.getTransactionFactory();
sqlSession = sqlSessionFactory1.openSession(true);
BsmStudentMapper bsmMapper = sqlSession.getMapper(BsmStudentMapper.class);
List<Student> allBsmStudent = bsmMapper.getAllBsmStudent();
System.out.println(">>>>>>>Bsm学生信息:开始<<<<<<<");
System.out.println(allBsmStudent);
System.out.println(">>>>>>>Bsm学生信息:结束<<<<<<<");
} catch (IOException e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
sqlSession.close();
}
}
}
3.2 总结
(1)多数据源—>多Mybatis配置文件—>多SqlSessionFactory—>加载指定的Mapper