MyBatis(8)延迟加载&缓存
<!-- 延迟加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!-- 延迟加载 -->
<resultMap type="com.MrChengs.po.Orders" id="slow">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/> <!-- 实现对用户信息进行延迟加载
select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)
要使用userMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,如果findUserById不在本mapper中需要前边加namespace
column:订单信息中关联用户信息查询的列,是user_id
关联查询的sql理解为:
SELECT orders.*,
(SELECT username FROM USER WHERE orders.user_id = user.id)username,
(SELECT sex FROM USER WHERE orders.user_id = user.id)sex
FROM orders
-->
<association property="user" javaType="com.MrChengs.po.User"
select="com.MrChengs.mapper.UserMapper.findUserById" column="user_id"></association> </resultMap>
<select id="findSlowing" resultMap="slow">
SELECT * from orders
</select>
测试文件:
//延迟加载
@Test
public void testfindSlowing() throws Exception {
SqlSession sqlSession = getSqlSessionFactory().openSession(); //代理对象
OrderMapperCustomer mapper = sqlSession.getMapper(OrderMapperCustomer.class); //测试findOrderUsers
List<Orders> orders = mapper.findSlowing(); for(Orders order : orders){
User user = order.getUser();
System.out.println(user);
} sqlSession.close();
}
结果:
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743]
DEBUG [main] - ==> Preparing: SELECT * from orders
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 3
DEBUG [main] - ==> Preparing: select * from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, username=王五, birthday=null, sex=2, address=null]
User [id=1, username=王五, birthday=null, sex=2, address=null]
DEBUG [main] - ==> Preparing: select * from user where id=?
DEBUG [main] - ==> Parameters: 10(Integer)
DEBUG [main] - <== Total: 1
User [id=10, username=张三, birthday=Thu Jul 10 00:00:00 CST 2014, sex=1, address=北京市]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743]
第一次查询先去缓存中查询,若没有则取数据库中查询
//一级缓存
@Test
public void testCahseFiret() throws Exception{
SqlSession sqlSession = getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//第一次查询 User user = mapper.findUserById(1);
System.out.println(user); //第二次查询
User user1 = mapper.findUserById(1);
System.out.println(user1); sqlsession.close();
}
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743]
DEBUG [main] - ==> Preparing: select * from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, username=王五, birthday=null, sex=2, address=null]
User [id=1, username=王五, birthday=null, sex=2, address=null]
@Test
public void testCahseFiret() throws Exception{
SqlSession sqlSession = getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//第一次查询 User user = mapper.findUserById(1);
System.out.println(user); //commit
User adduser = new User();
adduser.setUsername("Mr");
adduser.setSex(1);
mapper.addUser(user);
//清空缓存
sqlSession.commit(); //第二次查询
User user1 = mapper.findUserById(1);
System.out.println(user1); sqlSession.close();
}
结果:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 149047107.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743]
DEBUG [main] - ==> Preparing: select * from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, username=王五, birthday=null, sex=2, address=null]
DEBUG [main] - ==> Preparing: insert into user(id,username,birthday,sex,address) value(?,?,?,?,?)
DEBUG [main] - ==> Parameters: 1(Integer), 王五(String), null, 2(Integer), null
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
cacheEnabled:对在此配置文件下的所有cache 进行全局性开/关设置。
<!-- 开启本mapper的namespace下的二级缓存 -->
<cache> </cache>
实现pojo类实现里序列化接口:
public class User implements Serializable{
......
}
为了将存储数据取出执行反序列化的操作,以内二级缓存存储介质多种多种杨,不一定在内存
//二级缓存
@Test
public void testCahseSecond() throws Exception{
SqlSession sqlSession = getSqlSessionFactory().openSession();
SqlSession sqlSession1 = getSqlSessionFactory().openSession();
//第一次查询
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user);
//将执行关闭操作,将sqlsession写道二级缓存
sqlSession.close(); //第二次查询
UserMapper mapper2 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper2.findUserById(1);
System.out.println(user1);
sqlSession1.close();
}
结果:
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1990a65e]
DEBUG [main] - ==> Preparing: select * from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, username=王五, birthday=null, sex=2, address=null]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1990a65e]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1990a65e]
DEBUG [main] - Returned connection 428910174 to pool.
DEBUG [main] - Cache Hit Ratio [com.MrChengs.mapper.UserMapper]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1873859565.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@6fb0d3ed]
DEBUG [main] - ==> Preparing: select * from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, username=王五, birthday=null, sex=2, address=null]
MyBatis(8)延迟加载&缓存的更多相关文章
- mybatis的延迟加载、一级缓存、二级缓存
mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...
- Mybatis的延迟加载和缓存
1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. 注意:MyBatis的延迟加 ...
- Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...
- MyBatis原理-延迟加载,一级缓存,二级缓存设置
一.延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息. ...
- 延迟加载以及mybatis一级二级缓存
延迟加载 延迟加载:在真正使用数据时才发起查询,不用的时候不查询,又叫按需查询(懒加载) 立即加载:不管用不用,只要调用方法,直接发起查询 表关系:一对多 多对一 一对一 ...
- redis学习总结-redis作为MyBatis的自定义缓存
1.RedisCache.java package com.houtai.cache; import java.util.concurrent.locks.ReadWriteLock; import ...
- Mybatis 测试延迟加载
在学习mybatis的延迟加载时,对 lazyLoadingEnabled 和 aggressiveLazyLoading 的区别并不理解,特别是对查询的条件不同时,执行的查询语句也不一样,所以还是测 ...
- spring+springmvc+mybatis+redis实现缓存
先搭建好redis环境 需要的jar如下: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:330 ...
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
随机推荐
- asp get与post获取的区别
1.HTTP请求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP请求中, ...
- PHP读取配置文件连接MySQL数据库
读取配置文件方法parse_ini_file($filepath [,$section]) 代码: conn.php <?php //连接数据库 //$conn =new mysqli('loc ...
- getElementsByName属性
getElementsByName() 方法可返回带有指定名称的对象的集合 语法 document.getElementsByName(name) 该方法与 getElementById() 方法相似 ...
- vsphere client 使用本地磁盘cd/vd1创建虚拟机 operating system not fond,解决办法
出现operating system not fond 后,狂敲enter键,然后就可以了.别问我为什么,我也是偶然在砸键盘的瞬间发现的
- Python-常用模块2
今天我们继续来看模块的那些事儿 一.os模块 所有和操作系统相关内容都在os模块 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('d ...
- 巧用dynamic给对象字段动态赋值(经测试无效,使用反射解决)
动态把json对象的字段值赋给某个对象的字段 var dt=Utils.JsonDataTableConvert.ToDataTable(tableJson); foreach (DataRow ro ...
- HTML5学习笔记之canvas
标签 canvas标签有一个默认宽高:300*150: canvas的宽高一般写到行间样式中,写在style会有问题详细请看这里: 绘制环境 要绘图先要获取到绘制环境: var oC = docume ...
- jQuery框架学习第十一天:实战jQuery表单验证及jQuery自动完成提示插件
jQuery框架学习第一天:开始认识jQueryjQuery框架学习第二天:jQuery中万能的选择器jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQuer ...
- openlayers模仿google地图--地图版权随鹰眼关闭打开而改变位置
额..题目有点长......今天有个群友问我.想实现google地图地图版权随鹰眼关闭状态改变位置的功能.就是这种<ignore_js_op> 打开鹰眼时 地图版权也随着鹰眼位置改变而改 ...
- MySQL主从复制与读写分离概念及架构分析
1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的33 ...