详解springboot+mybatis多数据源最简解决方案

本文将详细讲解如何在Spring Boot项目中使用Mybatis多数据源,完整的攻略包括以下几个步骤:

  1. 添加项目依赖
  2. 创建数据源配置类
  3. 创建Mybatis配置类
  4. 创建Mapper接口和Mapper.xml文件
  5. 测试访问多数据源

下面,我们将逐一进行讲解。

1. 添加项目依赖

pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.4</version>
</dependency>

其中,spring-boot-starter-jdbcspring-boot-starter-data-jpa 用于创建基于JPA的单一数据源,mybatis-spring-boot-starter 是Mybatis官方提供的Spring Boot集成包。

如果需要使用多个数据源,还需要添加 druid 数据源和 mysql-connector-java 依赖:

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
  <version>1.2.6</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.25</version>
</dependency>

druid-spring-boot-starter 是Druid数据源的Spring Boot集成包。

2. 创建数据源配置类

src/main/java 目录下创建一个名为 datasource 的包,然后在此包下创建 FirstDataSourceConfigSecondDataSourceConfig 两个类,分别用于配置第一个和第二个数据源。

@Configuration
@MapperScan(basePackages = "com.example.mapper.first", sqlSessionFactoryRef = "firstSqlSessionFactory")
@EnableTransactionManagement
public class FirstDataSourceConfig {

  @Bean(name = "firstDataSource")
  @ConfigurationProperties(prefix = "spring.datasource.first")
  @Primary
  public DataSource firstDataSource() {
    return DruidDataSourceBuilder.create().build();
  }

