认识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