认识MyBatis核心组件

认识MyBatis核心组件

Mybatis的特点

  • 不屏蔽sql,这给sql的优化留下了空间
  • 提供灵活,强大的映射机制,方便java开发者使用
  • 提供了只需要一个mapper接口,和一个xml的映射机制

Mybatis的核心组件

  • SqlSessionFactoryBuilder (构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的分步构建的Builder模式
  • SqlSessionFactory(工厂接口): 依靠它来生成SqlSession,使用的是工厂模式
  • SqlSession(会话): 一个既可以发送SQL来执行返回结果,也可以获取Mapper的接口
  • Mapper(映射器):由java接口和xml构成,需要给出sql和映射关系。它负责发送sql去执行,并返回结果。

在这里插入图片描述

SqlSessionFactory(工厂接口)

每个mybatis应用都是以一个SqlSessionFactory为核心的。mybatis的首要任务就是根据配置或者代码去生产SqlSessionFactory,由于SqlSessionFactory的责任单一,所以通常为单例模式。在mybatis中,会使用构造器SqlSessionFactoryBuilder来构建它。mybaist提供了一个org.apache.ibatis.session.Configuration作为引导,采用的是builder模式
通过查看SqlSessionFactoryBuilder的代码,发现,多个构建方法最后都是在调用如下方法进行构建

在这里插入图片描述
注意,SqlSessionFactory是一个接口如下
在这里插入图片描述

它有两个具体的实现SqlSessionManager和DefaultSqlSessionFactory,后者继承了前者。前者由于多线程环境中。
如上面所提到的,有两种方式用于构建SqlSessionFactory,配置和代码。

使用XML构建SqlSessionFactory

这种方式就是通过读取mybatis的配置文件来构建SqlSessionFactory
如下文展示的一份简单的配置文件
在这里插入图片描述
通过观察上图,有三个重要的部分

  • 别名 这个别名定义是全局的,在映射文件中integer不用写全限定名就是因为mybatis已经为我们定义了别名
  • 数据库环境 配置事务方式,数据库连接池
  • 映射文件 这里用来注册映射器,可以有多种方式,如直接注册一个文件夹,这样就不用了一个一个的写了

最后在java代码中构建SqlSessionFactory

SqlSessionFactory sqlSessionFactory = null;
InputStream resource =  "mybatis-config.xml";
InputStream input;
try{
    inputStream = Resource.getResourceAsStream(resource);
    SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch(IOException e) {
    e.printStackTrace ();
}

上文已经提到,可以通过SqlSessionFactoryBuilder来构建SqlSessionFactory,查看构造器的代码就可以知道,它有多种构造方法的重载,其中就包括上述代码中的,以InputStream为参数实现。

通过代码创建SqlSessionFactory的方式省略

SqlSession

就像SqlSessionFactory一样,SqlSession也是一个接口。它有两个实现类,一个是SqlSessionManager一个是DefaultSqlSession,DefaultSqlSession在单线程下使用,SqlSessionManager在多线程下使用。这个SqlSessionManager有点眼熟,是的,它在上文的SqlSessionFactory中出现过,它实现了SqlSession接口和SqlSessionFactory接口。
在这里插入图片描述
通过观察SqlSession的接口,我们可以发现SqlSession的作用主要有三个
在这里插入图片描述

  • 发出Sql
  • 控制数据库事务
  • 获取Mapper接口

映射器

映射器在mybatis中由一个接口和一个XML文件组成。
作用如下:

  • 描述映射规则
  • 提供sql
  • 配置缓存
  • 提供动态SQL

SqlSession与Mapper接口发送SQL

SqlSession发送SQL

Role role = sqlSession.selectOne("com.learn.ssm.mapper.RoleMapper.getRole", 1L);

string对象是由一个命名空间加上SQL id组合而成的,它完全定位了一条SQL

用Mapper接口发送SQL

RoleMapper roleMapper = SqlSession![e5568231041495b2cb6ef26d21fb7715.png](en-resource://database/1004:1)
.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);

这是通过mapper的全限定名加上方法名来说查找

通过观察以上两种方式,无论是可读性,还是代码在编译时期的检查,后者都更优秀

生命周期

这里讨论下上文反复提到的四大组件的生命周期

SqlSessionFactoryBuilder

它是用来创建SqlSessionFactory的,所以它的生命应该在创建是开始,在创建结束后结束

SqlSessionFactory

SqlSessionFcatory可以被认为是一个数据库连接池,它的作用是创建Sqlsession接口对象。其应该以单例的形式,在整个mybatis应用内存活

SqlSession

哪它就相当于一个连接,应该存活于一个业务请求中。

Mapper

其生命周期应该小于SqlSession

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章