一级缓存 java_一级缓存

## 概念

存在于内存中的临时数据.减少数据库交互,提高执行难效率.

## 一级缓存概念

一级缓存默认是开启的.它指的是MyBatis中SqlSession对象的缓存.当我们执行查询之后,查询的结果会同时存入SqlSession到为我们提供的一块区域中.该区域的结构是一个Map,当我们再次查询同样的数据,MyBatis会先去SqlSession查询是否有,有的话直接拿出来使用.当SqlSession消失时MyBatis的一级缓存也就消失了.

## 实例

~~~

IUserDao mapper = session.getMapper(IUserDao.class);

User user1 = mapper.findById(41);

System.out.println(user1);

User user2 = mapper.findById(41);

System.out.println(user2);

~~~

```

2019-04-04 21:00:26,953 0 [ main] DEBUG ache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.

2019-04-04 21:00:27,168 215 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection

2019-04-04 21:00:27,420 467 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b26f7b2]

2019-04-04 21:00:27,429 476 [ main] DEBUG com.like.dao.IUserDao.findById - ==> Preparing: select * from user where id = ? //只查询了一次

2019-04-04 21:00:27,473 520 [ main] DEBUG com.like.dao.IUserDao.findById - ==> Parameters: 41(Integer)

2019-04-04 21:00:27,502 549 [ main] DEBUG com.like.dao.IUserDao.findById - <== Total: 1

User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京', accounts=null}

User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京', accounts=null}

2019-04-04 21:00:27,506 553 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b26f7b2]

2019-04-04 21:00:27,507 554 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b26f7b2]

```

## 关闭session

~~~

SqlSession session1 = build.openSession();

IUserDao mapper1 = session1.getMapper(IUserDao.class);

User user1 = mapper1.findById(41);

System.out.println(user1);

session1.close();

SqlSession session2 = build.openSession();

IUserDao mapper2 = session2.getMapper(IUserDao.class);

User user2 = mapper2.findById(41);

System.out.println(user2);

~~~

可以看到查询了两次:

```

2019-04-04 21:02:08,396 0 [ main] DEBUG ache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.

2019-04-04 21:02:08,633 237 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection

2019-04-04 21:02:08,900 504 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@eafc191]

2019-04-04 21:02:08,909 513 [ main] DEBUG com.like.dao.IUserDao.findById - ==> Preparing: select * from user where id = ?

2019-04-04 21:02:08,972 576 [ main] DEBUG com.like.dao.IUserDao.findById - ==> Parameters: 41(Integer)

2019-04-04 21:02:08,999 603 [ main] DEBUG com.like.dao.IUserDao.findById - <== Total: 1

User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京', accounts=null}

2019-04-04 21:02:09,003 607 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@eafc191]

2019-04-04 21:02:09,004 608 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@eafc191]

2019-04-04 21:02:09,006 610 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection

2019-04-04 21:02:09,019 623 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@78ac1102]

2019-04-04 21:02:09,020 624 [ main] DEBUG com.like.dao.IUserDao.findById - ==> Preparing: select * from user where id = ?

2019-04-04 21:02:09,021 625 [ main] DEBUG com.like.dao.IUserDao.findById - ==> Parameters: 41(Integer)

2019-04-04 21:02:09,022 626 [ main] DEBUG com.like.dao.IUserDao.findById - <== Total: 1

User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京', accounts=null}

```

## 手动清空缓存

~~~

session.clearCache();

~~~

## 触发清空一级缓存的情况

当调用session的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值