Я слышал, что поиск в WeChat для «Java Fish Aberdeen» станет сильнее!
Эта статья включена вJavaStarter, который содержит мою полную серию статей по Java, вы можете прочитать его для изучения или интервью.
(1) Сценарий
В сценариях практических приложений мы часто сталкиваемся с ситуациями, когда системе необходимо вызывать несколько источников данных. Это может быть другая библиотека того же mysql или она может использоваться для вызова данных из другого mysql. Вот очень эффективная структура переключения с несколькими источниками данных ---dynamicdatasource
(2) Представьте эту структуру
Dynamicdatasource на самом деле является одним из фреймворков в экосистеме Mybatis-plus.Он исходит от известного проекта Mybatis-Plus с открытым исходным кодом, операционной организации Code Cloud.Эта организация также имеет странное название Baomidou. Это очень легендарная организация, о ней могут узнать все желающие.
(3) Начать использовать
3.1 Создание проекта
Нет необходимости упоминать этот шаг, просто создайте проект Springboot и добавьте основные веб-зависимости.
3.2 Знакомство с зависимостями
Основные зависимости источников динамических данных следующие:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
Мы сами представляем тройку JDBC
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
3.3 Запись конфигурационного файла
При использовании Mybatis в прошлом мы могли настроить только один источник данных, но теперь мы можем настроить несколько источников данных через динамические источники данных.
Среди них первичный представляет источник данных по умолчанию, строгий представляет собой настройку строгого режима, а значение по умолчанию false не включено.После запуска будет создано исключение, если указанный источник данных не соответствует.Если он не запущен, данные по умолчанию будет использоваться источник.
spring:
datasource:
dynamic:
primary: master
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/student
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/books
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
3.4 Переключение источников данных в коде
Вы можете легко переключать источники данных с помощью одной аннотации:
@Service
@DS("master")
public class TestService {
@Autowired(required = false)
private BookMapper bookMapper;
@Autowired(required = false)
private StudentMapper studentMapper;
public String getName(){
return studentMapper.getNameById("1");
}
@DS("slave")
public String getBookName(){
return bookMapper.getBookNameById("1");
}
}
Во-первых, мы можем установить источник данных для метода, а во внутреннем методе мы также можем переключать источник данных через аннотацию DS, не беспокоясь о проблеме вложенности.
(4) Полный проект
Сначала я построил две библиотеки, одну из которых назвали студенческой, а другую — книжной.
В студенческой библиотеке есть студенческий стол:
CREATE TABLE `student` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL,
`grade` int(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
В книжной библиотеке есть книжный стол:
CREATE TABLE `book` (
`ID` int(11) NOT NULL,
`BOOKISBN` varchar(255) DEFAULT NULL,
`BOOKNAME` varchar(255) DEFAULT NULL,
`AUTHOR` varchar(255) DEFAULT NULL,
`PRICE` double DEFAULT NULL,
`TYPEID` int(11) DEFAULT NULL,
`PUBLISHER` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Структура проекта проста:
Первый — это два интерфейса Mapper:
@Mapper
public interface BookMapper {
@Select("select bookname from book where id=#{id}")
String getBookNameById(@Param("id") String id);
}
СтудентМаппер:
@Mapper
public interface StudentMapper {
@Select("select name from student where id=#{id}")
String getNameById(@Param("id") String id);
}
затем услуга
@Service
@DS("master")
public class TestService {
@Autowired(required = false)
private BookMapper bookMapper;
@Autowired(required = false)
private StudentMapper studentMapper;
public String getName(){
return studentMapper.getNameById("1");
}
@DS("slave")
public String getBookName(){
return bookMapper.getBookNameById("1");
}
}
Наконец, контроллер вызывает службу
@RestController
public class IndexController {
@Autowired
private TestService testService;
@GetMapping("index")
public String index(){
String studentName = testService.getName();
String bookName = testService.getBookName();
return studentName+bookName;
}
}
Scan Mapper в классе запуска
@SpringBootApplication
@MapperScan("com.javayz.mybatisplus.mapper")
public class MybatisplusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisplusApplication.class, args);
}
}
Такой простой проект завершен, и, посетив /index, вы обнаружите, что данные из двух источников данных были извлечены.
(5) Резюме
Если у вас есть аналогичные потребности в вашем проекте, попробуйте этот метод. Если такого спроса нет, хорошо ознакомиться с этой технологией. Я Юзай, увидимся в следующий раз!