SqlSession
SqlSession是Mybaits对用户提供的使用接口,提供了一系列数据库及事物的操作接口,如增/删/改/查以及事物的提交/回滚等操作,用户在使用Mybatis时只需要跟SqlSession接口打交道即可。
工厂模式
SqlSession的设计使用了工厂模式,由SqlSessionFactory生产SqlSession对象。常用的默认实现为DefaultSqlSessionFactory和DefaultSqlSession。
策略模式
SqlSession只是提供操作接口,在DefaultSqlSession中数据库的操作实际交给不同的Executor执行,这里采用了策略模式,不同的Executor对应着不同的策略算法,可以根据不同需求替换不同的算法,避免大量条件分支语句,且符合开闭原则。配合反射操作可以无需了解所有策略实现类实现策略的动态替换。
DefaultSqlSession
Executor.query(MappedStatement,Object,RowBounds,ResultHandler)实现数据库查询操作
Executor.update(MappedStatement,Object)实现数据库更新操作(包括insert/update/delete)
DefaultSqlSessionFactory
- 通过数据源获取数据库连接,创建DefaultSqlSession及Executor
- 用户提供数据库连接对象,根据该对象创建DefaultSqlSession及Executor
- openSession()方法创建返回SqlSession对象
SqlSessionManager
SqlSessionFactory和SqlSession的结合体,拥有两者的功能。
与DefaultSqlSessionFactory不同之处:
SqlSessionManager提供两种模式
- 与DefaultSqlSessionFactory相同,同一线程每次通过SqlSessionManager对象访问数据库时都会创建新的SqlSession对象。即可以当作是一个DefaultSqlSessionFactory使用。
- 使用ThreadLocal记录当前线程绑定的SqlSession对象,供当前线程循环使用。需要调用startManagerSession()方法缓存SqlSession对象。
SqlSessionManager所有创建SqlSession的动作均由封装的SqlSessionFactory实现;
SqlSessionManager所有数据库操作的动作均由动态代理的SqlSession实现;
其InvocationHandler对象是SqlSessionInterceptor对象(内部类),