MyBatis一些知识点归纳

什么是框架(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的配置文件中开启二级缓存。

<setting name="cacheEnabled" value="true"/>

2 在Mybatis的映射XML中配置cache或者 cache-ref 。

<cache/> 

cache标签用于声明这个namespace使用二级缓存,并且可以自定义配置。

type: cache使用的类型,默认是PerpetualCache,这在一级缓存中提到过。

eviction: 定义回收的策略,常见的有FIFO,LRU。

flushInterval: 配置一定时间自动刷新缓存,单位是毫秒

size: 最多缓存对象的个数

readOnly: 是否只读,若配置可读写,则需要对应的实体类能够序列化。

blocking: 若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。

<cache-ref namespace="mapper.StudentMapper"/>

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文件:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>


<properties resource="database.properties"></properties>

<settings>


        <setting name="logImpl" value="LOG4J"/>



    </settings>


    <typeAliases>

<package name="cn.smbms.pojo"/>

</typeAliases>


    <environments default="develop">


        <environment id="develop">


            <transactionManager type="JDBC"></transactionManager>


UNPOOLLED :每次都要新建一个连接

POOLED:mybatis自带的数据源 连接池

JNDI:tomcat自带的

-->

            <dataSource type="POOLED">


$:select * from smbms where id=1

#:select * from smbms where id='1' 防注入

-->

                <property name="driver" value="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="${user}"/>

<property name="password" value="${password}"/>

</dataSource>

</environment>

</environments>


<mappers>

<mapper resource="cn/smbms/dao/user/UserMapper.xml"></mapper>

<mapper resource="cn/smbms/dao/provider/ProviderMapper.xml"></mapper>

<mapper resource="cn/smbms/dao/bill/BillMapper.xml"></mapper>

</mappers>

</configuration>


     打个广告,本人博客地址是:风吟个人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容