環境
- 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}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/30 13:52
2018/01/05 17:43
2018/01/27 10:21