MyBatis的持久化解决方案是将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以以面向对象的方式来进行持久化层操作.底层数据库连接的获取,数据访问的实现,事务控制等都无须用户关心,从而将应用层从底层的JDBC/JTA API抽取出来.通过配置文件管理JDBC连接,让MyBatis解决持久化的实现.在MyBatis中的常见对象有SqlSessionFactory和SqlSession。

SqlSessionFactory

SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像.SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例.每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.在应用运行期间不要重复创建多次,建议使用单例模式.SqlSessionFactory是创建SqlSession的工厂。

  1. //SqlSessionFactory接口源码如下所示:
  2. package org.apache.ibatis.session;
  3. import java.sql.Connection;
  4. public interface SqlSessionFactory {
  5. SqlSession openSession();//这个方法最经常用,用来创建SqlSession对象.
  6. SqlSession openSession(boolean autoCommit);
  7. SqlSession openSession(Connection connection);
  8. SqlSession openSession(TransactionIsolationLevel level);
  9. SqlSession openSession(ExecutorType execType);
  10. SqlSession openSession(ExecutorType execType, boolean autoCommit);
  11. SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
  12. SqlSession openSession(ExecutorType execType, Connection connection);
  13. Configuration getConfiguration();
  14. }

SqlSession

SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句.每个线程都应该有它自己的SqlSession实例.SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中.也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。

  1. //SqlSession接口源码如下所示:
  2. package org.apache.ibatis.session;
  3. import java.io.Closeable;
  4. import java.sql.Connection;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.apache.ibatis.executor.BatchResult;
  8. public interface SqlSession extends Closeable {
  9. <T> T selectOne(String statement);
  10. <T> T selectOne(String statement, Object parameter);
  11. <E> List<E> selectList(String statement);
  12. <E> List<E> selectList(String statement, Object parameter);
  13. <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);
  14. <K, V> Map<K, V> selectMap(String statement, String mapKey);
  15. <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
  16. <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
  17. void select(String statement, Object parameter, ResultHandler handler);
  18. void select(String statement, ResultHandler handler);
  19. void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
  20. int insert(String statement);
  21. int insert(String statement, Object parameter);
  22. int update(String statement);
  23. int update(String statement, Object parameter);
  24. int delete(String statement);
  25. int delete(String statement, Object parameter);
  26. void commit();
  27. void commit(boolean force);
  28. void rollback();
  29. void rollback(boolean force);
  30. List<BatchResult> flushStatements();
  31. void close();
  32. void clearCache();
  33. Configuration getConfiguration();
  34. <T> T getMapper(Class<T> type);
  35. Connection getConnection();
  36. }

SqlSessionFactory和SqlSession实现过程

Mybatis框架主要是围绕着SqlSessionFactory进行的,创建过程大概如下:
(1)、定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
(2)、通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
(3)、通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
(4)、SqlSessionFactory 的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作

参考资料