单独MyBatis框架-配置多数据源

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

猜你喜欢

转载自blog.csdn.net/weixin_43911286/article/details/111566772