mybatis一级缓存

细看注释

/**
 * 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();
        }

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值