三、SpringBootは、複数のデータソースの統合とサブライブラリーサブテーブルをMyBatisの

序文

複数のデータソースの構成は多くの類似のオンラインチュートリアルがありますので、正直に言うと、この章では、話をするつもりはなかったです。しかし、最近では、プロジェクトのポイントは、ライブラリサブテーブルを使用するので、そう私は達成するためにどのように見て見てみましょう。私はブログが複数の環境を設定するために話した上で、さまざまな状況は、次のは、複数のライブラリはそれについて話をする環境で使用されるデータベースに呼び出すと思います。だから、これだけの記事。
私たちは、主に設定ファイルを高めるために、いくつかの追加や変更のブログの記事に基づいて、今日のプロジェクト構造で、プロジェクトを最初に見える二つのサブパッケージmapper1とmapper2に刻まれたDAOは以前UserMapperに移動しますでmapper1。まあ、テキストを開始します
ファイル

複数のデータソース構成

背景

これに先立ち、まず複数のデータソースがある理由について話します。プロジェクトが小さい場合には、もちろん、すべてのデータ処理や論理演算は同じライブラリであるということです。しかし、ビジネスの大規模な量は、それがサブライブラリーを考慮に入れるだろうというとき。私はまた、別のデータベースに格納されている記憶データを記録しますより。単一の場所インベントリ内やユーザー権限情報。これは単にサブライブラリーである場合は、2〜4データベースの使用上のプロジェクトは、このマルチデータソースの設定は意味、それを作ります。設定ファイルで構成されたこれらのデータソースは、独自のアイデンティティを持っています。ブート時にロードされたプロジェクトは、データソース接続インスタンスだけで罰金れているライブラリを使用したいと考えており、初期化した後、呼び出されたときにされています。

あなたは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();
    }

}

これは、二つのデータソースのデータソースを定義します。我々は、設定ファイル1と2に設定されています。ノート@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のが成功したことを示しています。最も重要なことは、設定パッケージの下の3クラス構成です。他のすべてがそう戻って、私は、あなたが練習したいコードは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

従って、是非♡

個人の社会的関心の番号へようこそ「プログラマは、ヨーグルトが大好きです」

Javaの、Linuxでは、ビッグデータを含む学習教材の多様性を共有します。自分自身と高品質の技術のブログの配信を共有しながら情報は、ビデオドキュメントとソースコードが含まれています。

あなたが注目を好きよ❤を共有することを覚えていれば
ファイル

おすすめ

転載: www.cnblogs.com/quellanan/p/11564099.html