目录
每文一铺垫
今天没有什么特别的,但是在朋友圈看到了一个图还是很好玩的,拿出来分享给大家,这个贼搞笑,里面有辣条、大虾、大葱、辣椒、小米辣、棉花糖、冰激凌、黄瓜……做的糖葫芦哈哈哈哈哈哈哈,惊呆了老铁!
今天分享咱们的mybatis一级缓存、二级缓存和延迟加载
Mybatis一级缓存
这个直接讲的话可能会有些懵,直接上栗子
先看我们的基础代码
@Test
public void test1() throws IOException {
//1. 读取配置文件,通过mybatis提供的Resources对象读取
//InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//2. 获取sqlSession工厂对象 sqlSessionFactory
//2.1 获取SqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//2.2. 获取sqlSession工厂对象
SqlSessionFactory sf = builder.build(is);
//3. 获取sqlSession对象
SqlSession sqlSession = sf.openSession();
//4. 使用SqlSession创建dao接口的代理对象
Customer customer1 = sqlSession.getMapper(Customer.class);
//5. 使用代理对象执行查询所有方法
Customer customer1 = mapper.findById(1);
System.out.println(customer1 );
//6. 释放资源
sqlSession.close();
is.close();
}
这是不是最基础的mybatis操作流程
思考一个问题 :在这里我们调用了findById();方法,当我们再次调用findById();方法,是从哪里查询的呢?
带着问题,第二次调用findById();方法看一下
//获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
Customer customer1 = mapper.findById(1);
Customer customer2 = mapper.findById(1);
sqlSession.close();
看一下执行的SQL语句,我们发现SQL查询语句只执行了一次
结论:在一个SqlSession中,对customer表格根据id进行2次查询,只会执行一次SQL语句,第一次查询,发送sql,将查询的结果放进缓存中,第二次查询时,由于是同一个SqlSession,会在缓存中查询结果如果有,直接从缓存中获取结果,不和数据库进行交互
以上是对“查询”操作而言,那么中间执行一次更新操作,是怎么执行的呢?
SqlSession sqlSession = MyBatisUtils.getSqlSess