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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MyBatis

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3106閲覧

MyBatis-Spring-Boot-Starterで、BatchのSqlSessionを発行する方法

yuji38kwmt

総合スコア437

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MyBatis

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2017/11/21 12:10

編集2018/01/27 13:05

環境

  • Spring Boot 1.5.7
  • MyBatis-Spring-Boot-Starter: 1.3.1

現状

MyBatis-Spring-Boot-Starterを使って、データベースにアクセスしています。
具体的には以下のようなコードです。
http://www.mybatis.org/spring/ja/sqlsession.html

java

1public class UserDaoImpl implements UserDao { 2 3 @Autowired 4 private SqlSession sqlSession; 5 6 public User getUser(String userId) { 7 return (User) sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); 8 } 9 10 public void insert(List<String> names) { 11 for(String name : names) { 12   sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", name); 13 } 14 } 15 16}

やりたいこと

insertメソッドでは複数回DBにアクセスしていますが、これを1回のアクセスにしたいです。
具体的には、MyBatisのExecutorType.BATCHを使いたいです。

全ての更新ステートメントをバッチで実行し、途中で SELECT が実行される場合は、より分かりやすい動作となるよう必要に応じてトランザクション境界を設定します。

http://www.mybatis.org/mybatis-3/ja/java-api.html

質問

以下のコードのように、sqlSessionを使い分けたいです。

  • SELECT文:通常のsqlSession
  • INSERT文:BatchのsqlSession

java

1public class UserDaoImpl implements UserDao { 2 3 @Autowired 4 private SqlSession sqlSession; 5 6 @Autowired 7 private SqlSession batchSqlSession; 8 9 public User getUser(String userId) { 10 return (User) sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); 11 } 12 13 public void insert(List<String> names) { 14 for(String name : names) { 15   batchSqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", name); 16 } 17 } 18 19}

設定ファイルなどはどのように記述すればよいでしょうか?
公式サイトにも、以下のようにExecutorType.Batchの使い方が記載されていますが、Springをまだ理解していないため、どのように実装すればよいかが分かりません。

xml

1<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 2 <constructor-arg index="0" ref="sqlSessionFactory" /> 3 <constructor-arg index="1" value="BATCH" /> 4</bean>

http://www.mybatis.org/spring/ja/sqlsession.html

【追記】

「ベストアンサー」の方法で問題は解決しました。
しかし、@Mapperクラスが存在しているとエラーが発生しました。

java

1@Mapper 2public interface CityMapper { 3 @Select("select * from city") 4 City findCity(); 5}
*************************** APPLICATION FAILED TO START *************************** Description: file [C:\MyProgram\pleiades_4.7\workspace\demo2\target\classes\com\example\demo2\mybatis\mapper\CityMapper.class] required a single bean, but 2 were found: - sqlSession: defined by method 'sqlSession' in class path resource [com/example/demo2/ApplicationConfig.class] - sqlSessionTemplate: defined by method 'sqlSessionTemplate' in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class] Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

「1個のbeanを期待してけているけど、2個見つかった」と言っています。
@Primaryを付けて、解決しました。

java

1 @Bean 2 @Primary 3 public SqlSession sqlSession() { 4 SqlSessionTemplate sqlSession = new SqlSessionTemplate(sqlSessionFactory); 5 6 return sqlSession; 7 } 8}

また、@QualifierでSqlSessionを特定しました。

java

1public class UserDaoImpl implements UserDao { 2//... 3 @Autowired 4 @Qualifier("batchSqlSession") 5 private SqlSession batchSqlSession; 6}

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

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

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

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

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

guest

回答1

0

ベストアンサー

SpringBootをもしお使いであれば、Configurationクラスにて以下のように通常用のSqlSessionと、バッチ用のSqlSessionを作ると良いです。

java

1import org.apache.ibatis.session.ExecutorType; 2import org.apache.ibatis.session.SqlSession; 3import org.apache.ibatis.session.SqlSessionFactory; 4import org.mybatis.spring.SqlSessionTemplate; 5import org.springframework.context.annotation.Bean; 6import org.springframework.context.annotation.Configuration; 7 8import lombok.RequiredArgsConstructor; 9 10@Configuration 11@RequiredArgsConstructor 12public class ApplicationConfig { 13 14 private final SqlSessionFactory sqlSessionFactory; 15 16 @Bean 17 public SqlSession sqlSession() { 18 SqlSessionTemplate sqlSession = new SqlSessionTemplate(sqlSessionFactory); 19 20 return sqlSession; 21 } 22 23 @Bean 24 public SqlSession batchSqlSession() { 25 SqlSessionTemplate sqlSession = new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH); 26 27 return sqlSession; 28 } 29}

利用するクエリに合わせて、sqlSessionのインスタンスを使い分けて利用できます。(提示していただいたRepositoryやDaoのコードそのままお使いに慣れます)

ポイントは、SqlSessionFactoryもSpring-MybatisプラグインからConfigurationクラスにてインスタンスを拝借して、SqlSessionTemplateを生成するために必要な、SqlSessionFactoryを渡すことが可能です。

投稿2017/11/27 17:14

A-pZ

総合スコア12011

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

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

yuji38kwmt

2017/12/30 13:52

回答が遅くなってすみません。 BatchでSQLを実行することができました! ありがとうざいます。
A-pZ

2018/01/05 17:43

d(・ω・
yuji38kwmt

2018/01/27 10:21

@Mapperを付与したクラスが存在すると、エラーになったので(質問の追記参考)、`@Primary`を付与しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問