一、Mybatis一级缓存
Mybatis的一级缓存是存在session上,只要通过session查过的数据,都会放在当前的session上,下一次再查询相同的数据,就直接去缓存中取出来,而不用到数据库里去查询。当session不是同一个session时,就算时条件相同,也要重新从数据库进行第二次查询。
下面进行验证一级缓存的存在,且只存在于当前session中
目录结构
1、准备简单的数据表和所需要的jar包
- log4j-1.2.17.jar
- mybatis-3.4.2.jar
- mysql-connector-java-5.0.8-bin.jar
2、新建一个java项目就可以进行测试,创建一个lib目录存放jar包
3、实体类User.java
package com.rainy.entity;
public class User {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
4、实体类的映射UserMapper.xml
<?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.rainy.entity">
<insert id="addUser" parameterType="User">
insert into user ( name ) values (#{name})
</insert>
<delete id="deleteUser" parameterType="User">
delete from user where id= #{id}
</delete>
<select id="getUser" parameterType="int"
resultType="User">
select * from user where id= #{id}
</select>
<update id="updateUser" parameterType="User">
update user set name=#{name} where id=#{id}
</update>
</mapper>
5、日志文件log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.rainy=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
6、mybatis的配置文件mybatis-config.xml
<?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="lazyLoadingEnabled" value="true" />
<!-- 将积极加载改为消息加载即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<typeAliases>
<package name="com.rainy.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/rainy/mapper/UserMapper.xml"/>
</mappers>
</configuration>
7、测试类TestMybatis.java
package com.rainy;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.rainy.entity.User;
public class TestMybatis {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 第一个session使用两次
SqlSession session = sqlSessionFactory.openSession();
User user = session.selectOne("getUser", 1);
System.out.println(user);
User user2 = session.selectOne("getUser", 1);
System.out.println(user2);
session.commit();
session.close();
// 第二个session
SqlSession session2 = sqlSessionFactory.openSession();
User user3 = session2.selectOne("getUser", 1);
System.out.println(user3);
session2.commit();
session2.close();
}
}
8、测试结果
- 结果证明了mybatis一级缓存的存在,且只存在于当前session中,当换了一个session时,需要重新到数据库加载数据。
二、Mybatis二级缓存
Mybatis二级缓存是SessionFactory,如果两次查询是在同一个SessionFactory中进行的,那么就从二级缓存中取数据,而不用到数据库里去查询数据。
修改一级缓存的几个地方,便可以验证二级缓存的作用
1、启用二级缓存,配置文件中设置二级缓存为启用
<setting name="cacheEnabled" value="true"/>
2、实体类Mapper添加缓存
<cache/>
3、bean需要进行序列化
4、运行测试类的结果
再次运行TestMybatis,可以看出,在同一个SessionFactory下查询id=1的数据,只有第一次需要执行sql语句,以后都是从缓存中取出,这样就证实了二级缓存。
Mybatis一级缓存和二级缓存的基本讲解就到这里