Spring Boot+Mybatis-Plus 다 중 데이터 원본 구현 방법

얼마 전에 my batis 를 기반 으로 한 다 중 데이터 소스 블 로 그 를 썼 습 니 다.느낌 이 좋 지 않 습 니 다.이번 에는 git 에 가입 하여 Mybatis-Plus 기반 다 중 데이터 원본 프로젝트 를 만 들 계획 입 니 다.Mybatis-Plus 선언:이 항목 은 마스터 데이터 원본 과 local 데이터 원본 으로 나 뉜 다.master 데이터 원본 을 온라인 데이터 베이스 로 가정 하고 local 은 로 컬 데이터 베이스 입 니 다.다음 에 저 희 는 xx-job 방식 을 통 해 온라인(master)의 데 이 터 를 로 컬(local)에 동기 화 할 것 입 니 다.
프로젝트 git 주 소 는 시간 을 내 서 프로젝트 를 git 창고 에 제출 하여 직접 복제 할 수 있 도록 합 니 다.
sql 파일 이 프로젝트 에 설치 되 어 있 습 니 다.데이터베이스 에 사용 되 는 my sql
프로젝트 생 성
내 가 사용 하 는 아이디어,정상적으로 spring boot 프로젝트 를 만 들 면 됩 니 다.
sql

--   master   
CREATE DATABASE db_master;

USE db_master;
--    
CREATE TABLE users(
	id INT PRIMARY KEY AUTO_INCREMENT COMMENT '  id',
	username VARCHAR(20) NOT NULL COMMENT '   ',
	pwd VARCHAR(50) NOT NULL COMMENT '  ',
	phone CHAR(11) NOT NULL COMMENT '   ',
	email VARCHAR(50) COMMENT '  ',
	gender CHAR(1) COMMENT '   1-->  0--> ',
	age INT COMMENT '  ',
	created_time TIMESTAMP NULL DEFAULT NULL COMMENT '    ',
	updated_time TIMESTAMP NULL DEFAULT NULL COMMENT '    ',
	deleted_time TIMESTAMP NULL DEFAULT NULL COMMENT '    ',
	type INT DEFAULT 1 COMMENT '   1-->   2-->   3-->   '
)ENGINE=INNODB;

INSERT INTO users(username,pwd,phone,email,gender,age) VALUES('supperAdmin','admin123','13000000000','[email protected]',1,20); 
INSERT INTO users(username,pwd,phone,email,gender,age) VALUES('admin','admin','13200840033','[email protected]',0,14); 
INSERT INTO users(username,pwd,phone,email,gender,age) VALUES('wanggang','wanggang','13880443322','[email protected]',1,36); 
INSERT INTO users(username,pwd,phone,email,gender,age) VALUES('xiaobao','xiaobao','18736450102','[email protected]',0,22); 
INSERT INTO users(username,pwd,phone,email,gender,age) VALUES('zhaoxing','zhaoxing','18966004400','[email protected]',1,29); 
INSERT INTO users(username,pwd,phone,email,gender,age) VALUES('chenyun','chenyun','13987613540','[email protected]',1,25); 
INSERT INTO users(username,pwd,phone,email,gender,age) VALUES('ouyangruixue','ouyangruixue','15344773322','[email protected]',0,24); 

--   local   
CREATE DATABASE db_local;

