В предыдущей статье «Гармоничная интеграция SpringBoot+Mybatis, возможно, самая подробная статья на эту тему», мы рассмотрели интеграцию SpringBoot и Mybatis. В то время мы использовали одиночный источник данных, что делало конфигурацию Spring Boot очень простой — достаточно было указать параметры подключения к базе данных в файле application.properties. Однако, по мере развития бизнеса, мы часто сталкиваемся с необходимостью разделения баз данных или использования других баз данных, что требует конфигурации нескольких источников данных. В этой статье мы рассмотрим, как конфигурировать несколько источников данных в SpringBoot+Mybatis.
Код, представленный в этой статье, основан на проекте из предыдущей статьи «Гармоничная интеграция SpringBoot+Mybatis, возможно, самая подробная статья на эту тему», но для тех читателей, которые не читали предыдущую статью, я все равно пройду по каждому шагу, чтобы новички могли самостоятельно повторить процесс.
Содержание:
- [1 Подготовка к разработке](#1-подготовка-к-разработке)Создайте базовый проект SpringBoot. В данной статье я не буду подробно останавливаться на этом вопросе, подробнее можно посмотреть в следующей статье:
https://blog.csdn.net/qq_34337272/article/details/79563606
Структура проекта:
Мы создали две базы данных, а также создали таблицы user и money в каждой из них.
Таблица user очень простая и содержит только 4 поля: id пользователя, имя, возраст и баланс. Вид таблицы представлен на следующем рисунке:
Добавление поля "баланс money" позволяет нам продемонстрировать простой пример управления транзакциями.
Таблица money также очень простая и содержит 4 поля: id, базовая зарплата, премия и штраф. Вид таблицы представлен на следующем рисунке:
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
Для интеграции 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.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
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);
}
Слой 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 также очень прост.
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 )