附上学习链接
以下是我的学习笔记。
MyBatis的学习笔记
Mybatis的缓存
一级缓存
- session缓存,默认开启
- 测试类Test_8
package com.southwind.test;
import com.southwind.entity.Account;
import com.southwind.repository.AccountRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
//一级缓存 SqlSession级别
public class Test_8 {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
AccountRepository accountRepository = sqlSession.getMapper(AccountRepository.class);
Account account = accountRepository.findById(1);
System.out.println(account);
// 测试 关闭sqlSession再打开是否查询两次SQL语句
// sqlSession.close();
// sqlSession = sqlSessionFactory.openSession();
// accountRepository = sqlSession.getMapper(AccountRepository.class);
Account account1 = accountRepository.findById(1);
System.out.println(account1);
}
}
- 连续查询同样的对象,SQL语句只执行一次
- 关闭SQLSession后再次打开,查询了两次SQL语句
二级缓存
MyBatis自带的二级缓存
- 测试类Test_9
package com.southwind.test;
import com.southwind.entity.Account;
import com.southwind.repository.AccountRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
//Mybatis 自带的二级缓存
//config.xml配制开启二级缓存
//Mapper.xml开启二级缓存
//实体类实现序列化接口
//只要来自同一个Mapper.xml就可以用
public class Test_9 {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
AccountRepository accountRepository = sqlSession.getMapper(AccountRepository.class);
Account account = accountRepository.findById(1);
System.out.println(account);
// 测试 关闭sqlSession再打开是否查询两次SQL语句
sqlSession.close();
sqlSession = sqlSessionFactory.openSession();
accountRepository = sqlSession.getMapper(AccountRepository.class);
Account account1 = accountRepository.findById(1);
System.out.println(account1);
}
}
- AccountRepositoryMapper.xml 添加该条语句(Mapper.xml开启二级缓存)
<!-- 在Mapper.xml中开启二级缓存-->
<cache></cache>
- config.xml 中配制开启二级缓存
<!-- 延时加载的配制-->
<settings>
<!-- 打印SQL-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 延时加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
- 实体类实现序列化接口 Account.java
package com.southwind.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class Account implements Serializable{
private int id;
private String username;
private String password;
private int age;
public Account(int id, String username, String password, int age) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
}
@Override
public String toString()