Hibernate和MyBatis缓存对比 
框架 
缓存 
作用范围 
默认开启 
 
 
Hibernate 
一级缓存 
Session 
是 
 
 
二级缓存 
SessionFactory 
否 
 
MyBatis 
一级缓存 
SqlSession 
是 
 
 
二级缓存 
SqlSessionFactory 
否 
 
MyBatis缓存 MyBatis一级缓存 在SqlSession范围内,当查询相同的对象时,会使用缓存中的数据,而不会再次查询。
只要SqlSession不关闭,使用SqlSession去查询同一个对象,就只会执行一条sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package  com.course.test;import  java.util.List;import  org.apache.ibatis.session.SqlSession;import  org.junit.Test;import  com.course.dao.DepartmentDao;import  com.course.util.MyBatisUtil;import  com.course.vo.Department;public  class  DepartmentTest  {	private  SqlSession  sqlSession  =  MyBatisUtil.openSqlSession(); 	private  DepartmentDao  departmentDao  =  sqlSession.getMapper(DepartmentDao.class); 	 	@Test  	public  void  getDepartmentById ()  { 		Integer  departmentId  =  1 ; 		Department  department1  =  departmentDao.getDepartmentById(departmentId); 		Department  department2  =  departmentDao.getDepartmentById(departmentId); 		 		System.out.println(department1); 		System.out.println(department2); 		 	} } 
 
1 2 3 4 5 DEBUG [main] - ==>  Preparing: select * from department where department_id = ?  DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <==      Total: 1 Department [department_id=1, department_name=Retail Department, location=5 floor, employees=null] Department [department_id=1, department_name=Retail Department, location=5 floor, employees=null] 
 
只执行了一次查询
MyBatis二级缓存 作用范围为SqlSessionFactory,需要手动启用。
Mapper.xml中添加<cache></cache>标签,该Mapper.xml中的所有sql都会开启二级缓存,不仅<select>,包括<insert><update><delete>都会开启二级缓存。
如果想要让某个sql不开启二级缓存,添加属性useCache="false",默认值为true
Mapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <?xml version="1.0"  encoding="UTF-8" ?> <!DOCTYPE mapper    PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN"    "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper  namespace ="com.course.dao.abc.UserDao" > 	 	<cache > </cache >  	<insert  id ="addUserXml"  parameterType ="com.course.vo.User" >  		insert into user(name, age, address, birthday)  			values(#{name}, #{age}, #{address}, #{birthday}) 	</insert >  	 	<update  id ="updateUser"  parameterType ="com.course.vo.User" >  		update user set name=#{name}, age=#{age}, address=#{address}, birthday=#{birthday} 			where id=#{id} 	</update >  	 	<delete  id ="deleteUser"  parameterType ="int" >  		delete from user  			where id=#{val} 	</delete >  	 	<select  id ="getUserById"  parameterType ="int"  resultType ="com.course.vo.User" >  		select * from user where id=#{val} 	</select >  	 	<select  id ="getAllUser"  useCache ="false"  resultType ="com.course.vo.User" >  		select * from user 	</select >  </mapper > 
 
mybatis.cfg.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xml version="1.0"  encoding="UTF-8" ?> <!DOCTYPE configuration    PUBLIC  "-//mybatis.org//DTD Config 3.0//EN"    "http://mybatis.org/dtd/mybatis-3-config.dtd" >    <configuration > 	<settings >  		 		<setting  name ="cacheEnabled"  value ="true" />  	</settings >       </configuration > 
 
MyBatis和Hibernate的比较 Hibernate: 自动生成表,生成关系,对于单表的CRUD,不用写sql和hql
mybatis: 对于多表连接查询等等更加方便,因为sql写起来简单
Mybatis半自动化模式操作数据,hibenate完全面向对象操作数据
Mybatis运行的性能高于hibernate的性能
Mybatis开发速度低于hibernate的开发速度
Mybatis应用在互联网项目的开发,Hibernate用在传统的MIS(Management Information System,管理信息系统)系统开发