# lagou-task **Repository Path**: lixing20080830/lagou-task ## Basic Information - **Project Name**: lagou-task - **Description**: 拉勾课程作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-03-05 - **Last Updated**: 2020-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 第一阶段 开源框架源码剖析 ## 模块一 持久层框架设计实现及MyBatis源码分析 ### 一、简单题 #### 1、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理? 答:动态sql 是根据条件动态的拼接sql语句的; If 、choose(when,otherwise)、trim(where,set)、foreach; 基于 OGNL 的表达式的原理实现的。 #### 2、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? 答: 支持延迟加载;原理是 动态代理。 #### 3、Mybatis都有哪些Executor执行器?它们之间的区别是什么? 答: SIMPLE: 默认的执行器, 对每条sql进行预编译->设置参数->执行等操作 BATCH: 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作 REUSE: REUSE 执行器会重用预处理语句 #### 4、简述下Mybatis的一级、二级缓存(分别从存储结构、范围、失效场景。三个方面来作答)? 一级缓存:基于sqlSession级别的,对同一个sqlSession发起的查询操作,会把结果缓存在map集合中,下次再次执行相同的查询时直接从缓存中拿数据;一旦执行了更新操作缓存中的数据将清除。比如第一次执行查询,然后执行更新操作,再次执行查询操作,则最后一次执行的查询操作不会从缓存中取数据。 二级缓存:是基于mapper或者说基于namespace的;缓存的数据也是存放在map中。二级缓存各sqlsession共享该缓存。比如sqlsession1执行了同一mapper下的查询操作,sqlsession2再次执行相同的查询操作时则直接从二级缓存中取数据,当然如果sqlsession1执行了更新操作后,sqlsession2再次执行查询操作,此时二级缓存的数据已经被清除,sqlsession2查询操作不在走缓存。 #### 5、简述Mybatis的插件运行原理,以及如何编写一个插件? 答: 运行原理:动态代理。 编写一个插件, 首先写一个类实现Interceptor 接口, 在实现类上使用@Intercepts 注解, 在mybatis-confg.xml文件里配置该插件。 ### 二、编程题 请完善自定义持久层框架IPersistence,在现有代码基础上添加、修改及删除功能。【需要采用getMapper方式】 见工程【IPersistence】【IPersistence_test】