Java框架之Mybatis

Mybatis做为一个能和Hibernate竞争的强劲对手,现在应用在各大网站的后台管理系统中,为各路网站把好了ORM的关卡,那么mybatis 为什么会这么受人青睐呢?

Mybatis简介

MyBatis是一个持久性框架,他不仅支持自定义SQL,存储过程并且还支持诸如ResultMap,ResultType等高级映射。 MyBatis消除了几乎所有的JDBC代码和手动设置参数和结果检索。并且它可以自动生成Mapper接口将数据映射到Java POJO对象中。同时Mybatis具有缓存技术,他的多级缓存技术降低了对于数据库的访问次数。

Mybatis架构

Mybatis架构可以分为配置文件,SQLSession,Executor和MapperStatement。
Java框架之Mybatis
配置文件 也就是Mybatis-config.xml,他定义了用户自己的Mybatis,在Mybatis-config.xml中大家可以配置数据源,指定sqlSessionFactory (sqlSessionFactory创建sqlSession用于和数据库进行持久化连接),配置扫描存放mapper的文件包,设定事物的传播属性。配置文件的量身定做也确定了这个数据库连接的必要属性。

sqlSessionFactory Mybatis通过工厂设计模式返回一个sqlSession对象,用于持久化的连接数据库,但是sqlSession是线程不安全的,所以可以对每一个线程都配备sqlSession以便他们操作数据库。在sqlSession中,Mybatis调用connection方法访问数据库。

Executor 是在每一个sqlSession中都被创建,用于执行ddl和dml语句,Executor在Mybatis有不同的几种模式,一般默认条件下使用simple-Executor,同时Mybatis提供了其余几种不同的executor以供不同情况下使用,如使用缓存机制的reuseExcutor,做批量更新可以通过batchExecutor进行大批量数据update。

MappedStatement 执行具体的sql语句,在执行过程中分为两个部分,一个是对于每一个sql语句都进行单独操作的映射接口,另一个映射文件可以理解为Mybatis编写Sql的地方。通常每个表单都对应一个映射文件,其中Sql语句被定义为输入和输出。

Mybatis框架技术可以使数据库操作更加优化,通过对一个sql操作的分解, 可以将复杂的sql语句直接转化为在磁盘上读取的简单sql语句,从而提升查询效率,时间复杂度为O(1).

Mybatis缓存机制

一级缓存
在实际生产中,我们有机会执行完全相同的查询Sql。由于日常应用的大部分场景读多写少,这种重复查询会影响数据库的性能。同时,如果select查询的数量很大,将对数据库的性能产生很大的影响。
如果是Mysql数据库,可以在服务器端和Jdbc端同时启用预编译支持(PreparedStatement)。这样预编译后的语句可以缓存在本地JVM端,Sql可以直接在Mysql服务器端执行,省去了编译Sql的步骤,但同样不能避免重复访问数据库。
Mybatis提供了一个多级的缓存方案来优化数据库会话之间的重复查询问题。第一级缓存是每个SqlSession都拥有自己的缓存。这级的缓存有两种不同的形式,第一种是会话级,是指所有的sqlSession中执行的sql语句都会被存储。另外一种是statement,可以认为是其只对当前执行的sqlSession进行缓存,而其他sqlSession不配备缓存栈。
一级缓存的默认设置是每个SqlSession都将有自己的Executor,每个执行器都有一个本地缓存。当Sql查询缓存未果的时候,则查询数据库,当缓存中有相同sql的编译结果,则直接返回缓存中的查询结果。

二级缓存
二级缓存区别于一级缓存的地方在与其装配了sqlSession 的共享缓存,在进行后续执行之前,会在共享缓存中查询是否存在相同sql记录。所以任何语句都可以操作同一个命名空间下的缓存,实现SqlSession共享,共享缓存将设定为全局变量。虽然其实用性增加,但对系统性能的影响也大大增加。

总结

Mybatis作为一个成熟的ORM框架他大大的简化我们操纵数据库的难度,了解Mybatis可以帮助我们更好的优化数据库的性能,保障数据库的安全。