質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Q&A

1回答

9091閲覧

mybatis-springで、動的に生成したデータソースを使用する方法

kitonmr109

総合スコア7

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

1グッド

0クリップ

投稿2016/06/08 08:43

編集2022/01/12 10:55

DBの設定情報は、可変のため設定ファイルではなく別のマスターDBにあります。そのためデータソースは@Autowiredで自動生成ではなく、動的に生成しないといけません。このように、作成したデータソースをどのようにすればmybatis-springで使えるようになるのでしょうか。そもそも不可能なのでしょうか…。よろしくお願いします。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A-pZ

2016/06/08 08:54

"複数データソースを使用する方法"ではなく、"動的に生成したデータソースを使用する方法"が正しいタイトルではないかと思われます。
guest

回答1

0

詳しい状況がわからないのでふわっとした回答になりますが、SpringのdataSource設定のurluser, passwordなどを定数ではなくDBから取得した値にするにはどうしたらいいか?という質問でよろしいでしょうか。

その場合、DB設定が入っているマスターDBにアクセスするdataSourceとマッパーを作り、そのマッパーを使ってDBから値を取得し、取得した値をbeanとして登録するようなBeanFactoryを作ればいいと思います。dataSourceの方では、<property name="url" ref="dbUrl"/>のように、作成したBeanFactoryによって生成されたbeanを参照する記述にすればいいでしょう。

かなり適当ですが、bean定義のxmlの例を載せてみます。

xml

1 <context:component-scan base-package="com.teratail"/> 2 <!-- マスターDBのMyBatis設定 --> 3 <bean id="masterDataSource" 4 class="org.apache.commons.dbcp.BasicDataSource"> 5 <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> 6 <property name="url" value="jdbc:mysql://localhost:3306/teratail"/> 7 <property name="username" value="root"/> 8 <property name="password" value=""/> 9 <property name="initialSize" value="50"/> 10 <property name="maxActive" value="50"/> 11 </bean> 12 <bean id="sqlSessionFactory" 13 class="org.mybatis.spring.SqlSessionFactoryBean"> 14 <property name="dataSource" ref="masterDataSource"/> 15 <property name="mapperLocations" value="classpath*:mappers/*.xml"/> 16 </bean> 17 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 18 <property name="basePackage" value="com.teratail.mappers"/> 19 </bean> 20 21 <!-- マスターDBから読み込んだDB設定情報 --> 22 <bean id="dbConfigFactoryBean" class="com.teratail.factories.DbConfigFactoryBean"/> 23 <bean id="url" factory-bean="dbConfigFactoryBean" factory-method="url"/> 24 <bean id="port" factory-bean="dbConfigFactoryBean" factory-method="port"/> 25 <bean id="user" factory-bean="dbConfigFactoryBean" factory-method="user"/> 26 <bean id="password" factory-bean="dbConfigFactoryBean" factory-method="password"/> 27 <!-- 本来アクセスしたいDBのdataSource --> 28 <bean id="dataSource" 29 class="org.apache.commons.dbcp.BasicDataSource"> 30 <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> 31 <property name="url" ref="url"/> 32 <property name="username" ref="user"/> 33 <property name="password" ref="password"/> 34 <property name="initialSize" value="50"/> 35 <property name="maxActive" value="50"/> 36 </bean>

序盤はマスターDBにアクセスするためのMybatisの設定です。マスターDBの設定には定数を使えるわけですよね?肝となるのが中盤で、序盤の設定で作成したマッパーを用いてマスターDBからDB設定を取得し、urluserなどを返すメソッドを定義しているBeanFactoryを定義しています。BeanFactoryの中身はこんな感じになるでしょう。

java

1package com.teratail.factories; 2 3import com.teratail.entities.DbConfig; 4import com.teratail.mappers.DbConfigMapper; 5import org.springframework.beans.factory.annotation.Autowired; 6 7public class DbConfigFactoryBean { 8 private final DbConfigMapper dbConfigMapper; 9 private final DbConfig dbConfig; 10 11 @Autowired 12 public DbConfigFactoryBean(DbConfigMapper dbConfigMapper) { 13 this.dbConfigMapper = dbConfigMapper; 14 this.dbConfig = dbConfigMapper.findOne(); 15 } 16 17 public String url() { 18 return dbConfig.getUrl(); 19 } 20 21 public int port() { 22 return dbConfig.getPort(); 23 } 24 25 public String user() { 26 return dbConfig.getUser(); 27 } 28 29 public String password() { 30 return dbConfigMapper.all().getPassword(); 31 } 32}

DbConfigというのはDB設定情報を格納するために適当に作ったクラスです。で、上記のクラスが返す値をbeanとしてDIコンテナに登録するための記述がBeanFactory定義の下に続いています。

これらのbeanが定義できたら、その値を参照するようなdataSourceを最後に定義して終わりです。こうすれば起動時にマスターDBからDB設定情報を持ってこれるようになります。

投稿2016/08/12 10:20

編集2016/08/12 10:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問