USE db_local;
--       
CREATE TABLE users(
	id INT PRIMARY KEY AUTO_INCREMENT COMMENT '  id',
	username VARCHAR(20) NOT NULL COMMENT '   ',
	pwd VARCHAR(50) NOT NULL COMMENT '  ',
	phone CHAR(11) NOT NULL COMMENT '   ',
	email VARCHAR(50) COMMENT '  ',
	gender CHAR(1) COMMENT '   1-->  0--> ',
	age INT COMMENT '  ',
	created_time TIMESTAMP NULL DEFAULT NULL COMMENT '    ',
	updated_time TIMESTAMP NULL DEFAULT NULL COMMENT '    ',
	deleted_time TIMESTAMP NULL DEFAULT NULL COMMENT '    ',
	type INT DEFAULT 1 COMMENT '   1-->   2-->   3-->   '
)ENGINE=INNODB;
--       
CREATE TABLE local_test(
	id INT PRIMARY KEY AUTO_INCREMENT,
	str VARCHAR(20)
)ENGINE=INNODB;
INSERT INTO local_test(str) VALUES ('Hello');
INSERT INTO local_test(str) VALUES ('World');
INSERT INTO local_test(str) VALUES ('Mysql');
INSERT INTO local_test(str) VALUES ('^.^');
pom 파일
현재 lombok,my batis-plus,my sql 관련 의존 만 도입 되 었 습 니 다.

	<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
		<!-- lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <!-- Mybatis-Plus -->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.2.0</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
application.yml
properties 삭제,yml 생 성.사실 yml 이 든 properties 든 상관 없어 요.

server:
 port: 8001

