# 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方式】