세, SpringBoot는 여러 데이터 소스 및 하위 라이브러리 하위 테이블의 통합을 MyBatis로

머리말

여러 데이터 소스의 구성은 많은 유사한 온라인 자습서가 있기 때문에 솔직히 말해서,이 장에서는 말을하려고하지 않았다. 프로젝트 점 라이브러리 하위 테이블을 사용하기 때문에 그러나 최근, 그래서 저를 달성하는 방법을 볼 수 살펴 보자. 나는 블로그가 여러 환경을 구성하는 이야기에, 다른 상황은 그 다음 더 라이브러리가 얘기 할 수있는 환경에서 사용되는 데이터베이스에 전화를 생각합니다. 따라서이 문서.
우리는 먼저 DAO는 두 개의 하위 패키지 mapper1에 새겨진, 주로 설정 파일을 높이기 위해 일부 추가 및 변경에 대한 블로그 게시물을 기반으로 프로젝트의 현재 프로젝트 구조를보고 mapper2 이전 UserMapper로 이동합니다 mapper1한다. 음, 텍스트를 시작합니다
파일

여러 데이터 소스 구성

배경

이에 앞서 우리는 먼저 여러 데이터 소스가있는 이유에 대해 이야기한다. 프로젝트가 작은 경우, 물론, 모든 데이터 처리 및 로직 작업이 동일한 라이브러리 점이다. 그러나 사업의 다량, 그것은 하위 라이브러리 고려해야 할 때. 또한 별도의 데이터베이스에 저장된 저장 데이터를 기록합니다보다. 한 곳의 재고 또는 사용자 권한 정보를 제공합니다. 이 단순히 서브 라이브러리 인 경우,이 데이터베이스 4의 사용에 대한 프로젝트,이 다중 데이터 소스 구성은 이해를합니다. 구성 파일에 구성된 이러한 데이터 소스는 고유 ID를 가지고 있습니다. 잘되는 데이터 소스 연결 인스턴스에있는 라이브러리를 사용하고자하는 호출시에 부팅시로드 프로젝트는 초기화되고있다.

직접 다음 MyBatis로 통합 스프링을 사용하지 않는 경우 JdbcTemplate을 선택한 다음 여러 데이터 소스, 비교적 간단한의 사용을 구성되어 있지만, 통합의 MyBatis는, 그것은 상대적으로 더 복잡하다. 우리는 단계별로 설명합니다.

구성 파일을 수정

, 응용 프로그램 dev.yml 파일을 열고 데이터 소스를 추가합니다.

#开发环境
spring:
  # 数据源配置
  datasource:
    one:
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: jdbc:mysql://192.168.252.53:3306/zlflovemm?characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=CONVERT_TO_NULL
      username: root
      password: 123456
      max-idle: 10
      max-wait: 10000
      min-idle: 5
      initial-size: 5
    two:
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: jdbc:mysql://192.168.252.53:3306/zlfdb?characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=CONVERT_TO_NULL
      username: root
      password: 123456
      max-idle: 10
      max-wait: 10000
      min-idle: 5
      initial-size: 5

당신이 위의 springboot 2.0을 사용하는 경우, 다음 드라이버 클래스 이름과주의 주목해야한다
JDBC-URL이 아니라 driverClassName 및 URL보다 더합니다. 여기에 구덩이에 대해 당신을 생각 나게 할 수있다.

구성 데이터 소스

다음으로, 우리는 설정에서 DataSourcesConfig 클래스를 생성, 수동으로 어떤 데이터 소스를로드 할 필요

@Configuration
public class DataSourcesConfig {

    @Bean(name="dbOne")
    @ConfigurationProperties(prefix = "spring.datasource.one")
    @Primary
    DataSource dbOne(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name="dbTwo")
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dbTwo(){
        return DataSourceBuilder.create().build();
    }

}

이 두 개의 데이터 소스 데이터 소스를 정의합니다. 우리는 구성 파일 하나와 두 개의 구성됩니다. 참고 @primary 기본 데이터 소스를 나타냅니다.

MyBatisConfigOne 类

@Configuration
@MapperScan(basePackages = "com.quellan.zlflovemm.dao.mapper1",sqlSessionFactoryRef = "sqlSessionFactory1",sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {
    @Resource(name = "dbOne")
    DataSource dbOne;

    @Bean
    @Primary
    SqlSessionFactory sqlSessionFactory1()throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dbOne);
        return bean.getObject();
    }
    @Bean
    @Primary
    SqlSessionTemplate sqlSessionTemplate1() throws Exception{
        return new SqlSessionTemplate(sqlSessionFactory1());
    }
}

MyBatisConfigTwo 类

@Configuration
@MapperScan(basePackages = "com.quellan.zlflovemm.dao.mapper2",sqlSessionFactoryRef = "sqlSessionFactory2",sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
    @Resource(name = "dbTwo")
    DataSource dbTwo;

    @Bean
    SqlSessionFactory sqlSessionFactory2()throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dbTwo);
        return bean.getObject();
    }
    @Bean
    SqlSessionTemplate sqlSessionTemplate2()throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory2());
    }
}

