SqlSession フィールド宣言をビジネスロジックに書かないようにすることは、
劇的にコードがすっきりしてくる。
【改修前】
public class FooLogic{
private SqlSessionFactory sqlSessionFactory;
@Inject
public FooLogic(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory = sqlSessionFactory;
}
public List<String> getNameAll(){
SqlSession session = this.sqlSessionFactory.openSession();
List<String> list = session.selectList("getFooNames");
session.close();
return list;
}
}
【改修後】
public class FooLogic extends IBatisDao{
@QueryLimited
public List<String> getNameAll(){
return getSqlSession().selectList("getFooNames");
}
}
これは、IBatisDao が、以下のコードであり、インターセプタが
@ControleSession private SqlSession sqlSession;
に確実に生成とCLOSE を実行することで成立する。
import org.apache.ibatis.session.SqlSession;
public abstract class IBatisDao{
@ControleSession private SqlSession sqlSession;
public SqlSession getSqlSession(){
return this.sqlSession;
}
public <T> T getMapper(Class<T> t){
return this.sqlSession.getMapper(t);
}
}