目录
1、前言
推荐想要深入学习Mybatis同学去阅读《深入浅出MyBatis技术原理与实战》
本博文是对Mybatis的一个宏观解读,带你对Mybatis有个大概的了解。
2、Mybatis的基本构成
- SqlSessionFactoryBuilder
- SqlSessionFactory
- SqlSession
- Mapper映射器
从构成来看,Mybatis的核心是围绕着SqlSessionFactory这一个接口展开,其实也不难理解,我们需要操作数据库,首先得连接数据库,而这一个个的数据库连接(会话)就是SqlSession,而为我们生成一个个SqlSession的,就是SqlSessionFactory。
同时在图中我们可以看到,不同的SqlSession是可以获取到同一个映射器的不同实例的。
2.1 Xml解析与Configuration
每个MyBatis的应用都是以SqlsessionFactory的实例为中心的。SqlsessionFactory的实例可以通过 SqlsessionFactoryBuilder获得。
在使用时,我们通常是通过读取配置文件的形式,将xml中的配置信息解读出来然后交由SqlsessionFactoryBuilder构建实例,那么大家有没有想过,我们的xml中配置的信息哪里去了呢?mapper.xml里面的sql又是存储在什么地方呢?
Mybatis读取配置文件后,会把所有的信息全部解析出来,然后通过对象的形式,存储在org.apache.ibatis.session.Configuration类中。
至于Mybatis是怎么解析xml的,这个过程我们不需要深究也没必要深究,个人认为你就算把别人解析过程全部弄懂了,对你技术和业务能力也不会有多大提升。
该配置类存在于整个应用生命期,用于重复读取和使用。我们的mapper.xml信息也存储在这里面。
2.2 SqlsessionFactoryBuilder
SqlsessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlsessionFactory的,通过它可以构建多个SqlsessionFactory。
它的作用就是一个构建器,一旦我们构建了SqlsessionFactory,它的作用就已经完结,失去了存在的意义,因此我们在实际应用中,将该类声明为局部变量使用即可。
2.3 SqlsessionFactory
SqlsessionFactory的作用是创建Sqlsession,每次应用程序需要访问数据库,我们就要通过 SqlsessionFactory创建 Sqlsession,所以 SqlsessionFactory应该与整个应用共存亡。
在实际应用中,我们应该使每一个数据库只对应一个SqlsessionFactory,管理好数据库资源的分配,避免过多的 Connection被消耗。
2.4 SqlSession
SqlSession是一个会话,相当于JDBC的一个 Connection对象,它的生命周期应该是在请求数据库处理事务的过程中。
它是一个线程不安全的对象,在涉及多线程的时候我们需要特别的当心,操作数据库需要注意其隔离级别,数据库锁等高级特性。
此外,每次创建的 SqlSession都必须及时关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。
我们往往需要通过finally语句块保证我们正确的关闭 SqlSession。它存活于一个应用的请求和操作,可以执行多条SQL,保证事务的致性。(在Spring中,它已经帮我们完成这些工作了)
通过SqlSession,我们可以手动执行commit和rollback来控制事务,也可以通过SqlSession为我们提供的大量方法来直接发送SQL语句调用,不过最建议使用的方式,还应该是getMapper。
2.5 Mapper映射器
在Mybatis中,映射器由Java接口和XML文件组成,即我们常用的mapper.class和mapper.xml。
当然,使用注解也可以完成SQL语句映射,但这样做实在是过于弱智,和当初JDBC时代没有多大差别。
Mybatis通过动态代理,为我们定义好的接口生成代理对象,然后在真正调用方法时,会根据“接口全路径+方法名”去匹配对应的SQL,然后执行得到正确的结果。
3、小结
从Configuration到Mapper,我们再来大致对Mybatis做一个比较全面的梳理:
该图展示了Mybatis从xml到mapper的一个大概流程,但实际上最终执行查询语句的还是我们的SqlSession对象。
Mybatis在这一层通过映射器+动态代理的形式,避免了直接使用SqlSession来操作SQL,具体的运行流程我们下回通过源码来分析。