Mybatis-核心源码相关
#与$的区别
一个是占位符方式,一个是字符串拼接方式;其中占位符方式可以防止sql注入;字符串拼接方式,无法防止sql注入
一级缓存和二级缓存的区别
从以下四个点分析
1、源码的实现流程:一级缓存是通过BaseExecutor去query;二级缓存是通过CachingExecutor去query
2、查询Cache的区别:
一级缓存只会通过PerpetualCache 去查询,如下
二级缓存的通过 TransactionalCacheManager 去管理Cache如下
- SynchronizedCache:加锁,确保线程安全
- SerializedCache:对数据做序列化和反序列化的操作
- LoggingCache:记录缓存命中率的日志。
- LruCache:基于Lru删除最近最少使用的缓存对象,Lru策略就是基于LinkedHashMap实现的,最大长度默认为1024。
3、作用域:一级缓存的作用域是SqlSession级别;二级缓存的作用域是SqlSessionFactory级别
4、优先级别&默认开关:二级缓存的优先级高于一级缓存;一级默认开启;二级默认关闭
MyBatis中的Executor
主要是如下:
- BaseExecutor: 基本的执行器,除了CachingExecutor之外,都是继承BaseExecutor实现的。
- CachingExecutor: 他就是二级缓存的执行器。
- SimpleExecutor: 一般默认使用的就是SimpleExecutor,每次执行SQL语句,都会创建一个Statement对象去和数据库完成交互。
- ReuseExecutor: 可复用的执行器,复用的是Statement对象,他会根据SQL语句来决定是否复用一些Statement,他是将SQL作为Key,Statement作为Value扔到了一个HashMap里。
- BatchExecutor: 批处理执行器,针对写操作,但是不是你想的那种批处理,他是将每次要执行的SQL语句,扔到一个集合里,等你commit之后,再一个一个扔给数据库执行。
**选择Executor,默认是在MyBatis的核心配置文件中修改settings,指定defaultExecutorType