spring:
 datasource:
  master:
   url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
   username: root
   password: 123456
   driver-class-name: com.mysql.cj.jdbc.Driver

  local:
   url: jdbc:mysql://localhost:3306/db_local?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
   username: root
   password: 123456
   driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
 mapper-locations: classpath:mappers/*/*Mapper.xml
 #    ,  package         
 typeAliasesPackage: com.niuniu.sys.module
 check-config-location: true
 configuration:
  #            (camel case)  
  map-underscore-to-camel-case: true
  #                            
  cache-enabled: false
  call-setters-on-nulls: true
  #  JdbcTypeForNull, oracle       
  jdbc-type-for-null: 'null'
  #MyBatis                   NONE:       (   ), WARNING:              , FAILING:        ,          
  auto-mapping-unknown-column-behavior: warning
 global-config:
  banner: false
  db-config:
   #     0:"   ID  ", 1:"       ",2:"    ID (                     )", 3:"    ID (idWorker), 4:    ID (UUID), 5:       ID (idWorker       )";
   id-type: auto
   #       IGNORED:"    ", NOT_NULL:" NULL  ", NOT_EMPTY:"    ", DEFAULT    ,        (1.        NOT_NULL,2.            )
   field-strategy: NOT_EMPTY
   #          
   capital-mode: true
   #     
   logic-delete-value: 0
   #      
   logic-not-delete-value: 1

pagehelper:            #pagehelper    
 helperDialect: mysql     #       
 reasonable: true
 supportMethodsArguments: true
 params: count=countSql
디 렉 터 리 구조
이 항목 은 두 개의 데이터 원본 으로 나 뉘 기 때문이다.각 층 에서 master,local 을 각각 만 날 수 있 습 니 다.
在这里插入图片描述 : users , Users model 키 코드 config , master、local , , 또한 이 프로젝트 는 my batis-plus 를 사용 하기 때문에 SqlSession Factory 를 만 들 때 MybatisSqlSession Factory Bean 을 사용 하여 bean 대상 을 만 드 십시오.
在这里插入图片描述
로 컬 데이터 원본

package com.demo.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.demo.dao.local",
    sqlSessionFactoryRef = "localSqlSessionFactory")
public class LocalDataSourceConfig {
  @Value("${spring.datasource.local.driver-class-name}")
  private String driverClassName;
  @Value("${spring.datasource.local.url}")
  private String url;
  @Value("${spring.datasource.local.username}")
  private String username;
  @Value("${spring.datasource.local.password}")
  private String password;

  @Bean(name = "localDataSource")
  public DataSource localDataSource() {
    HikariDataSource dataSource = new HikariDataSource();
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setJdbcUrl(url);
    dataSource.setDriverClassName(driverClassName);
    dataSource.setMaximumPoolSize(10);
    dataSource.setMinimumIdle(5);
    dataSource.setPoolName("localDataSourcePool");
    return dataSource;
  }

  /**
   * local   
   */
  @Bean(name = "localSqlSessionFactory")
  public SqlSessionFactory sqlSessionFactory(@Qualifier("localDataSource") DataSource dataSource) throws Exception {
    MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    //   Mybatis      
    bean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
    bean.setMapperLocations(
        new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/local/*.xml"));
    return bean.getObject();
  }

  @Bean(name = "localTransactionManager")
  public DataSourceTransactionManager transactionManager(@Qualifier("localDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }

  @Bean(name = "localSqlSessionTemplate")
  public SqlSessionTemplate testSqlSessionTemplate(
      @Qualifier("localSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
}
마스터 데이터 원본

package com.demo.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.demo.dao.master",
    sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
  @Value("${spring.datasource.master.driver-class-name}")
  private String driverClassName;
  @Value("${spring.datasource.master.url}")
  private String url;
  @Value("${spring.datasource.master.username}")
  private String username;
  @Value("${spring.datasource.master.password}")
  private String password;

  @Bean(name = "masterDataSource")
  @Primary
  public DataSource masterDataSource() {
    HikariDataSource dataSource = new HikariDataSource();
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setJdbcUrl(url);
    dataSource.setDriverClassName(driverClassName);
    dataSource.setMaximumPoolSize(10);
    dataSource.setMinimumIdle(5);
    dataSource.setPoolName("masterDataSource");
    return dataSource;
  }


  /**
   * master   
   */
  @Bean(name = "masterSqlSessionFactory")
  @Primary
  public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
    MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    bean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
    bean.setMapperLocations(
        new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/master/*.xml"));
    return bean.getObject();
  }

  @Bean(name = "masterTransactionManager")
  @Primary
  public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }

  @Bean(name = "masterSqlSessionTemplate")
  @Primary
  public SqlSessionTemplate testSqlSessionTemplate(
      @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
}
부분 코드
Users 실체 클래스

package com.demo.model;

import lombok.Data;
import java.util.Date;

@Data
public class Users {
  private Integer id;
  private String username;
  private String pwd;
  private String phone;
  private String email;
  private Integer gender;
  private Integer age;
  private Date created_time;
  private Date updated_time;
  private Date deleted_time;
  private Integer type;
}
UsersMapper

package com.demo.dao.master;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.model.Users;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UsersMapper extends BaseMapper<Users> {
}
UsersService

package com.demo.service.master;

import com.baomidou.mybatisplus.extension.service.IService;
import com.demo.model.Users;

public interface UsersService extends IService<Users> {
}
UsersServiceImpl

package com.demo.service.master.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.demo.dao.master.UsersMapper;
import com.demo.model.Users;
import com.demo.service.master.UsersService;
import org.springframework.stereotype.Service;

@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements UsersService {
}
UsersController

package com.demo.controller.master;

import com.demo.model.Users;
import com.demo.service.master.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/master")
public class UsersController {
  @Autowired
  private UsersService userssService;
  
  @RequestMapping("/users")
  public List<Users> list() {
    return userssService.list();
  }
}
최종 프로젝트 구조
在这里插入图片描述
실행 결과
在这里插入图片描述
在这里插入图片描述
이로써 Spring Boot+Mybatis-Plus 는 다 중 데이터 원본 의 실현 을 마 쳤 습 니 다.
마지막 으로 제 가 만난 구 덩이 를 조금 만 더 써 주세요.
1.master 와 local 에 같은 이름 의 파일 이 나타 나 지 않도록 합 니 다.
2.데이터 원본 설정 에서 SqlSession Factory Bean 을 MybatisSqlSession Factory Bean 으로 대체 합 니 다.
다음 편 은 xx-job 작업 스케줄 링 센터 를 중심 으로 xx-job 를 통 해 로 컬 라 이브 러 리 와 온라인 라 이브 러 리 의 정시 동기 화 를 실현 하 는 방법 을 소개 합 니 다.
Spring Boot+Mybatis-Plus 의 다 중 데이터 원본 구현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Spring Boot Mybatis-Plus 다 중 데이터 원본 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기