最近在学习MyBatis,做一些笔记以作记录。图片来自青山老师。
什么是ORM?
ORM的全拼是Object Relational Mapping,也就是对象与关系的映射,对象是程序里边的对象,关系是它与数据库里边的数据的关系。
MyBatis的核心特性
- 使用连接池对连接进行管理
- SQL和代码分离,集中管理
- 结果映射集
- 参数映射和动态SQL
- 重复SQL的提取
- 缓存管理
- 插件机制
MyBatis核心对象
SqlSessionFactoryBuilder:用来构建SqlSessionFactory的,而且只会构建一个,构建完成后,无存在意义。它的生命周期只存在于方法的局部。
SqlSessionFactory:这是用来创建SqlSession的,每次访问数据库,都需要一个会话。所以这个类要一直再存(作用域是应用作用域),而且是单例模式。
SqlSession:只是一个会话,因为是线程不安全的,不能线程间共享。所以我们在请求开始的时候创建一个SqlSession对象,在请求结束后或者说方法执行完毕的时候要及时关闭它(一次请求或操作中)。
Mapper:是从SqlSession中获取的(实际上是一个代理对象)
#和$的区别?
- $方式不会对符合转义,不能防止SQL注入
- $方式没有预编译,不会缓存
所以能用#的地方都要用#;常量的替换,比如排序条件中的字段名称,不用加单引号,可以用$
MyBatis工作流程
- 解析配置文件
把所有的配置文件解析成一个Configuration对象。
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(inputStream);
通过InputStream获取到配置文件,然后通过XMLConfigBuilder把所有的配置文件都解析了,并放入到一个Configuration类中。再通过new一个DefaultSqlSessionFactory加载拿到的Configuration类。
- 提供操作接口
SqlSession sqlSession = factory.openSession();
先从Configuration中拿到Environment,里边包含事务工厂,再创建执行器(Executor),BaseExecutor有3个实现,分别是BatchExecutor,ReuseExecutor,SimpleExecutor,体现了模板方法模式。CacheExecutor则是Executor的装饰,体现了装饰器模式。再去进行插件的代理。最终返回一个DefaultSqlSession。
- 执行SQL操作
根据XXMapper接口获取到一个代理对象。最底层为JDK代理。
然后执行sql,SqlSession持有一个Executor对象,用来封装对数据库的操作。
整体的执行流程
按照包进行分类
接口层:
核心对象是SqlSession,它是上层应用和MyBatis打交道的桥梁,SqlSession上定义了非常多的数据库的操作方法。接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作。
核心处理层:
- 把接口中传入的参数解析并且映射成JDBC类型。
- 解析xml文件中的SQL语句,包括插入参数,和动态SQL的生成。
- 执行sql语句。
- 处理结果集,并映射成java对象。
基础支持层:
主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能。
MyBatis中基本的执行器
BaseExecutor
SimpleExecutor
ReuseExecutor
四大对象
statementHandler
parameterHandler
resultSetHandler
Executor
MyBatis核心对象
对象 | 相关对象 | 作用 |
---|---|---|
Configuration | MapperRegistry TypeAliasRegistry TypeHandlerRegistry | 包含了MyBatis的所有配置信息 |
SqlSession | SqlSessionFactory DefaultSqlSession | 对操作数据库的增删改查的API进行了封装, 提供给高层使用 |
Executor | BaseExecutor SimpleExecutor BatchExecutor ReuseExecutor | MyBatis的执行器,是MyBatis调度的核心 ,负责SQL语句的生成和查询的维护 |
StatementHandler | BaseStatementHandler SimpleStatementHandler PreparedStatementHandler CallableStatementHandler | 封装了JDBC Statement操作, 负责对JDBC statement的操作,如设置参数、将Statement结果转换为List等 |
ParameterHandler | DefaultParameterHandler | 把用户传递的参数转换成JDBC statement所 需要的参数 |
ResultSetHandler | DefaultResultSetHandler | 把JDBC返回的ResultSet结果集封装成List类型的集合 |
MapperProxy | MapperProxyFactory | 触发管理类,用于代理Mapper接口方法 |
MappedStatement | SqlSource, BoundSql | MappedStatement维护了一条<select|update|delete|insert>节点的封装,表示了一条SQL,包括了SQL信息,入参信息,出参信息 |