파일 사이에도 차이가 있습니다 :
파일

dao 层

DAO 층과 두 개의 패키지 mapper1 mapper2를 생성한다. UserMapper 만하는 데이터 소스를 구별하는 서로 다른 패키지에 똑같은 콘텐츠 타입 패키지. 그리고 어제는 동일합니다.

public interface UserMapper {

    @Select("select id,username as userName,password,email,role_code as roleCode,gmt_create as gmtCreate,gmt_update as gmtUpdate,nickname as nickName,user_create as userCreate from sys_user")
    List<UserEntry> findUserList();


    @Insert({"insert into sys_user(username,password,email) values('${user.userName}','${user.password}','${user.email}')"})
    int add(@Param("user") UserEntry user);

    @Delete("delete from sys_user where id = #{id}")
    int delete(int id);
}

서비스 계층

UserService 인터페이스

public interface UserService {

    List<UserEntry> findUserList();

    int addUser(String userName,String password,String email);

    int deleteUser(int id);

    List<UserEntry> findUserList2();

    int addUser2(String userName,String password,String email);

    int deleteUser2(int id);
}

UserServiceImpl 카테고리 :

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    protected UserMapper userMapper;

    @Autowired
    protected UserMapper2 userMapper2;


    @Override
    public List<UserEntry> findUserList() {
        return userMapper.findUserList();
    }

    @Override
    public int addUser(String userName, String password, String email) {
        UserEntry user=new UserEntry();
        user.setUserName(userName);
        user.setPassword(password);
        user.setEmail(email);
        return userMapper.add(user);
    }

    @Override
    public int deleteUser(int id) {
        return userMapper.delete(id);
    }

    @Override
    public List<UserEntry> findUserList2() {
        return userMapper2.findUserList();
    }

    @Override
    public int addUser2(String userName, String password, String email) {
        UserEntry user=new UserEntry();
        user.setUserName(userName);
        user.setPassword(password);
        user.setEmail(email);
        return userMapper2.add(user);
    }

    @Override
    public int deleteUser2(int id) {
        return userMapper2.delete(id);
    }
}

컨트롤러 레이어

userController

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public List<UserEntry> findUserList(){
        return userService.findUserList();
    }

    @RequestMapping(value = "/add",method = RequestMethod.GET)
    public String addUser(@RequestParam(value = "userName")String uaserName,@RequestParam(value = "password")String password,@RequestParam(value = "email")String email){
        int falg=userService.addUser(uaserName,password,email);
        if(falg>0){
            return "success";
        }
        return "error";
    }
        
    @RequestMapping(value = "/delete",method = RequestMethod.GET)
    public String deleteUser(@RequestParam(value = "id")int id){
        if(userService.deleteUser(id)>0){
            return "success";
        }
        return "error";
    }

    @RequestMapping(value = "/list2",method = RequestMethod.GET)
    public List<UserEntry> findUserList2(){
        return userService.findUserList2();
    }

    @RequestMapping(value = "/add2",method = RequestMethod.GET)
    public String addUser2(@RequestParam(value = "userName")String uaserName,@RequestParam(value = "password")String password,@RequestParam(value = "email")String email){
        int falg= userService.addUser2(uaserName,password,email);
        if(falg>0){
            return "success";
        }
        return "error";
    }

    @RequestMapping(value = "/delete2",method = RequestMethod.GET)
    public String deleteUser2(@RequestParam(value = "id")int id){
        if(userService.deleteUser2(id)>0){
            return "success";
        }
        return "error";
    }
}

테스트

파일
파일
당신은 다른 라이브러리에서 곡 밖에 볼 수 있습니다. 이것은 우리의 springboot 여러 데이터 소스를 통합 MyBatis로는 성공한 구성을 보여준다. 가장 중요한 것은 설정 패키지에서 세 개의 클래스 구성입니다. 다른 모든 그래서 다시 내가 연습하려는 코드가 github에 동기화되는 방법을 말하지 않았다, 일반적인 비즈니스 로직, 당신은 연습에 아래의 소스 코드를 얻을 수 있습니다.

우리는이 springboot 다중 데이터 소스가 구성되어 MyBatis로 통합,하지만 우리는 서브 패키지의 수를 생성 한 DAO 계층을 구분하는 데 사용되는 여러 데이터 소스를 구성 할 경우 우리는 아래 구성을 볼 수 있습니다. 우리가 큰 데이터의 양이 충분히 여러 도서관이 할 대신 하위 라이브러리 서브 테이블을 할 수 있다면?

하위 라이브러리 하위 테이블

배경

