1、Mybatis功能架构图
MyBatis的功能流程层次整体架构图如下所示:
2、MyBatis三层架构简介
1.1 接口层
接口层提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理,MyBatis和数据库的交互有两种方式(后面会详解这两种方式):
- 使用传统的MyBatis提供的API
- 使用Mapper接口
1.2 数据层
数据层负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等,它主要的目的是根据调用的请求完成一次数据库操作。 数据层可以说是MyBatis 的核心,它要完成三个功能:
- 通过传入参数构建动态SQL语句
- SQL语句的执行
- 封装查询结果
1.3 基础层
基础层负责最基础的功能支撑,包括连接池管理、数据源管理、事务管理、日志和缓存处理,将这些部分抽取出来作为基础的组件为上层的数据层提供支撑,基础层主要负责下面几方面:
- 事务管理机制:事务管理对于数据库操作非常重要,所以一个优秀的ORM框架会提供事务管理机制。
- 连接池管理机制:由于创建一个数据库连接所占用的资源比较大,如果每次都创建数据库连接非常消耗资源,所以需要使用连接池来管理数据库连接。
- 缓存机制:为了提高数据利用率和减小服务器和数据库的压力,MyBatis提供了一级缓存和二级缓存。
3、MyBatis核心API
3.1 MyBatis执行流程
单独使用MyBatis执行数据库操作(不与Spring集成)的整个的执行流程如下图所示:
执行流程的核心代码如下所示(以查询为例):
1 //mybatis配置文件是以流的方式读取的Resource是mybatis包下的类 2 InputStream config = Resources.getResourceAsStream("mybatis/SqlMapConfig.xml"); 3 //创建mybatis的会话工厂 4 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config); 5 //通过会话工厂得到SqlSession 6 SqlSession session = sessionFactory.openSession(); 7 /*执行查询,selectOne表示查询的结果为单条记录, 8 *user.selectById: 9 user表示映射文件中的namespace 10 selectById表示映射文件中的select标签中的id属性值 11 *参数中的1表示参入的值,和select标签中的parameterType类型匹配 12 */ 13 User user = session.selectOne("user.selectById", 1); 14 //关闭session 15 session.close();
3.2 MyBatis核心类介绍
MyBatis的主要的核心类有以下几个:
- SqlSessionFactoryBuilder:负责构建SqlSessionFactory。
- SqlSessionFactory:创建SqlSession实例的工厂类,SqlSessionFactory可以通过SqlSessionFactoryBuilder对象来获得,获得SqlSessionFactory后,可以通过openSession()方法来获取SqlSession对象。SqlSessionFactory对象一旦创建,就会在整个应用运行过程中始终存在。
- SqlSession:SQLSession主要是和数据库进行交互,完成增删改查功能。
- Executor: 主要负责Sql语句的执行和查询缓存的维护。
- StatementHandler: 封装了JDBC Statement操作,负责对JDBC Statement 的操作,如设置参数、将Statement结果集转换成List集合。
- ParameterHandler: 负责对用户传递的参数转换成JDBC Statement所需要的参数。
- ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合。
- TypeHandler: 负责java和jdbc数据类型之间的映射和转换。
- MappedStatement: MappedStatement维护了一条<select|update|delete|insert>节点的封装。
- BoundSql:表示动态生成的SQL语句以及参数信息
- Configuration: MyBatis所有的配置信息都在Configuration对象里。