$和#符号的区别
-
{} 相当于是预处理语句,会将# 换成占位符? ,字符串等数据赋值时自动拼接引号,可以避免SQL注入
- ${} 相当于是处理语句, 直接原样将数据取出 ,直接拼接
Mybatis缓存
缓存主要目的是为了 提高查询效率 .缓存其实就是一个内存空间,存储在程序的某个地方,存储数据.
mybatis支持缓存的,且有两级缓存
- 一级缓存
- 二级缓存
有无缓存:
无缓存:用户在访问相同数据时,需要发起多次对数据库的直接访问,导致产生大量IO、读写硬盘的操
作,效率低下
有缓存:首次访问时,查询数据库,将数据存储到缓存中;再次访问时,直接访问缓存,减少IO、硬盘
读写次数、提高效率
MyBatis的 一级缓存是默认的 .无需配置,自动实现.
默认的 一级缓存是SqlSession级别 ,是指同一个SqlSession发起的多次查询同一条数据,会使用缓存.
ps:: Mybatis内部存储缓存使用的是一个HashMap对象,key为 hashCode + sqlId + sql 语句。而value值就
是从查询出来映射生成的java对象。
关闭一级缓存
一级缓存也叫本地缓存(LocalCache),Mybatis的一级缓存是会话级别(SqlSession)层面进行缓存
的。Mybatis的一级缓存是默认开启的。开发项目中不需要做任何配置,但是如果想关闭一级缓存,可以在mybatis配置文件的settings下面使用localCacheScopde=statement来关闭。
二级缓存
二级缓存是Mapper级别 ,比SqlSession级别范围更大.
使用时需要手动设置
- 1)需要在全局配置文件中开启缓存(默认开着的
<settings>
<!-- 开启缓存(默认就是true) -->
<setting name="cacheEnabled" value="true"/>
</settings>
- 2需要在mapper中设置caceh即可
使用二级缓存
- 1)需要在全局配置文件中开启缓存(默认开着的)
- 2)需要在mapper中设置caceh即可
- 3)每个会话执行完,要关流close,才会将查询是数据放入缓存
- 4)实体类需要系列化,实现Serializable接口