# MyBatis基础及高级应用
## 说在前面
>**本章相关代码及笔记地址:**[**飞机票🚀**](https://github.com/EayonLee/JavaGod/tree/main/1%E9%98%B6%E6%AE%B5%EF%BC%9A%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/01%E6%A8%A1%E5%9D%97%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%81%E4%B9%85%E5%B1%82%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E5%8F%8AMyBatis%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/02.MyBatis%E5%9F%BA%E7%A1%80%E5%9B%9E%E9%A1%BE%E5%8F%8A%E9%AB%98%E7%BA%A7%E5%BA%94%E7%94%A8)
>
>🌍Github:[🚀Java超神之路:【🍔Java全生态技术学习笔记,一起超神吧🍔】](https://github.com/EayonLee/JavaGod)<br>
>🪐CSDN:[🚀Java超神之路:【🍔Java全生态技术学习笔记,一起超神吧🍔】](https://blog.csdn.net/qq_20492277/article/details/114269863)
## 目录
- [MyBatis基础及高级应用](#mybatis基础及高级应用)
- [说在前面](#说在前面)
- [目录](#目录)
- [一、Mybatis相关概念](#一mybatis相关概念)
- [1.1 对象/关系数据库映射(ORM)](#11-对象关系数据库映射orm)
- [1.2 MyBatis简介](#12-mybatis简介)
- [1.3 为什么要用MyBatis](#13-为什么要用mybatis)
- [二、Mybatis基本应用](#二mybatis基本应用)
- [2.1 快速入门](#21-快速入门)
- [2.1.1 开发步骤](#211-开发步骤)
- [2.1.2 环境搭建](#212-环境搭建)
- [2.1.3 编写测试代码](#213-编写测试代码)
- [2.2 MyBatis的Dao层实现](#22-mybatis的dao层实现)
- [2.2.1 传统开发方式](#221-传统开发方式)
- [2.2.3 代理开发方式](#223-代理开发方式)
- [2.3 Mybatis相应API介绍](#23-mybatis相应api介绍)
- [2.3.1 SqlSession工厂构建器:SqlSessionFactoryBuilder](#231-sqlsession工厂构建器sqlsessionfactorybuilder)
- [2.3.2 SqlSession工厂对象:SqlSessionFactory](#232-sqlsession工厂对象sqlsessionfactory)
- [2. 3.3 SqlSession会话对象](#2-33-sqlsession会话对象)
- [三、MyBatis配置文件深入](#三mybatis配置文件深入)
- [3.1 *mapper.xml映射文件](#31-mapperxml映射文件)
- [3.2 sqlMapConfig.xml核心配置文件层级关系](#32-sqlmapconfigxml核心配置文件层级关系)
- [3.3 sqlMapConfig.xml中常用配置解析](#33-sqlmapconfigxml中常用配置解析)
- [3.3.1 environments标签](#331-environments标签)
- [3.3.2 mapper标签](#332-mapper标签)
- [3.3.3 properties标签](#333-properties标签)
- [3.3.4 typeAliases标签](#334-typealiases标签)
- [四、动态SQL及SQL片段](#四动态sql及sql片段)
- [4.1 if语句](#41-if语句)
- [4.2 where语句](#42-where语句)
- [4.3 foreach语句](#43-foreach语句)
- [4.3 SQL片段抽取](#43-sql片段抽取)
- [五、MyBatis复杂映射开发](#五mybatis复杂映射开发)
- [5.1 一对一查询](#51-一对一查询)
- [5.1.1 一对一查询的模型及需求](#511-一对一查询的模型及需求)
- [5.1.2 一对一查询的SQL语句](#512-一对一查询的sql语句)
- [5.1.3 一对一查询的具体实现](#513-一对一查询的具体实现)
- [5.2 一对多查询](#52-一对多查询)
- [5.2.1 一对多查询的模型及需求](#521-一对多查询的模型及需求)
- [5.2.2 一对多查询的语句](#522-一对多查询的语句)
- [5.2.3 一对多查询的具体实现](#523-一对多查询的具体实现)
- [5.3 多对多查询](#53-多对多查询)
- [5.3.1 多对多查询的模型及需求](#531-多对多查询的模型及需求)
- [5.3.2 多对多查询的语句](#532-多对多查询的语句)
- [5.3.3 多对多查询的具体实现](#533-多对多查询的具体实现)
- [六、MyBatis注解开发](#六mybatis注解开发)
- [6.1 常用注解](#61-常用注解)
- [6.2 注解方式进行CRUD](#62-注解方式进行crud)
- [七、MyBatis缓存](#七mybatis缓存)
- [7.1 缓存相关概念](#71-缓存相关概念)
- [7.2 一级缓存验证](#72-一级缓存验证)
- [7.2.1 验证一](#721-验证一)
- [7.2.2 验证二](#722-验证二)
- [7.3 一级缓存原理探究与源码分析](#73-一级缓存原理探究与源码分析)
- [7.4 二级缓存验证](#74-二级缓存验证)
- [7.4.1 验证](#741-验证)
- [7.4.2 二级缓存的其他配置:useCache和flushCache](#742-二级缓存的其他配置usecache和flushcache)
- [7.4.2.1 userCache禁用二级缓存](#7421-usercache禁用二级缓存)
- [7.4.2.2 flushCache刷新二级缓存**](#7422-flushcache刷新二级缓存)
- [7.5 二级缓存原理探究与源码分析](#75-二级缓存原理探究与源码分析)
- [7.6 Redis实现二级缓存(MyBatis分布式缓存)](#76-redis实现二级缓存mybatis分布式缓存)
- [7.6.1 概述](#761-概述)
- [7.6.2 实现](#762-实现)
- [八、MyBatis插件](#八mybatis插件)
- [8.1 插件简介](#81-插件简介)
- [8.2 MyBatis插件介绍](#82-mybatis插件介绍)
- [8.3 MyBatis插件原理](#83-mybatis插件原理)
- [8.4 自定义插件](#84-自定义插件)
- [8.5 插件源码分析](#85-插件源码分析)
## 一、Mybatis相关概念
### 1.1 对象/关系数据库映射(ORM)
ORM全称Object/Relation Mapping:表示**对象-关系映射**的缩写
ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,程序员既可以利用面向对象程序设计语言的简单易用性,又可以利用关系数据库的技术优势。ORM把关系数据库包装成面向对象的模型。ORM框架是面向对象设计语言与关系数据库发展不同步时的中间解决方案。采用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的放松来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层SQL操作。ORM框架实现的效果:把对持久化对象的保存、修改、删除 等操作,转换为对数据库的操作
### 1.2 MyBatis简介
MyBatis是一款优秀的基于ORM的半自动轻量级持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO (Plain Old Java Objects,普通老式Java对 象)为数据库中的记录。
### 1.3 为什么要用MyBatis
* MyBatis是一个半自动化的持久化层框架。
* jdbc编程—当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。
* Hibernate和JPA;长难复杂SQL,对于Hibernate而言处理也不容易;内部自动生产的SQL,不容易做特殊优化。;基于全映射的全自动框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。
* 对开发人员而言,核心sql还是需要自己优化;sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据;可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介
**1.4 MyBatis优势**
Mybatis是一个半自动化的持久层框架,对开发人员开说,核心sql还是需要自己进行优化,sql和java编码进行分离,功能边界清晰,一个专注业务,一个专注数据。
**分析图示如下:**
![img](https://cdn.jsdelivr.net/gh/EayonLee/IMG-Cloud@master/data/clipboard.png)
## 二、Mybatis基本应用
### 2.1 快速入门
MyBatis官网地址:[http://www.mybatis.org/mybatis-3/ ](http://www.mybatis.org/mybatis-3/)
#### 2.1.1 开发步骤
- 添加MyBatis的坐标
- 创建user数据表
- 编写User实体类
-