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

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

ただいまの
回答率

91.37%

  • Java

    10446questions

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

  • Spring Boot

    243questions

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

  • MyBatis

    39questions

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

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

受付中

回答 1

投稿 2017/11/21 21:10

  • 評価
  • クリップ 1
  • VIEW 84

yuji38kwmt

score 371

 環境

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

 現状

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

public class UserDaoImpl implements UserDao {

  @Autowired
  private SqlSession sqlSession;

  public User getUser(String userId) {
    return (User) sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
  }

  public void insert(List<String> names) {
    for(String name : names) {
      sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.insertUser", name);
    }
  }

}

 やりたいこと

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

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

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

 質問

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

  • SELECT文:通常のsqlSession
  • INSERT文:BatchのsqlSession
public class UserDaoImpl implements UserDao {

  @Autowired
  private SqlSession sqlSession;

  @Autowired
  private SqlSession batchSqlSession;

  public User getUser(String userId) {
    return (User) sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
  }

  public void insert(List<String> names) {
    for(String name : names) {
      batchSqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.insertUser", name);
    }
  }

}

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import lombok.RequiredArgsConstructor;

@Configuration
@RequiredArgsConstructor
public class ApplicationConfig {

    private final SqlSessionFactory sqlSessionFactory;

    @Bean
    public SqlSession sqlSession() {
        SqlSessionTemplate sqlSession = new SqlSessionTemplate(sqlSessionFactory);

        return sqlSession;
    }

    @Bean
    public SqlSession batchSqlSession() {
        SqlSessionTemplate sqlSession = new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);

        return sqlSession;
    }
}

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

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

投稿 2017/11/28 02:14

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • Java

    10446questions

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

  • Spring Boot

    243questions

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

  • MyBatis

    39questions

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