MyBatis多数据源的两种配置方式

MyBatis多数据源的两种配置方式包括XML配置和注解配置。

XML配置

步骤一:配置数据源

在mybatis-config.xml文件中配置多数据源的数据源信息,注意要配置各自的数据库连接信息以及数据库驱动信息。

<environments default="dev">
  <environment id="dev">
    <transactionManager type="JDBC"/>
    <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="root"/>
    </dataSource>
  </environment>
  <environment id="test">
    <transactionManager type="JDBC"/>
    <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="root"/>
    </dataSource>
  </environment>
</environments>

步骤二:配置mapper

创建对应的mapper接口和xml文件,如下所示:

public interface UserMapper1 {

    List<User> getAll();

    User getOne(Long id);

    void insert(User user);

    void update(User user);

    void delete(Long id);

}

<mapper namespace="com.example.mapper.UserMapper1">

    <select id="getAll" resultType="User">
        select * from user
    </select>

    <select id="getOne" parameterType="Long" resultType="User">
        select * from user where id = #{id}
    </select>

    <insert id="insert" parameterType="User">
        insert into user(id,name,age) values(#{id},#{name},#{age})
    </insert>

    <update id="update" parameterType="User">
        update user set name=#{name},age=#{age} where id=#{id}
    </update>

    <delete id="delete" parameterType="Long">
        delete from user where id=#{id}
    </delete>

</mapper>

步骤三:配置SqlSessionFactory

在Spring配置文件中根据不同的环境配置多个SqlSessionFactory对象。例如:

<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource1"/>
</bean>

<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource2"/>
</bean>

步骤四:配置MapperScannerConfigurer

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory1"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/>
</bean>

注解配置

步骤一:配置数据源

在application.yml或application.properties文件中配置数据源信息,如下所示:

# 默认数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.username=root
spring.datasource.primary.password=root

# 第二个数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root

步骤二:配置Mapper

在Mapper接口的方法上增加@Mapper注解,并且在方法上增加@Select、@Insert等注解,如下所示:

@Mapper
public interface UserMapper1 {

    @Select("SELECT * FROM user")
    List<User> getAll();

    @Select("SELECT * FROM user WHERE id = #{id}")
    User getOne(@Param("id") Long id);

    @Insert("INSERT INTO user(id,name,age) VALUES(#{id},#{name},#{age})")
    void insert(User user);

    @Update("UPDATE user SET name=#{name},age=#{age} WHERE id=#{id}")
    void update(User user);

    @Delete("DELETE FROM user WHERE id=#{id}")
    void delete(Long id);

}

步骤三:配置SqlSessionFactory

在Spring Boot配置类中使用@Primary注解定义默认的SqlSessionFactory,如下所示:

@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class DataSourceConfig {

    @Primary
    @Bean(name = "dataSource1")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "dataSource2")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "sqlSessionFactory2")
    public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "transactionManager")
    public DataSourceTransactionManager DataSourceTransactionManager(@Qualifier("dataSource1") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

}

步骤四:配置MapperScannerConfigurer

@Configuration
public class MybatisConfig {

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "sqlSessionFactory2")
    public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "db1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate db1SqlSessionTemplate(
            @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean(name = "db2SqlSessionTemplate")
    public SqlSessionTemplate db2SqlSessionTemplate(
            @Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory2) {
        return new SqlSessionTemplate(sqlSessionFactory2);
    }

}

至此,我们已经了解了MyBatis多数据源的两种配置方式。其中,第一种方式使用XML配置,相对比较繁琐,但是更加灵活,适用于使用基于XML的MyBatis的用户。第二种方式使用注解配置,相对简洁,且在Spring Boot项目中使用非常方便,是一种常用的配置方式。

下面我们看两个示例:

示例一

假设我们有两个数据源,db1和db2,下面我们分别对这两个数据源进行增删查改的操作。

  • 从db1中查询所有用户
@Autowired
private UserMapper1 userMapper1;

public List<User> getAllFromDb1() {
    return userMapper1.getAll();
}
  • 从db2中查询所有用户
@Autowired
@Qualifier("sqlSessionFactory2")
private SqlSessionFactory sqlSessionFactory2;

public List<User> getAllFromDb2() {
    SqlSession session = sqlSessionFactory2.openSession();
    UserMapper2 userMapper2 = session.getMapper(UserMapper2.class);
    return userMapper2.getAll();
}

示例二

假设我们有两个数据源,db1和db2,下面我们分别同时向这两个数据源增加一个用户。

