Springboot + Mybatis реализует конфигурацию с несколькими источниками данных.

Spring Boot

Предисловие:

По мере увеличения числа пользователей приложения количество соответствующих одновременных запросов также будет продолжать расти.Постепенно одна база данных больше не может удовлетворять наши частые запросы на операции с базой данных.В некоторых сценариях нам может потребоваться настроить дополнительный источник данных, используя несколько источников данных (например, реализация разделения базы данных на чтение и запись) для снижения нагрузки на систему и т. д. Точно так же Springboot официально предоставляет соответствующие реализации, чтобы помочь разработчикам настроить несколько источников данных, обычно разделенных на два типа. пока знаю), субподряд и АОП, в которых АОП используется для реализации динамического переключения нескольких источников данных, будут написаны в другой статье. Учитывая, что mybatis — это платформа баз данных, часто используемая разработчиками Java, в этой статье для настройки нескольких источников данных используется Springboot+Mybatis.

Без лишних слов, поехали.

1. Подготовка базы данных:

Поскольку мы настраиваем несколько источников данных, мы должны сначала подготовить соответствующие источники данных.Здесь я создал две новые базы данных локально, как показано в следующей таблице:

база данных testdatasource1 testdatasource2
техническая спецификация sys_user sys_user2
поле user_id (int), user_name (varchar) user_age (int) такой же

И вставьте соответственно две записи, для удобства сравнения testdatasource1 — это Чжан Сан, которому 25 лет на фанняне, а testdatasource2 — это Ли Си, которому 30 лет на фанняне.

2. Подготовка окружающей среды

Сначала создайте новый проект Springboot, моя версия здесь 2.1.7.RELEASE, и введите соответствующие зависимости в файл pom: основные зависимости следующие:

        <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>
        </dependency>

На данный момент наша среда в основном настроена.

3. Раздел кода

1. Конфигурация нескольких источников данных

Прежде всего, настройте наш источник данных в нашем файле конфигурации Springboot. В отличие от предыдущего, поскольку у нас есть два источника данных, нам нужно указать имя соответствующей базы данных. Первичный источник данных является первичным, а вторичный источник данных — вторичным. следующим образом :

#配置主数据库
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/testdatasource1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

##配置次数据库
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/testdatasource2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver


spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

На что нам нужно обратить внимание, так это на то, что Springboot 2.0 должен использовать jdbc-url при настройке подключения к базе данных.Если используется только URL, он сообщит

jdbcUrl требуется с driverClassName Ошибка.

Создайте новый класс конфигурации PrimaryDataSourceConfig для настройки наших основных компонентов, связанных с базой данных.Код выглядит следующим образом:

@Configuration
@MapperScan(basePackages = "com.jdkcb.mybatisstuday.mapper.one", sqlSessionFactoryRef = "PrimarySqlSessionFactory")//basePackages:接口文件的包路径
public class PrimaryDataSourceConfig {

    @Bean(name = "PrimaryDataSource")
    // 表示这个数据源是默认数据源
    @Primary//这个一定要加,如果两个数据源都没有@Primary会报错
    @ConfigurationProperties(prefix = "spring.datasource.primary")//我们配置文件中的前缀
    public DataSource getPrimaryDateSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "PrimarySqlSessionFactory")
    @Primary
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("PrimaryDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations( 
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/one/*.xml"));
        return bean.getObject();// 设置mybatis的xml所在位置
    }
    
    
    @Bean("PrimarySqlSessionTemplate")
    // 表示这个数据源是默认数据源
    @Primary
    public SqlSessionTemplate primarySqlSessionTemplate(
            @Qualifier("PrimarySqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }

}

Примечания:

@MapperScan: Где настроить класс интерфейса mybatis

@Primary: указывает, что используется база данных по умолчанию, ее следует добавить, иначе будет сообщено об ошибке, поскольку не известно, какая база данных является базой данных по умолчанию.

@ConfigurationProperties: чтение сопоставления параметра конфигурации в application.properties в объект, где префикс представляет собой префикс параметра.

Вы закончили~~ Вы закончили? Нет, тогда настройте класс конфигурации нашего второго источника данных, код выглядит следующим образом:

@Configuration
@MapperScan(basePackages = "com.jdkcb.mybatisstuday.mapper.two", sqlSessionFactoryRef = "SecondarySqlSessionFactory")
public class SecondaryDataSourceConfig {

    @Bean(name = "SecondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource getSecondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "SecondarySqlSessionFactory")
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("SecondaryDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/two/*.xml"));
        return bean.getObject();// 设置mybatis的xml所在位置
    }
    @Bean("SecondarySqlSessionTemplate")
    public SqlSessionTemplate secondarySqlSessionTemplate(
            @Qualifier("SecondarySqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }

Осталось написать наш соответствующий xml-файл и класс интерфейса, код выглядит следующим образом:

@Component
@Mapper
public interface PrimaryUserMapper {
    List<User> findAll();
}


@Component
@Mapper
public interface SecondaryUserMapper {
    List<User> findAll();
}

Соответствующие 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.jdkcb.mybatisstuday.mapper.one.PrimaryUserMapper">

    <select id="findAll" resultType="com.jdkcb.mybatisstuday.pojo.User">
                select * from sys_user;
    </select>
</mapper>


<?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.jdkcb.mybatisstuday.mapper.two.SecondaryUserMapper">

    <select id="findAll" resultType="com.jdkcb.mybatisstuday.pojo.User">
                select * from sys_user2;
    </select>

</mapper>

Примечание. Каталог файла xml в этом примере: resources/mapping

2. Тест

Напишите контроллер для тестирования, потому что это тестовый экземпляр, а код относительно прост, поэтому уровень службы здесь не написан.

код показывает, как показано ниже:

@RestController
public class UserController {

    @Autowired
    private PrimaryUserMapper primaryUserMapper;
    @Autowired
    private SecondaryUserMapper secondaryUserMapper;
    @RequestMapping("primary")
    public Object primary(){
        List<User> list = primaryUserMapper.findAll();
        return list;
    }
    @RequestMapping("secondary")
    public Object secondary  (){
        List<User> list = secondaryUserMapper.findAll();
        return list;
    }
    

}

Введите в браузере:http://127.0.0.1:8080/primaryиhttp://127.0.0.1:8080/secondary

Результат выглядит следующим образом:

[{"user_id":1,"user_name":"张三","user_age":25}] //primary 
[{"user_id":1,"user_name":"李四","user_age":30}] //secondary

На этом Springboot в сочетании с mybatis для настройки нескольких источников данных завершен.

В конце концов, всем привет, я Хань Шу, гудите, следуйте за мной и ешьте привет фрукты (акимбо).

Не забудьте поставить лайк перед уходом~

Подождите минутку:

Соответствующий исходный код можно загрузить на мой github (добро пожаловать звездочка):

GitHub.com/Хан Шуайкан…