사실, 하위 라이브러리 하위 테이블과 다중 데이터 소스는 모든 구성에서 매우 비 대한 모습을 구성하는 것이 더 연결 같은, 추가 데이터 소스이며, 그래서 다른 방법을 찾아야했다. 하위 라이브러리 하위 표는 주요 도서관과 동적 로딩에서 다양한 지점을 연결하는 라이브러리를 읽고, 연결 중앙 도서관에서 프로젝트를 구성하는 것입니다, 그 인터페이스는 하위 라이브러리의 연결 지점을로드 할 라이브러리를 호출하고 싶습니다.
지금은 그들이 직접 너무 많이하지 문제가 실현 될 수 MyBatis로의 JdbcTemplate을 통합하지 않기 때문에 프로젝트를 수행합니다.

생각

주로 두 개의 클래스에,
GetDynamicJdbcTemplate 카테고리 : 수동으로 연결을 만들 수 있습니다.

/**
 * @ClassName GetDynamicJdbcTemplate
 * @Description 获取动态的jdbcTemplate
 * @Author zhulinfeng
 * @Date 2019/9/20 14:35
 * @Version 1.0
 */
public class GetDynamicJdbcTemplate {

    private  String driverClassName;
    private  String url;
    private  String dbUsername;
    private  String dbPassword;
    private JdbcTemplate jdbcTemplate;

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    public GetDynamicJdbcTemplate(String driverClassName, String url, String dbUsername, String dbPassword){
        this.driverClassName=driverClassName;
        this.url=url;
        this.dbUsername=dbUsername;
        this.dbPassword=dbPassword;
        this.jdbcTemplate=new JdbcTemplate(getDataSource());
    }

    public DriverManagerDataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(dbUsername);
        dataSource.setPassword(dbPassword);
        return dataSource;
    }
}

프로젝트가 시작 GetJdbcTemplateMap 클래스는, 모든 연결 지점은 도서관 맵에 생성되는 주요 라이브러리 구성을 읽습니다. 우리는 펜 테이블에 따라, 프론트 엔드 인터페이스를 사용하면 통화가 연결되어있을 때 사용할 데이터베이스를 알 수있는 도시를 건너한다.


@Component
@Slf4j
    public class GetJdbcTemplateMap implements ApplicationRunner {

    @Autowired
    @Qualifier("baseTemplate")
    private JdbcTemplate jdbcTemplate;

    public static Map<String,JdbcTemplate> JdbcTemplateMap=new HashMap<>();

    @Override
    public void run(ApplicationArguments args) throws Exception {
        String sql="CALL proc_baseinfo_cfg_dbsetting_query()";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        if(list!=null && !list.isEmpty()){
            insertMap(list);
        }
    }

    private void insertMap(List<Map<String, Object>> list){
        for(Map<String, Object> map :list){
            String url="jdbc:mysql://"+map.get("serverip")+":"+map.get("dbport")+"/"+map.get("dbname")+"?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull";
            log.info(url);
            String  dbUsername=  map.get("user").toString();
            String  dbPassword=  map.get("password").toString();
            GetDynamicJdbcTemplate getDynamicJdbcTemplate=new GetDynamicJdbcTemplate(ConstantClass.DRIVERCLASSNAME,url,dbUsername,dbPassword);
            JdbcTemplate jdbcTemplate=getDynamicJdbcTemplate.getJdbcTemplate();
            JdbcTemplateMap.put(map.get("cityid").toString(),jdbcTemplate);
        }
    }
}

파일

전화 인터페이스도 매우 편리합니다.
파일

그러나 그것은 당신에게 아이디어를 제공하기 위해 여기에 제공, 우리의 고유 한 비즈니스와도 통합되지 MyBatis를위한 이상 말하기, 그래서 난 내 자신의 프로젝트를 작성하지 않았다.

번외

이것은 완성 된 것으로 간주 될 수있다, 그래서 아이디어를 수정해야 할 따라 다음을, 그리고 첫번째에있는, 쓰기가 매우 좋지 않아 느끼지만, 수정하는 방법을 모르겠어요. 왜 올 Thymeleaf 페이지를 통합달라고하지 않습니다. 더 GET 내가 전면과 후면 끝의 후 분리를하고 싶지 않습니다, 때문에 이유는 인터페이스를 형성하기 위해 호출됩니다. 그래서 나는 다시 백엔드, 프론트 - 엔드 통합의 좋은 부분을 구축하는 우선 싶습니다.
음, 너무 많은 당신을 위해, 오늘의 코드는 GitHub의 친구의 프로젝트에 동기화됩니다.
GitHub의 주소 : HTTPS : //github.com/QuellanAn/zlflovemm

따라 오세요 ♡

개인 공공 우려 번호에 오신 것을 환영합니다 "프로그래머는 요구르트를 좋아한다"

자바, 리눅스, 빅 데이터 등 학습 자료의 다양성을 공유 할 수 있습니다. 자신과 고품질의 기술 블로그의 전달을 공유하면서 정보, 비디오, 문서 및 소스 코드가 포함되어 있습니다.

당신은주의를 좋아하고 요 ❤을 공유하는 기억한다면
파일

추천

출처www.cnblogs.com/quellanan/p/11564099.html