SqlSessionのCLOSE忘れを回避、(3)そして劇的に、、、

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);
   }

}