# lagouStu
**Repository Path**: roah/lagouStu
## Basic Information
- **Project Name**: lagouStu
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-04-21
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 拉勾课程作业,这个是主分支,想看各个章节,请去各个章节分支
## **一、简答题**
### 1、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?
MyBatis动态SQL是在基于xml编写SQL的基础上,通过标签的形式,实现一定的业务逻辑,使得可以根据传参数不同,业务逻辑的不同,动态变换SQL,也同时使得动态变换SQL和业务逻辑无关,开发者不需要通过代码逻辑判断实现SQL变换,降低维护成本。
MyBatis所有的动态SQL标签如下:
```
、、、、、、、、、、
```
首先制定一个读取XML解析的规范,已通过ongl表达式以及针对标签和属性的值判断,动态拼接sql,从而完成动态sql的功能。
### 2、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
支持延迟加载,一般实在关联表查询的时候设置延迟加载。在配置文件中使用lazyLoadingEnabled=true启用延迟加载。
原理:使用动态代理,通过DefaultResultSetHandler创建目标对象的代理对象。在执行完主查询,先执行代理对象的invoke方法判断子类属性的值,如果不存在,就进行子类关联的sql语句进行子查询
### 3、Mybatis都有哪些Executor执行器?它们之间的区别是什么?
主要有BatchExecutor,ReuseExecutor,SimpleExecuter,CachingExecutor.
SimpleExecuter:最简单的执行器,根据对应的sql直接执行即可,不会做一些额外的操作。
BatchExecutor:重用语句并执行批量更新。
ReuseExecutor:重用预处理语句的执行器。
CachingExecutor: 启用二级缓存的执行器。
### 4、简述下Mybatis的一级、二级缓存(分别从存储结构、范围、失效场景。三个方面来作答)?
存储结构:一级缓存存储的实体类对象。
二级缓存存储的是序列化的数据信息。使用时根据映射关系组合成新实体对象。
范围:一级缓存是SqlSession级别的缓存,作用域是SqlSession。
二级缓存是mapper级别。多个sqlSession公用同一个mapper的缓存。
失效场景: 一级缓存:在sqlSession执行增删改操作时,缓存失效。
二级缓存:相同namespace下mapper映射文件中进行了CRUD,并提交了事务。缓存失效。
### 5、简述Mybatis的插件运行原理,以及如何编写一个插件?
Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行需要拦截对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法。
实现插件方法:
1.实现Interceptor接口类。
2.实现类中加入@Intercepts注解,设置想要拦截的类和方法。
3.在配置文件的plugin标签中设置使用的插件全路径名。
## **二、编程题**
请完善自定义持久层框架IPersistence,在现有代码基础上添加、修改及删除功能。【需要采用getMapper方式】