  @Bean(name = "firstSqlSessionFactory")
  @Primary
  public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    // 设置mybatis配置文件
    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/first/*.xml"));
    bean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
    return bean.getObject();
  }

  @Bean(name = "firstTransactionManager")
  @Primary
  public DataSourceTransactionManager firstTransactionManager(@Qualifier("firstDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }

  @Bean(name = "firstSqlSessionTemplate")
  @Primary
  public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
}
@Configuration
@MapperScan(basePackages = "com.example.mapper.second", sqlSessionFactoryRef = "secondSqlSessionFactory")
@EnableTransactionManagement
public class SecondDataSourceConfig {

  @Bean(name = "secondDataSource")
  @ConfigurationProperties(prefix = "spring.datasource.second")
  public DataSource secondDataSource() {
    return DruidDataSourceBuilder.create().build();
  }

  @Bean(name = "secondSqlSessionFactory")
  public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    // 设置mybatis配置文件
    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/second/*.xml"));
    bean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
    return bean.getObject();
  }

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

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

这两个类都需要使用 @Configuration 注解来声明,该注解表明这是一个Spring配置类。

其中,FirstDataSourceConfigSecondDataSourceConfig 类都有三个核心方法:

  1. xxxDataSource:用于创建数据源(@Bean 注解表示方法返回值是一个Bean);
  2. xxxSqlSessionFactory:用于创建SqlSessionFactory(通过 @Qualifier 指定数据源Bean);
  3. xxxTransactionManager 和 xxxSqlSessionTemplate:用于配置事务管理器和SqlSessionTemplate。

配置类中的 @MapperScan 注解用于扫描 com.example.mapper.firstcom.example.mapper.second 包下的Mapper接口,sqlSessionFactoryRef 参数指定使用的SqlSessionFactory。

3. 创建Mybatis配置类

src/main/java 目录下创建 MybatisConfig 类,用于配置Mybatis相关的配置。

@Configuration
public class MybatisConfig {

  @Bean
  public ConfigurationCustomizer configurationCustomizer() {
    return (Configuration configuration) -> {
      // 开启驼峰命名规则
      configuration.setMapUnderscoreToCamelCase(true);
      // 显示sql语句
      configuration.setLogImpl(StdOutImpl.class);
    };
  }
}

该类使用了 @Configuration 注解,表示它是一个Spring配置类,在此类中定义了一个 ConfigurationCustomizer ,以开启Mybatis的驼峰命名和显示SQL语句的功能。使用 @Bean 来声明这个 ConfigurationCustomizer Bean。

4. 创建Mapper接口和Mapper.xml文件

com.example.mapper.firstcom.example.mapper.second 包下分别创建两个Mapper接口和对应的Mapper.xml文件。

FirstMapper 为例:

FirstMapper.java

public interface FirstMapper {

  List<First> listAll();

}

FirstMapper.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.example.mapper.first.FirstMapper">

  <resultMap id="first" type="com.example.entity.first.First">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
  </resultMap>

  <select id="listAll" resultMap="first">
    select * from first
  </select>

</mapper>

其中,namespace 用于指定这个Mapper接口的全限定名。

FirstMapper.xml 文件中包含了两个部分:

  1. resultMap:用于将查询结果映射到Java对象。
  2. select:用于配置具体的SQL查询,以及使用的resultMap。

5. 测试访问多数据源

在Spring Boot应用中可以使用 @Autowired 来注入不同的数据源对象。

FirstController 为例:

@RestController
@RequestMapping("/first")
public class FirstController {

  @Autowired
  private FirstMapper firstMapper;

  @GetMapping("/listAll")
  public List<First> listAll() {
    return firstMapper.listAll();
  }
}

在此演示中,我们使用@RestController注解声明一个控制器,并使用@Autowired注解来注入FirstMapper对象。

同样的,我们也可以创建一个 SecondController 来访问第二个数据源。

至此,我们已经完成了Spring Boot + Mybatis多数据源的配置,同时也完成了测试。

附上完整代码的Github地址:https://github.com/X-TJ/springboot-mybatis-multi-datasource

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解springboot+mybatis多数据源最简解决方案 - Python技术站

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

相关文章

  • java json字符串转JSONObject和JSONArray以及取值的实例

    下面是完整攻略: java json字符串转JSONObject和JSONArray以及取值的实例 JSON是一种轻量级的数据交换格式。在Java中,我们可以使用内置的JSONObject和JSONArray类很方便地操作JSON格式的数据。接下来,我会为你详细讲解如何实现JSON字符串的转换和取值。 将JSON字符串转为JSONObject 在Java中,…

    Java 2023年5月26日
    00
  • docker(一):Develop faster. Run anywhere.

    前言 在进行微服务部署时,首先需要进行部署环境的搭建。目前,Docker 已经成为了微服务部署的主流解决方案之一。Docker 可以帮助我们更快地打包、测试以及部署应用程序,从而缩短从编写到部署运行代码的周期。 在本文中,我们将对 Docker 进行初步的讲解,并介绍如何将映像生成并作为容器运行、使用 Docker Hub 共享映像。具体的功能点如下: 将映…

    Java 2023年5月11日
    00
  • java蓝桥杯历年真题及答案整理(小结)

    Java蓝桥杯历年真题及答案整理(小结) 背景介绍 蓝桥杯是全国IT类人才的比赛,旨在推动计算机教育和学科建设。Java蓝桥杯比赛是Java Web实战开发类比赛,也是企业求职的一个重要参考。Java蓝桥杯真题是Java Web编程重要的素材之一,通过练习历年真题可以提升Java编程能力。 整理方式 为了让广大Java编程爱好者高效学习,我们整理了Java蓝…

    Java 2023年5月23日
    00
  • 看过就懂的java零拷贝及实现方式详解

    看过就懂的java零拷贝及实现方式详解 什么是零拷贝? 传统的IO操作,读取文件、发送网络请求等,都需要进行数据拷贝。在数据从磁盘、内存中读取到内核缓冲区,再从内核缓冲区拷贝到用户缓冲区,最终传输到网络或者磁盘上,这样的操作称为数据拷贝。 零拷贝指的是在数据传输的过程中不进行数据拷贝操作,而是直接读取内存中的数据进行传输,从而节省CPU的开销。 Java如何…

    Java 2023年5月26日
    00
  • java Date获取本月的开始时间与结束时间

    获取本月开始时间和结束时间可以通过Java中的Date类和Calendar类来实现。 获取本月开始时间 // 获取当前日期 Date date = new Date(); // 创建Calendar实例并设置日期为当前日期 Calendar calendar = Calendar.getInstance(); calendar.setTime(date); …

    Java 2023年5月20日
    00
  • jsp页面使用${}不起作用的解决方法

    当jsp页面中使用${}时,如果无法起作用,通常有以下几个解决方案: 1. 检查EL表达式是否正确 ${}是jsp页面中EL表达式的语法,用于在jsp页面中展示数据。如果${}不起作用,首先需要检查表达式是否正确。正确的表达式应该是以${ }开头和结尾,中间包含一个变量。例如:${variable}。 如果表达式正确,但仍然无法展示数据,那就需要检查下一个解…

    Java 2023年6月15日
    00
  • 简单了解Java程序运行整体流程

    下面我将为你详细讲解“简单了解Java程序运行整体流程”的完整攻略。 1. Java程序运行流程 Java程序的运行可以分为三个主要步骤:编写代码、编译代码和运行程序。下面我将为你详细讲解这三个步骤: 1.1 编写代码 要编写Java程序,需要使用Java编程语言。Java是一种高级编程语言,非常易学易用。在编写Java程序时,可以使用任何文本编辑器。Jav…

    Java 2023年5月23日
    00
  • Python如何判断数独是否合法

    判断数独是否合法,可以使用Python的代码实现。下面是Python如何判断数独是否合法的完整攻略。 步骤一:读取数独矩阵 首先,需要读取数独矩阵,将其转换为一个9×9的二维数组。可以使用Python的input()函数或者从文件中读取的方式进行读取。另外,为了方便判断,数独中未填写的格子使用0表示。 示例代码: # 读取数独矩阵 matrix = [] f…

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