1 Star 0 Fork 0

UncleJoker / lagou第一部分作业

Create your Gitee Account
Explore and code with more than 5 million developers,Free private repositories !:)
Sign up
Clone or download
作业.md 2.66 KB
Copy Edit Web IDE Raw Blame History
UncleJoker authored 2020-03-30 22:44 . first

1.mybatis中的动态sql是为了应对复杂的业务场景诞生的,对传入的参数进行一系列的判断,

从而让最终执行的sql准确符合业务需求。

动态sql的种类:if,where,choose,when,otherwise,trim,set,foreach,script,bind

执行原理:XMLStatementBuilder.parseStatementNode()解析sql语句的时候,通过XMLLanguageDriver.createSqlSource()方法调用XMLScriptBuilder.parseScriptNode()生成DynamicSqlSource对象,生成之后通过getBoundSql()方法解析动态sql的标签,生成最终的BoundSql。

2.MyBatis支持延迟加载。当配置了lazyLoadingEnabled=true的时候,启用mybatis全局延迟加载。

当延迟加载开启的时候,执行一对一或者一对多sql查询,创建resultSet结果集的时候会通过动态代理去将需要延迟加载的sql的存入ResultLoaderMap对象中

3.SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

CachingExecutor:先从缓存中获取查询结果,存在就返回,不存在,再委托给Executor delegate去数据库取,delegate可以是上面任一的SimpleExecutor、ReuseExecutor、BatchExecutor

4.存储结构:一级缓存是个hashMap,二级缓存默认数据结构也是HashMap,但是可以通过实现Cache接口去进行扩展。

作用范围:一级缓存作用范围SqlSession,二级缓存的作用范围是mapper级别的,也就是多个sqlSession多同一个mapper中的sql进行查询的话,二级缓存都能生效

失效场景:一级缓存当该sqlSession执行增、删、改操作时就会清空缓存。二级缓存会在当调用相同namespace下的mapepr映射文件中增删改sql,并执行了commit操作时失效

5.mybatis插件其实就是一个实现Interceptor接口的方法,即拦截器。采用责任链模式,通过动态代理组织多个插件,通过这些插件可以改变Mybatis的默认行为(诸如SQL重写之类的)。

如何编写:继承Interceptor,并实现接口方法。在该类上加上@Intercepts注解,并在注解中使用@Signature注解指定拦截的类和方法

Comment ( 0 )

Sign in for post a comment

Java
1
https://gitee.com/UncleJoker/lagou_part_1_mybatis.git
git@gitee.com:UncleJoker/lagou_part_1_mybatis.git
UncleJoker
lagou_part_1_mybatis
lagou第一部分作业
master

Search