mybatis技术内幕1-ORM
JDBC回顾
在java开发中可以使用jdbc完成数据库操作,使用jdbc的步骤如下:
- 注册数据库驱动
- 通过DriverManager获取数据库连接
- 通过数据库里连接创建Statement对象(PrepareStatment)
- 通过statement对象执行sql语句,得到resultSet对象
- 通过ResultSet读取数据,并将数据转换我javaBean对象
- 关闭ResultSet、Statement对象以及数据库连接,释放相关资源
在第5步中,需要完成关系模型到对象模型的转换,要使用比较通用的方式封装这种复杂的对象比较难,所以需要使用orm框架。
orm框架可以通过配置文件实现java对象与关系型数据库之间的转换。
常见的持久化框架
hibernate
hibernate主要有两类配置文件,一种是核心配置文件,一种是映射配置文件,映射配置文件就是将数据库中字段与java类中的属性相对应起来。
hibernate优点
- hibernate的api没有侵入性,业务逻辑不需要继承hibernate任何接口,同时hibernate支持透明的持久化,延迟加载、由对象模型自动生成数据库表等。
- hibernate具有良好的缓存机制
hibernate缺点
- 数据库自身也是有自己组织方式,不是所有数据库概念都可以在hibernate中找到合适的映射,比如索引,存储过程以及函数等。
- hibernate一般是查询所有列,如果想要查询部分字段时不好处理
- 根据不同条件不好拼接sql
Spring JDBC
spring jdbc其实是使用模板方式对原生的jdbc进行了封装,这里面没有映射文件,对象查询语言以及缓存的概念,而是直接执行原生的sql语句。
Mybatis
mybatis可以通过映射文明或相应注解将resultSet映射为java对象,映射规则可以嵌套其他映射规则以及子查询,可以实现一对一,一对多,多对多的映射以及双向映射。
优点
- 相对于hibernate,mybatis更轻量级,可控性比较高,可以在配置文件中直接写原生sql语句,因此可以优化sql,mybaits适合大数据量,高并发情形。
- 具有良好的动态sql功能用于不同的查询条件
mybatis整体架构
mybatis整体架构分为三层,分别是基础层,核心处理层以及接口层
基础支持层的部分模块
- binding模块
在dao中我们执行sqlSession的api时需要指定映射文件中定义的sql节点,但是binding模块可以让我们不用写dao的实现类,只需要有dao接口即可,将dao的接口与映射文件关联起来。 - 解析器模块
解析器主要提供了两个功能:一个功能是对Xpath进行封装,为mybatis初始化解析核心配置文件以及映射文件提供支持;另外一个功能是为处理动态sql语句中的占位符提供支持
核心处理层的部分模块
- 配置解析
mybatis初始化时将配置文件与接口中注解解析后形成相应对象并保存到configuration对象中。 - sql执行涉及多个组件,比较重要的是executor(负责维护一级和二级缓存并且为事务提供支持),statementHandler,parameterHandler(完成实参绑定并得到结果集)以及resultSetHandler(结果集的映射)。