spring boot my batis 다 중 데이터 소스 솔 루 션 프로 세 스 분석

저희 프로젝트 에서 한 프로젝트 에서 여러 개의 데이터 원본 을 사용 해 야 하 는 문제 가 발생 할 수 있 습 니 다.예 를 들 어 제 가 한 작업 을 받 아 사용자 의 채 팅 기록 을 이전 할 때 세 개의 데이터 원본 을 사 용 했 습 니 다.그 당시 에 사용 한 AOP 의 프로 그래 밍 방식 은 방문 하 는 방법 에 따라 동적 으로 데이터 원본 을 전환 하고 성능 이 좋 지 않다 고 생각 했 습 니 다.먼저 또 하나의 사용 방식 을 새로 사 용 했 는데,괜 찮 은 것 같 아서 기록 해 두 었 다.
DEMO 프로젝트 를 소개 합 니 다.사용 하 는 spring boot 통합 my batis,my batis 조회 데이터 베 이 스 는 주해 형식 으로 조회 되 며,목적 은 두 개의 데이터 베이스 test 1 과 test 2 의 사용자 정 보 를 조회 하고 콘 솔 에서 인쇄 합 니 다.
1.pom 파일

<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>2.1.1</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.10</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
      <version>5.1.27</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>
            **/*.xml
          </include>
        </includes>
      </resource>
      <resource>
        <directory>src/resources</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
그 중에서 알 리 바 바 의 druid 데이터 원본 을 추 가 했 습 니 다.spring boot 의 기본 hikacp 대신 my sql 의 구동 버 전 번 호 는 자신 이 사용 하 는 my sql 버 전 번호 와 일치 해 야 합 니 다.그 중에서 build 모듈 안의 resources 안 은 spring boot 이 src/main/자바 의 XML 파일 을 걸 러 내 는 것 을 방지 하기 위해 서 입 니 다.왜냐하면 어떤 사람들 은 my batsi 가 데이터 베 이 스 를 조회 할 때 XML 맵 파일 을 사용 하 는 것 을 좋아 하지만 우 리 는 이번에 주석 형식 을 사용 하기 때문에안의 내용 은 프로젝트 에서 사용 되 지 않 습 니 다.주 해 를 직접 사용 하면 이 내용 을 무시 할 수 있 습 니 다.
2.사용자 클래스

public class User {
  public Integer id;
  public String name;
  public String address;

  @Override
  public String toString() {
    return "User{" +
        "id=" + id +
        ", name='" + name + '\'' +
        ", address='" + address + '\'' +
        '}';
  }
    //get set    ...........
}
사용자 클래스 는 할 말 이 없고 기본 적 인 몇 가지 속성 입 니 다.
3.application.properties 파일 설정

spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.username=root
spring.datasource.one.password=123456
spring.datasource.one.url=jdbc:mysql://localhost:3306/test1

spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.username=root
spring.datasource.two.password=123456
spring.datasource.two.url=jdbc:mysql://localhost:3306/test2
여 기 는 주로 두 개의 데이터베이스 에 접근 하 는 속성 을 설정 합 니 다.두 개의 접두사 가 다 르 기 때문에 아래 에서 spring boot 와 같은 보안 속성 을 사용 하여 서로 다른 데이터 원본 을 만 드 는 데 편리 합 니 다.
4.접두사 에 따라 데이터 원본 생 성

@Configuration
public class DataSourceConfig {
  @Bean
  @ConfigurationProperties(prefix = "spring.datasource.one")
  public DataSource dsOne(){
    return DruidDataSourceBuilder.create().build();
  }
  @Bean
  @ConfigurationProperties(prefix = "spring.datasource.two")
  public DataSource dsTwo(){
    return DruidDataSourceBuilder.create().build();
  }
}
이 종 류 는 홈 디 렉 터 리 의 config 디 렉 터 리 아래 에 있 습 니 다.@ConfigurationProperties 주 해 를 사용 하여 해당 하 는 DataSource 가 만 들 때 사용 하 는 프로필 의 내용 을 표시 합 니 다.
5.홈 디 렉 터 리 아래 에 각각 mapper 1 과 mapper 2 패 키 지 를 만 들 고 해당 하 는 패키지 아래 에 해당 하 는 데이터 계층 접근 인터페이스 UserMapper 1 과 UserMapper 2 를 만 듭 니 다.내용 은 다음 과 같 습 니 다.

@Mapper
public interface UserMapper1 {
  @Select("select * from users")
  List<User> getAllUser();
}
이 인터페이스 에 서 는 간단 한 my tatis 의 주 해 를 바탕 으로 모든 사용자 의 인 터 페 이 스 를 조회 하 는 것 이 라 고 할 수 없다.
6.config 패키지 아래 에 서로 다른 설정 류 MybatisConfigOne 과 MybatisConfigTwo 두 가지 종 류 를 만 들 고 각각 mapper 1 과 mapper 2 두 경로 아래 의 dao 층 인 터 페 이 스 를 스 캔 합 니 다.

@Configuration
@MapperScan(basePackages = "com.hopec.mybatis.mapper1",sqlSessionFactoryRef = "sqlSessionFactory1",
    sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MybatisConfigOne {
  @Autowired
  @Qualifier("dsOne")
  DataSource ds1;
@Bean
  SqlSessionFactory sqlSessionFactory1(){
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(ds1);
    try {
      return bean.getObject();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
  @Bean
  SqlSessionTemplate sqlSessionTemplate1(){
    return new SqlSessionTemplate(sqlSessionFactory1());
  }
}

public class MybatisConfigTwo {
  @Autowired
  @Qualifier("dsTwo")
  DataSource ds2;
@Bean
  SqlSessionFactory sqlSessionFactory2(){
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(ds2);
    try {
      return bean.getObject();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
  @Bean
  SqlSessionTemplate sqlSessionTemplate2(){
    return new SqlSessionTemplate(sqlSessionFactory2());
  }
}
7.테스트

@SpringBootTest
class MybatisApplicationTests {
  @Autowired
  UserMapper1 userMapper1;
  @Autowired
  UserMapper2 userMapper2;
  @Test
  void contextLoads() {
    List<User> users = userMapper1.getAllUser();
    System.out.println(users);
    List<User> allUser = userMapper2.getAllUser();
    System.out.println(allUser);

  }
}
테스트 결과:

여러 개의 데이터 원본 을 사용 하려 면 계속 증가 하면 됩 니 다.ok,큰 성 과 를 거 두 었 습 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기