iBATIS3(mybatis) Configration.xml に、複数のDB接続先を書いた認識が、
成功したので、Google guice での Module を用意してみた
http://blog.zaq.ne.jp/oboe2uran/article/459/ がベースになっている
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.matcher.Matchers;
import com.google.inject.multibindings.MapBinder;
/**
* 複数DB接続用、SqlSessionFactory または、トランザクション インターセプタをバインド.
*/
public class MultiIBatisModule extends AbstractModule{
private SpiConfiguration spiConfiguration;
public MultiIBatisModule(){
this.spiConfiguration = SpiConfiguration.getInstance();
}
/*
* @see com.google.inject.AbstractModule#configure()
*/
@Override
protected void configure(){
binder().bind(String.class).annotatedWith(DefaultEnviroment.class)
.toInstance(getSpiConfiguration().getDefaultEnviroment());
Injector injector = Guice.createInjector(new AbstractModule(){
@Override
protected void configure(){
MapBinder<String,SqlSessionFactory> factoryBinder
= MapBinder.newMapBinder(binder(),String.class,SqlSessionFactory.class,ControleSession.class);
try{
for(String name : getSpiConfiguration().enviromentNames()){
factoryBinder.addBinding(name)
.toInstance(new SqlSessionFactoryBuilder().build(
Resources.getResourceAsReader(MultiIBatisModule.this.configXmlName),name));
}
}catch(IOException e){
throw new RuntimeException(
"Configration SqlSessionFactory bind Error : "+e.getMessage(),e);
}
}
}
);
binder().bindInterceptor(Matchers.any(),Matchers.annotatedWith(Transaction.class)
,injector.getInstance(MxTransactionExecutor.class));
binder().bindInterceptor(Matchers.any(),Matchers.annotatedWith(QueryLimited.class)
,injector.getInstance(MxQueryLimitedExecutor.class));
}
protected SpiConfiguration getSpiConfiguration(){
return this.spiConfiguration;
}
}
------------------------------
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.google.inject.Inject;
/**
* 複数DB接続のSqlSession 実行の抽象クラス
*
* Configuration の Envioment名を指定して複数接続できる
*/
public abstract class MultiIBatisDao{
@ControleSession private Map<String,SqlSession> map;
@Inject @DefaultEnviroment private String defaultEnviromentName;
public SqlSession getSqlSession(){
return this.map.get(this.defaultEnviromentName);
}
public SqlSession getSqlSession(String enviromentName){
return this.map.get(enviromentName);
}
public <T> T getMapper(Class<T> t){
return this.map.get(this.defaultEnviromentName).getMapper(t);
}
public <T> T getMapper(Class<T> t,String enviromentName){
return this.map.get(enviromentName).getMapper(t);
}
}