一、特殊符号转义
特殊符号处理 在mybatis中的xml文件中,存在一些特殊的符号,比如:、"、&、<> 等,正常书写mybatis会报错,需要对这些符号进行转义。
具体转义如下所示: 特殊字符 转义字符
除了可以使用上述转义字符外,还可以使用来包裹特殊字符。如 下所示:
<!CDATA[ ]>是XML语法。在CDATA内部的所有内容都会被解析器忽略。 但是有个问题那就是<if>、<where>、<choose>等这些标签都不会被解析,所以 我们只把有特殊字符的语句放在<!CDATA[ ]>尽量缩小 的范围。
二、myBatis缓存
1、缓存
缓存:数据缓存,让数据离我们执行程序更近, 让程序可以快速的获取到数据
手机缓存、浏览器缓存、cpu缓存等
当访问量过大时,会将数据库中的数据先存入缓存(第一次查询后先不销毁,保存在java对象中,相对时间再进行销毁 ),对数据库进行保护,减少访问量过大
存入缓存一般有两大极端:一种是短期时间内访问量极大、一种是修改可能性极小
查询流程:先从缓存中查数据,缓存中如果没有则从数据库查询,数据库查询后把数据存入缓存,下次直接从缓存中获取、
2、 myBatis一级缓存
默认是SqlSession级别的,在同一个SqlSession中查询的数据存入SqlSession对象中 .第二次查询数据时,先从sqlSession对象中查询,如果有则直接返回,如果没有再连接数据库
一级缓存生命周期:开始于sqlSession对象,结束语sqlSession对象关闭。如果在此期间执行了新增修改删除,也会清空sqlSession对象中的缓存数据。调用sqlSession中的clearCache()方法也会强制清空一级缓存数据
@Select("select id,name,gender from teacher where id = #{id}")
Teacher findTeacherById(Integer id);
@Test
public void test4(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
TeacherDao teacherDao = sqlSession.getMapper(TeacherDao.class);
Teacher teacher = teacherDao.findTeacherById(4);
Teacher teacher1 = teacherDao.findTeacherById(4);
System.out.println(teacher);
System.out.println(teacher1);
sqlSession.commit();
sqlSession.close();
}
两个结果
只执行了一次
3、 myBatis二级缓存
二级缓存是SqlSessionFactory级别的,多个SqlSession共享的,其作用域是同一个namespace。不同的 sqlSession 两次执行相同namespace下的sql语句且向sql中传递参数也相同 即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存 (内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
Mybatis 默认没有开启二级缓存需要配置开启二级缓存。
配置开启二级缓存需要三步:
1、启用二级缓存
在SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当 cacheEnabled 设置为true时启用二级缓存,设置为false时禁用二级缓存。
<setting name="cacheEnabled" value="true"/>
2、对象序列化
将所有的POJO类实现序列化接口Java.io.Serializable
3、配置映射文件
在Mapper映射文件中添加<cache>标签,表示此mapper开启二级缓存。 当SqlSeesion 关闭时,会将数据存入到二级缓存 属性flushInterval可以设置销毁时间,毫秒为单位 。cache可以设置其他属性,包括是否只读,销毁策略等,详情请见API
,详情请见API
只查询了一次