概述
简单聊聊 MyBatis
1、概述
MyBatis 是一款 持久层框架,用于将 结果集数据 持久化(保存)到 数据库 中。
常见的持久层框架有:
- MyBatis
- JPA(默认实现为 Hibernate)
扩展:MyBatis 与 JPA 的区别
- ORM 映射
- MyBatis 是 半自动 的 ORM 框架,提供 结果集 与 数据库 的映射;
- JPA 是 全自动 的 ORM 框架,提供 对象 与 数据库 的映射。
- 可移植性
- MySQL 与 数据库的耦合性 直接取决于 SQL 的写法,可移植性较低;
- JPA 通过 强大的映射结构 和 HQL 大大降低了与数据库的耦合性,可移植性较高。
- 日志系统
- MySQL 日志系统较薄弱,只包含 基本的记录功能;
- JPA 日志系统较健全,包含 SQL 记录、关系异常、优化警告、缓存提示、脏数据警告等。
- SQL 优化
- MyBatis 的 SQL 基本都是 手动书写的,优化 SQL 比较方便;
- Hibernate 的 SQL 基本都是 自动生成的,无法直接维护 SQL。
2、MyBatis # 和 $ 的区别
-
- 使用 # 设置参数时,MyBatis 会创建 预编译的 SQL 语句,然后在执行 SQL 时 MyBatis 会为 预编译 SQL 中的占位符(?)赋值。
- 预编译的 SQL 语句执行效率高,并且可以防止注入攻击。
- $
- 使用 $ 设置参数时,MyBatis 只是创建 普通的 SQL 语句,然后在执行 SQL 时 MyBatis 会将参数直接拼入到 SQL 中。
- 效率、安全性较低,容易遭受注入攻击。
- 可以解决一些特殊情况下的问题,如:在动态表格中,传递 SQL 的列名,根据某些列进行排序(或者传递列名给 SQL)。
3、MyBatis 缓存机制
MyBatis 的缓存分为 一级缓存 和 二级缓存。
3.1、一级缓存(又称 本地缓存,默认启动 且 不能关闭)
一级缓存 存在于 SqlSession 的生命周期中,即它是 SqlSession 级别的缓存。
在同个 SqlSession 中查询时,MyBatis 会把执行的方法和参数 通过算法生成缓存的键值,然后将 键值 和 查询结果 存入一个 Map 对象中。
如果同一个 SqlSession 中执行的方法和参数 完全一致,那么通过算法会生成相同的键值,当 Map 缓存对象中已经存在该键值时,则会返回缓存中的对象。
3.2、二级缓存(又称 全局缓存,需要进行手动配置)
二级缓存 存在于 SqlSessionFactory 的生命周期中,即它是 SqlSessionFactory 级别的缓存。
配置步骤:
-
开启全局缓存
<!--开启全局缓存--> <setting name="cacheEnabled" value="true"/>
-
在要使用二级缓存的Mapper中开启
<!--在当前Mapper.xml使用二级缓存--> <cache/> <!--自定义参数--> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
补充:
- 映射语句文件(Mapper.xml) 中的所有 select 语句 都会被缓存;
- 映射语句文件 中的所有 insert、update、delete 语句 都会刷新缓存;
- 缓存 默认会使用 LRU 算法(Least Recently Used,最近最少使用)进行回收;
- 缓存 会被视为 read/write(可读 / 可写)的,意味着 对象检索 不是共享的,且可以安全地被调用修改,而不干扰其它调用者(或线程)所做的潜在修改。
最后
以上就是默默飞鸟为你收集整理的简单聊聊 MyBatis的全部内容,希望文章能够帮你解决简单聊聊 MyBatis所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复