先说结论:
- mybatis默认开启一级缓存。
- mybatis默认是TRANSACTION_SERIALIZABLE,所以测试的时候,需要修改为TRANSACTION_READ_COMMITTED(2)级别.
- 同一个mapper下,如果执行了修改和删除,比如说id为1的数据。则该mapper下的缓存都会失效,包括缓存的id为2,3的也会失效。
- 同一session下的不同mapper,执行更新(改,删,增),也会缓存失效。
- 同sessionfactory下的不同session下的不同mapper,执行更新,不会缓存失效。
不同sessionfactory修改,缓存不会失效。
二级缓存是namespace,也就是说不同sqlsession针对同一mapper是同享缓存的。
测试代码:
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>
<!-- lazyLoadingEnabled:延迟加载启动,默认是false -->
<setting name="lazyLoadingEnabled" value="false" />
<!-- aggressiveLazyLoading:积极的懒加载,false的话按需加载,默认是true -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 开启二级缓存,默认是false -->
<setting name="cacheEnabled" value="true" />
</settings>
<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/wang" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/wang/BlogMapper.xml" />
<mapper resource="com/wang/PersonMapper.xml" />
</mappers>
</configuration>
PersonMapper.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.wang.PersonMapper">
<select id="get" resultType="com.wang.Person">
select * from Person where id =
#{id}
</select>
<update id="update" parameterType="com.wang.Person">
update person set name=#{name}
where id=#{id}
</update>
<delete id="delete" parameterType="integer">
delete from person where
id=#{id}
</delete>
<insert id="insert" parameterType="com.wang.Person">
insert into person(name)
values(#{name});
</insert>
</mapper>
BlogMapper.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.wang.BlogMapper">
<select id="get" resultType="com.wang.Blog">
select * from Blog where id =
#{id}
</select>
<update id="update" parameterType="com.wang.Blog">
update blog set name=#{name}
where id=#{id}
</update>
<delete id="delete" parameterType="integer">
delete from blog where id=#{id}
</delete>
</mapper>
java代码
package com.wang;
public class Blog {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.wang;
public class Person {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.wang;
public interface BlogMapper {
public Blog get(int id);
public void delete(int id);
public void update(Blog blog);
public int insert(Blog blog);
}
package com.wang;
public interface PersonMapper {
public Person get(int id);
public void delete(int id);
public void update(Person person);
public int insert(Person person);
}
package com.wang;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
public static void main(String[] args) throws Exception {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
Connection con = session.getConnection();
// 打印4
System.out.println(con.getTransactionIsolation());
con.setTransactionIsolation(2);
BlogMapper blogMappe = session.getMapper(BlogMapper.class);
System.out.println(blogMappe.get(1).getName());
// Blog blog = new Blog();
// blog.setId(2);
// blog.setName("cccccccccc");
// blogMappe.update(blog);
System.out.println(blogMappe.get(1).getName());
//
Person p = new Person();
p.setName("c");
sqlSessionFactory.openSession().getMapper(PersonMapper.class).delete(22);;
//
System.out.println(blogMappe.get(1).getName());
System.out.println(blogMappe.get(1).getName());
session.close();
}
public static SqlSession getSession() throws IOException{
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
return session;
}
}