从宏观上整体认知Mybatis

1、前言

推荐想要深入学习Mybatis同学去阅读《深入浅出MyBatis技术原理与实战》

本博文是对Mybatis的一个宏观解读,带你对Mybatis有个大概的了解。


2、Mybatis的基本构成


  1. SqlSessionFactoryBuilder
  2. SqlSessionFactory
  3. SqlSession
  4. 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,具体的运行流程我们下回通过源码来分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值