1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/GiteeOS-springboot-guide

Клонировать/Скачать
springboot-mybatis-mutipledatasource.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 10:20 f496caa

В предыдущей статье «Гармоничная интеграция SpringBoot+Mybatis, возможно, самая подробная статья на эту тему», мы рассмотрели интеграцию SpringBoot и Mybatis. В то время мы использовали одиночный источник данных, что делало конфигурацию Spring Boot очень простой — достаточно было указать параметры подключения к базе данных в файле application.properties. Однако, по мере развития бизнеса, мы часто сталкиваемся с необходимостью разделения баз данных или использования других баз данных, что требует конфигурации нескольких источников данных. В этой статье мы рассмотрим, как конфигурировать несколько источников данных в SpringBoot+Mybatis.

Код, представленный в этой статье, основан на проекте из предыдущей статьи «Гармоничная интеграция SpringBoot+Mybatis, возможно, самая подробная статья на эту тему», но для тех читателей, которые не читали предыдущую статью, я все равно пройду по каждому шагу, чтобы новички могли самостоятельно повторить процесс.

Содержание:

- [1 Подготовка к разработке](#1-подготовка-к-разработке)

1 Подготовка к разработке

1.1 Параметры окружения

  • Разработка: IDEA
  • Базовые инструменты: Maven+JDK8
  • Используемые технологии: SpringBoot+Mybatis
  • База данных: MySQL
  • Версия SpringBoot: 2.1.0. После SpringBoot2.0 появляются некоторые небольшие проблемы, которые будут рассмотрены в этой статье. Обратите внимание на возможные проблемы, связанные с несоответствием версий.

1.2 Создание проекта

Создайте базовый проект SpringBoot. В данной статье я не буду подробно останавливаться на этом вопросе, подробнее можно посмотреть в следующей статье:

https://blog.csdn.net/qq_34337272/article/details/79563606

Структура проекта:

Структура проекта на основе SpringBoot2.0+

1.3 Создание двух баз данных и таблиц user и money

Мы создали две базы данных, а также создали таблицы user и money в каждой из них.

Таблица user очень простая и содержит только 4 поля: id пользователя, имя, возраст и баланс. Вид таблицы представлен на следующем рисунке:

Информация о таблице user

Добавление поля "баланс money" позволяет нам продемонстрировать простой пример управления транзакциями.

Таблица money также очень простая и содержит 4 поля: id, базовая зарплата, премия и штраф. Вид таблицы представлен на следующем рисунке:Информация о таблице money

SQL-запросы для создания таблиц:

Таблица user:

CREATE TABLE `user` (
  `id` int(13) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  `name` varchar(33) DEFAULT NULL COMMENT 'Имя',
  `age` int(3) DEFAULT NULL COMMENT 'Возраст',
  `money` double DEFAULT NULL COMMENT 'Баланс',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

Таблица money:

CREATE TABLE `money` (
  `id` int(33) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  `basic` int(33) DEFAULT NULL COMMENT 'Базовая зарплата',
  `reward` int(33) DEFAULT NULL COMMENT 'Премия',
  `punishment` int(33) DEFAULT NULL COMMENT 'Штраф',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

1.4 Настройка зависимостей в файле pom

Для интеграции SpringBoot и Mybatis были добавлены зависимости с artifactId mybatis-spring-boot-starter. Также были добавлены зависимости с artifactId mysql-connector-java для использования базы данных MySQL.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

1.5 Конфигурация application.propertiesКонфигурация двух источников данных: база данных 1 и база данных 2!

Внимание:

В процессе конфигурации источников данных в версии 1.0 использовались параметры вида: spring.datasource.url и spring.datasource.driverClassName. А после обновления до версии 2.0 необходимо изменить на: spring.datasource.jdbc-url и spring.datasource.driver-class-name! В противном случае при подключении к базе данных могут возникнуть следующие ошибки:

### Ошибка при запросе к базе данных. Причина: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.

Кроме того, начиная с версии 2.0.2+ необходимо добавить hikari после datasource, если этого не сделать, могут возникнуть ошибки.

server.port=8335
# Конфигурация первого источника данных
spring.datasource.hikari.db1.jdbc-url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.hikari.db1.username=root
spring.datasource.hikari.db1.password=153963
spring.datasource.hikari.db1.driver-class-name=com.mysql.cj.jdbc.Driver
# Конфигурация второго источника данных
spring.datasource.hikari.db2.jdbc-url=jdbc:mysql://127.0.0.1:3306/erp2?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.hikari.db2.username=root
spring.datasource.hikari.db2.password=153963
spring.datasource.hikari.db2.driver-class-name=com.mysql.cj.jdbc.Driver

1.6 Создание бинов пользовательского класса и класса деталей зарплаты

User.java

public class User {
    private int id;
    private String name;
    private int age;
    private double money;
    ...
    Здесь пропущены getter, setter и метод toString
}

Money.java

public class Money {
    private int basic;
    private int reward;
    private int punishment;
    ...
    Здесь пропущены getter, setter и метод toString
}
```## 2. Конфигурация источников данных

Конфигурация двух источников данных через Java-классы является самым важным разделом. Здесь стоит отметить следующие моменты:

- Аннотация `@MapperScan` используется для указания местоположения DAO-классов, работающих с базой данных 1, а также для объявления `SqlSessionTemplate`. `SqlSessionTemplate` является ключевым компонентом MyBatis-Spring. Этот класс отвечает за управление сессией MyBatis (`SqlSession`), вызов SQL-методов MyBatis и перевод данных. `SqlSessionTemplate` является потокобезопасным и может использоваться несколькими DAO.

- Поскольку я использую полностью аннотированный подход, я закомментировал следующую строку кода, которая ищет и анализирует конфигурационные файлы `mapper.xml` для базы данных 2:
  ```java
  bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db2/*.xml"));
  • Например, чтобы указать использование базы данных 1, достаточно добавить следующую аннотацию к соответствующему DAO-классу: @Qualifier("db1SqlSessionTemplate").

  • В каждом методе конфигурационного класса для базы данных 1 мы добавили аннотацию @Primary, чтобы указать, что эта база данных является основной. В противном случае могут возникнуть ошибки.

DataSource1Config.java

@Configuration
@MapperScan(basePackages = "top.snailclimb.db1.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DataSource1Config {
```    /**
     * Создание источника данных. Аннотация @Primary указывает на то, что это основной источник данных.
     */
    @Bean(name = "db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari.db1")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }```markdown
## Три: Разработка слоев Dao и Service

Создайте два разных пакета для хранения Dao и Service для двух разных баз данных.

### 3.1 Слой Dao
```Для двух баз данных мы просто тестируем один запрос. В предыдущей статье [«Элегантная интеграция SpringBoot+Mybatis, возможно, самая подробная статья на эту тему»](https://github.com/Snailclimb/springboot-integration-examples/blob/master/md/springboot-mybatis.md) мы использовали аннотации для реализации базовых операций добавления, удаления, изменения и выборки данных из базы данных.UserDao.java

```java
@Qualifier("db1SqlSessionTemplate")
public interface UserDao {
    /**
     * Поиск информации о пользователе по имени
     */
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findUserByName(String name);

}

MoneyDao.java

@Qualifier("db2SqlSessionTemplate")
public interface MoneyDao {

    /**
     * Поиск деталей зарплаты по идентификатору
     */
    @Select("SELECT * FROM money WHERE id = #{id}")
    Money findMoneyById(@Param("id") int id);
}

3.2 Слой Service

Слой Service очень прост, нет сложных бизнес-логик.

UserService.java

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    /**
     * Поиск пользователя по имени
     */
    public User selectUserByName(String name) {
        return userDao.findUserByName(name);
    }

}

MoneyService.java

@Service
public class MoneyService {
    @Autowired
    private MoneyDao moneyDao;

    /**
     * Поиск зарплаты по идентификатору
     */
    public Money selectMoneyById(int id) {
        return moneyDao.findMoneyById(id);
    }

}

Четыре: Слой Controller

Слой Controller также очень прост.

UserController.java

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/query")
    public User testQuery() {
        return userService.selectUserByName("Дейзи");
    }
}

MoneyController.java

@RestController
@RequestMapping("/money")
public class MoneyController {
    @Autowired
    private MoneyService moneyService;

    @RequestMapping("/query")
    public Money testQuery() {
        return moneyService.selectMoneyById(1);
    }
}

Запуск приложения

// Этот аннотированный класс является точкой входа для приложения Spring Boot
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}
```}

Таким образом, конфигурация Spring Boot + MyBatis с несколькими источниками данных на основе Spring Boot 2.0+ завершена, и оба базы данных доступны для использования.


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/GiteeOS-springboot-guide.git
git@api.gitlife.ru:oschina-mirror/GiteeOS-springboot-guide.git
oschina-mirror
GiteeOS-springboot-guide
GiteeOS-springboot-guide
master