什么是框架(Framework)?
提供可重用的公共结构的半成品。
什么是数据的持久化?
持久化是程序数据在瞬时状态和持久状态间转换的过程,是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。
数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、xml、二进制流。
什么是ORM
对象关系映射(Object/Relational Mapping,ORM)是一种数据持久化技术。它在对象模型和关系型数据库之间建立其对应关系,并且提供了一种机制。
在编写程序时,以面对对象的方式处理数据,在保存数据时,以关系型数据库的方式存储。
ORM解决方案包含下面四个部分:
在持久化对象上执行基本的增删改查操作
对持久化对象提供一种查询语言或API
对象关系映射工具
提供与事务对象交互、执行检查、延迟加载以及其他优化功能
搭建MyBatis环境
1.下载需要的jar文件
mybatis-xxx.jar
mysql-connector-java-xxx-bin-jar
log4j-xxx.jar
2.部署jar文件
3.创建MyBatis核心配置文件configuration.xml,又称为全局配置文件
myBatis核心配置文件主要用于配置数据库连接和MyBatis运行时所需要的各种特性,包含看设置和影响MyBatis行为的属性。
configuration:配置文件的根元素节点
properties:通过resource属性从外部指定properties属性文件,该属性文件描述数据库连接的相关配置。
setting:设置MyBatis运行中的一些行为
typeAliases元素:配置类型别名
environments:表示配置MyBatis的多套运行环境,该元素节点可以配置多个environment子元素节点,但是必须指定一个为默认运行环境
environment:配置MyBatis的一套运行环境,需指定运行环境Id、事务管理、数据源配置等相关信息。
mappers:作用告诉MyBatis去哪里找sql映射文件
mapper:mappers的子节点元素,具体指定sql映射文件的路径
备注:核心配置文件的元素节点是有一定顺序的,如果节点位置不按顺序排位,那么xml文件会报错。
4.创建持久化类(pojo)和sql映射文件
持久化类是指其实力状态需要被MyBatis持久化到数据库中的类。
mapper:映射文件的根元素节点,只有一个属性namespace。namespace:用于区分不同的mapper,全局唯一;绑定接口。
5.创建测试类
读取全局配置文件mybatis-config.xml
创建SqlSessionFactory对象,读取配置文件
创建SqlSession对象
调用maopper文件进行数据操作
关闭SqlSession对象
MyBatis框架的优点:
与JDBC相比,减少了50%以上的代码量
MyBatis是最简单的持久性框架,小巧且简单易学
MyBatis相当灵活,即降低了耦合度,又便于统一管理和优化,还可重用
提供xml标签,支持编写动态sql语句
提供映射标签,支持对象与数据库的ORM字段关系映射
缺点:
sql语句的编写工作量大,对开发人员编写sql语句的功底有一定要求
sql语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
一级缓存
一级缓存是基于PerpetualCache(MyBatis自带)的HashMap本地缓存,作用范围为session,当session flush或者close之后,该session中所有的cache就会被清空。它缓存的sql语句。
一级缓存工作流程
主要步骤如下:
对于某个Select Statement,根据该Statement生成key。
判断在Local Cache中,该key是否用对应的数据存在。
如果命中,则跳过查询数据库,继续往下走。
如果没命中:
.1 去数据库中查询数据,得到查询结果;
.2 将key和查询到的结果作为key和value,放入Local Cache中。
.3. 将查询结果返回;
判断缓存级别是否为STATEMENT级别,如果是的话,清空本地缓存。
总结
Mybatis一级缓存的生命周期和SqlSession一致。
Mybatis的缓存是一个粗粒度的缓存,没有更新缓存和缓存过期的概念,同时只是使用了默认的hashmap,也没有做容量上的限定。
Mybatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,有操作数据库写的话,会引起脏数据,建议是把一级缓存的默认级别设定为Statement,即不使用一级缓存。
二级缓存
二级缓存就是global caching,它超出sesion范围之外,可以被所有SqlSession共享,开启它就只需要在Mybatis的核心配置文件的setting中设置。缓存的是结果对象。
具体的工作流程如下所示:
在二级缓存的使用中,一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存是被多个SqlSession共享着的,是一个全局的变量。
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
二级缓存配置
要正确的使用二级缓存,需完成如下配置的。
1 在Mybatis的配置文件中开启二级缓存。
2 在Mybatis的映射XML中配置cache或者 cache-ref 。
cache标签用于声明这个namespace使用二级缓存,并且可以自定义配置。
type: cache使用的类型,默认是PerpetualCache,这在一级缓存中提到过。
eviction: 定义回收的策略,常见的有FIFO,LRU。
flushInterval: 配置一定时间自动刷新缓存,单位是毫秒
size: 最多缓存对象的个数
readOnly: 是否只读,若配置可读写,则需要对应的实体类能够序列化。
blocking: 若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。
cache-ref代表引用别的命名空间的Cache配置,两个命名空间的操作使用的是同一个Cache。
SynchronizedCache: 同步Cache,实现比较简单,直接使用synchronized修饰方法。
LoggingCache: 日志功能,装饰类,用于记录缓存的命中率,如果开启了DEBUG模式,则会输出命中率日志。
SerializedCache: 序列化功能,将值序列化后存到缓存中。该功能用于缓存返回一份实例的Copy,用于保存线程安全。
LruCache: 采用了Lru算法的Cache实现,移除最近最少使用的key/value。
PerpetualCache: 作为为最基础的缓存类,底层实现比较简单,直接使用了HashMap。
resultMap自动映射级别
NONE:禁止自动匹配
PARTIAL(默认):自动匹配所有属性,有内部嵌套(association、collection)除外
FULL:自动匹配属性
mybatis-config.xml文件:
UNPOOLLED :每次都要新建一个连接
POOLED:mybatis自带的数据源 连接池
JNDI:tomcat自带的
-->
$:select * from smbms where id=1
#:select * from smbms where id='1' 防注入
-->