Mybatis的核心对象及运行流程
一、SqlSessionFactory对象
1、SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像。
2、SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.在应用运行期间不要重复创建多次,建议使用单例模式。SqlSessionFactory是创建SqlSession的工厂。
3、 SqlSessionFactory接口源码如下所示:
public interface SqlSessionFactory {
SqlSession openSession();
SqlSession openSession(boolean autoCommit);
SqlSession openSession(Connection connection);
SqlSession openSession(TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, boolean autoCommit);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType, Connection connection);
Configuration getConfiguration();
}
4、SqlSessionFactoryBuilder构建SqlSessionFactory实例的方式
(1)从XML配置文件构建(推荐使用)
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory会根据Resources资源信息加载对象,获取开发人员在项目配置文件(mybatis-config.xml)的信息,从而产生一个可以与数据库交互的会话实例----SqlSession
(2)预制Configuration实例的方式构建(java代码方式)
DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver",
"jdbc:mysql://localhost/mybatis?useSSL=false&serverTimezone=UTC", "admin", "123456");
Environment environment = new Environment("development ", new JdbcTransactionFactory(), dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(EmployeeMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
5、SqlSessionFactoryBuilder类:是构建sqlSessionFactory的入口类,它是通过不同的入参来构造SqlSessionFactory。 它是用过即释放,其生命周期只存在于方法体内, SqlSessionFactory是单例的,存在于整个应用运行时
二、SqlSession对象:
SqlSession是MyBatis的关键对象,它是应用程序与持久层之间交互操作的一个单线程对象,类似于JDBC中的Connection。SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,同时SqlSession也是线程不安全的。绝对不能将SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。使用完SqlSeesion之后关闭很重要,应该确保使用finally块来关闭它。
三、Mybatis的运行流程
Mybatis的整个运行流程是紧紧围绕着数据库连接池配置文件(mybatis-config.xml),以及SQL映射配置文件(xxxMapper.xml)而展开的
首先SqlSessionFactory会话工厂通过Resources资源信息加载对象获取配置文件(mybatis-config.xml)的配置信息,然后产生可以与数据库进行交换的会话实例类SqlSession,会话实例类根据Mapper配置文件中的SQL配置,去执行相应的增、删、改、查操作。而在SqlSession类的内部是通过执行器Executor(分为基本执行器或缓存执行器)对数据库进行操作。执行器Executor与数据库交互依靠的是底层封装对象Mappered Statement,它封装了从Mapper文件中读取的信息(包括SQL语句、输入参数、输出结果类型)。通过执行器Executor与底层封装对象Mappered Statement的结合,Mybatis就实现了与数据库进行交互的功能
Mybatis运行流程图如下: