MyBatis
MyBatis执行流程
- 读取MyBatis配置文件: mybatis-config.xml加载运行环境和映射文件
- 构造会话工厂SqlSessionFactory
- 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)
- 操作数据库的接口,Executor执行器,同时负责查询缓存的维护
- Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
- 输入参数映射
- 输出结果映射
延迟加载使用及原理
一级,二级缓存
本地缓存,基于PerpetualCache,本质是一个HashMap
一级缓存:作用域是session级别
一级缓存:基于PerpetualCache的 HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存
二级缓存:作用域是namespace和mapper的作用域,不依赖于session
二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储
注意事项
1,对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有select 中的缓存将被clear 2,二级缓存需要缓存的数据实现Serializable接口 3,只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中
mybatis的优缺点
- 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
- 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
- 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
- 能够与Spring很好的集成;
- 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点: 1、SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
2、SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
mybatisplus
- 无侵入:mybatis-plus在mybatis的基础上进行扩展,只做增强不做改变,引入mybatisplus不会对现有的mybatis框架产生任何影响
- 依赖少,仅仅依赖mybatis以及 mybatis-spring
- 损耗小:启动会直接注入基本的crud,性能基本无损耗,直接面向对象操作
- 预防sql注入:内置sql注入玻璃器,有效预防sql注入攻击
- 通用crud:内置通用mapper和service。仅仅通过少量噢诶之即可实现单表大部分crud操作,更有强大的条件构造器
- 支持多种主键策略:支持分布式唯一id生成器
- 支持热加载:Mapper对应的xml支持热加载
- 支持代码生成:
- 内置分页插件
- 内置全局拦截插件
MyBatis和MyBatis-Plus都是Java语言中非常常用的ORM框架,二者有以下区别:
- 实现方式不同 MyBatis是基于XML或注解方式进行数据库操作的持久化框架,它提供了简单的CRUD操作及动态SQL生成等功能。而MyBatis-Plus是在MyBatis框架上的封装,通过对于增强简化后的API更加方便地进行开发,并且在性能、效率和易用性上都有一定的优化。
- 功能支持不同 MyBatis-Plus相比于MyBatis提供了很多额外的功能,例如像条件构造器、代码生成器、分页插件、性能分析拦截器等实用的组件,使得开发者可以轻松快速完成业务逻辑的开发。而MyBatis相对较为原始,需要手写大量的SQL以完成各种功能的实现。
- 编程风格有所差异 MyBatis的编程风格更加传统,需要定义mapper.xml文件并根据传入的参数使用相应的SQL查询语句,需要实现 Mybatis 提供的各种方法;而MyBatis-Plus具有许多针对CRUD进行的简化方法,通过继承BaseMapper以及使用Lambda表达式,可以让我们像SpringDataJPA类似地使用接口编程方式进行数据库操作。