细看注释
/**
* Unit test for simple App.
* mybatis的缓存
* 一级缓存不受我们的配置
*/
public class AppTest03 {
SqlSessionFactory sessionFactory;
@Before
public void setUp() throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(in);
}
/*
* 一级缓存:在Session范围之内
* 跨Session不能使用一级缓存
* */
@Test
public void selectPersonByIdLazy() {
SqlSession session = sessionFactory.openSession();
try {
/*
* 第一次查询:首先去缓存中去根据结果集的唯一标识(mybatis的策略)查找数据,
* 如果缓存中存在该数据就使用该数据,如果缓存中没有该数据就去数据库中查询,然后把结果集放入缓存
* */
Orders orders = session.selectOne("mappings.OrdersMapper.selectPersonByIdLazy", 1);
/*
* 第二次查询:同理可得
* */
Orders orders1 = session.selectOne("mappings.OrdersMapper.selectPersonByIdLazy", 1);
System.out.println(orders.getPerson());
System.out.println(orders1.getPerson());
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
SqlSession session2 = sessionFactory.openSession();
try {
Orders orders = session2.selectOne("mappings.OrdersMapper.selectPersonByIdLazy", 1);
System.out.println(orders.getPerson());
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
/*
* 两次查询中间做update、delete、insert会对结果集的查询的缓存数据会刷新(清空缓存)
*/
@Test
public void selectPersonByIdLazy2() {
SqlSession session = sessionFactory.openSession();
try {
/*
* 第一次查询:首先去缓存中去根据结果集的唯一标识(mybatis的策略)查找数据,
* 如果缓存中存在该数据就使用该数据,如果缓存中没有该数据就去数据库中查询,然后把结果集放入缓存
* 注意:在第一次查询完之后,如果是手动在库里更新了同第一次查询的数据集一样的数据,那么在第二次查询的时候将还是会拿缓存里面的数据,
* 因为缓存并不知道你手动更新了数据,所以会造成第二次查询的结果跟库不一的情况,不过一般在生产环境上不会有一次性同样的sql查两次需求,
* 很少的,而且生产环境是不能随便更改数据库的。
* */
Orders orders = session.selectOne("mappings.OrdersMapper.selectPersonByIdLazy", 1);
orders.setAddr("xxxx");
orders.setOrderId(2);
orders.setPid(1);
/*
* 代码来做一次update、delete、insert会对结果集的查询的缓存数据会刷新(清空缓存)
* */
session.update("mappings.PersonMapper.updateByPrimaryKeySelective", orders);
session.commit();
/*
* 第二次查询:同理可得
* */
Orders orders1 = session.selectOne("mappings.OrdersMapper.selectPersonByIdLazy", 1);
System.out.println(orders.getPerson());
System.out.println(orders1.getPerson());
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
}