序文
複数のデータソースの構成は多くの類似のオンラインチュートリアルがありますので、正直に言うと、この章では、話をするつもりはなかったです。しかし、最近では、プロジェクトのポイントは、ライブラリサブテーブルを使用するので、そう私は達成するためにどのように見て見てみましょう。私はブログが複数の環境を設定するために話した上で、さまざまな状況は、次のは、複数のライブラリはそれについて話をする環境で使用されるデータベースに呼び出すと思います。だから、これだけの記事。
私たちは、主に設定ファイルを高めるために、いくつかの追加や変更のブログの記事に基づいて、今日のプロジェクト構造で、プロジェクトを最初に見える二つのサブパッケージ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では、ビッグデータを含む学習教材の多様性を共有します。自分自身と高品質の技術のブログの配信を共有しながら情報は、ビデオドキュメントとソースコードが含まれています。
あなたが注目を好きよ❤を共有することを覚えていれば