@Autowired
@Qualifier("db1SqlSessionTemplate")
private SqlSessionTemplate db1SqlSessionTemplate;

@Autowired
@Qualifier("db2SqlSessionTemplate")
private SqlSessionTemplate db2SqlSessionTemplate;

public void addUsers() {
    User user1 = new User(1L, "admin", 18);
    User user2 = new User(2L, "admin2", 20);

    db1SqlSessionTemplate.insert("com.example.mapper.UserMapper1.insert", user1);
    db2SqlSessionTemplate.insert("com.example.mapper.UserMapper2.insert", user2);
}
阅读剩余 83%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis多数据源的两种配置方式 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java synchronized同步方法详解

    Java synchronized同步方法详解 在多线程编程中,由于线程的交叉执行可能会造成资源竞争和数据安全问题。使用Java synchronized关键字可以通过限制同时只有一个线程可以访问被synchronized修饰的代码块或方法,从而保证了线程安全性。本文将详细讲解Java synchronized同步方法的原理、用法和示例。 同步方法的原理 J…

    Java 2023年5月26日
    00
  • spring boot整合kafka过程解析

    下面是关于Spring Boot整合Kafka过程的解析攻略,并附带两个示例: 概述 Kafka是一个开源的分布式消息传递平台,它提供了高吞吐量和低延迟的方式来传递消息。它的主要特点是: 高吞吐量:Kafka每秒钟可以处理数百万的消息。这使得它适合于对实时数据流进行发布/订阅、消息队列、异步处理等场景。 高扩展性:Kafka的扩展性非常好,多个Kafka服务…

    Java 2023年5月19日
    00
  • win10怎么安装java?win10系统安装java的方法

    下面是安装 Java 的完整攻略。 准备工作 在开始安装 Java 之前,需要确认你的计算机上尚未安装 Java 环境,可以通过以下方式检查: 打开命令行窗口,输入命令 java -version,如果显示类似 “java version 1.8.0_241” 的信息,则表示已安装 Java 环境; 如果没有显示版本信息,或提示未找到 java 命令,则需要…

    Java 2023年5月24日
    00
  • SpringMVC使用RESTful接口案例

    下面是关于“SpringMVC使用RESTful接口案例”的完整攻略,包含两个示例说明。 SpringMVC使用RESTful接口案例 RESTful接口是一种基于HTTP协议的API设计风格,它使用HTTP方法(GET、POST、PUT、DELETE等)来实现对资源的操作。本文将介绍如何在SpringMVC中使用RESTful接口,并提供两个示例说明。 步…

    Java 2023年5月17日
    00
  • 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常

    学习Spring源码的建议 阅读Spring官方文档,了解Spring框架的基本概念和使用方法。 下载Spring源码,可以从官网或者GitHub上获取。 阅读Spring源码的入口类,了解Spring框架的启动过程和核心组件的加载顺序。 阅读Spring源码中的注释和文档,了解每个类和方法的作用和用法。 调试Spring源码,可以通过IDEA等工具进行调试…

    Java 2023年4月24日
    00
  • 配置Web应用环境实现JSP留言簿

    下面给出配置Web应用环境实现JSP留言簿的完整攻略。 环境准备 在进行Web应用环境配置之前,需要先准备好以下环境: 安装Java开发环境(JDK) 安装Tomcat服务器 安装一个Java IDE(Eclipse、IntelliJ等) 创建Web应用项目 首先,需要在Java IDE中创建一个Web应用项目。以Eclipse为例,创建步骤如下: 打开Ec…

    Java 2023年6月2日
    00
  • Java使用Maven BOM统一管理版本号的实现

    Java使用Maven BOM(Bill Of Materials)可以统一管理项目库依赖的版本号,避免了在POM文件中重复声明版本号的冗余问题,并且可以减轻开发者手动维护库依赖版本的工作量。 以下是Java使用Maven BOM统一管理版本号的实现攻略: 1.创建BOM项目 首先,创建一个Maven项目,称为“BOM项目”。在pom.xml文件中定义BOM…

    Java 2023年5月19日
    00
  • 一文详解Java中字符串的基本操作

    一文详解Java中字符串的基本操作 字符串定义 在Java中,字符串是一种数据类型,用来表示一系列的字符组合。在Java中,字符串是用双引号(” “)括起来的,可以包含任意数量的字符。 String str1 = "hello world"; 字符串拼接 在Java中,字符串可以通过加号(+)进行拼接。 String str1 = &qu…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部