MyBatis学习四 懒加载和缓存
来源:互联网 发布:2017学校网络改造方案 编辑:程序博客网 时间:2024/05/18 01:43
一.懒加载
mybatis中,resultMap标签的association标签和collection标签具有延迟加载的功能。
resultMap示例配置:
<resultMap type="com.study.first.OrdersExt" id="OrdersAndUserRstMap"><id column="id" property="id"/><result column="user_Id" property="userId"/><result column="number" property="number"/><!-- 用户信息一对一映射 association:表示一对一映射 property:表示其要映射的属性名, javaType:表示其对应的java类型 select:指定关联查询的statement,然后将查询结果封装到property指定的属性结果中 --><association property="user" javaType="com.study.mpo.User" select="findUserbyId" column="user_Id"></association></resultMap>
查询user的statement
<select id="findUserbyId" parameterType="int" resultType="com.study.mpo.User">SELECT * FROM USER WHERE user.`id`=#{id}</select>
查询语句
<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">SELECT*FROMorders</select>
测试;
@Testpublic void test7() throws Exception{String resource="SqlMapConfig.xml";//读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//建立sqlsessionFactorySqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);//创建sessionSqlSession session=sqlSessionFactory.openSession();//调用session的增删改查OrderExtMapper mapper = session.getMapper(OrderExtMapper.class); System.out.println(mapper.findOrdersAndUserRstMap());//提交事物session.commit();session.close();}
二.缓存
MyBatis的缓存分为一级缓存和二级缓存,一级缓存是sqlSession级别的缓存,二级缓存指的是同一个namespace下的mapper。一级缓存中有个数据区域,就是map结构,key是select语句,statement等信息组成的,value就是查询结果的值。二级缓存中同样有
一级缓存:
首先,在查询的时候,会将数据保存到一级缓存中,如果有执行增删改操作,则会情况以及缓存中的数据,再次查询的时候会将数据再次保存到以及缓存中
sqlMapper.xml
<select id="findUserbyId" parameterType="int" resultType="com.study.mpo.User">SELECT * FROM USER WHERE user.`id`=#{id}</select>
代理接口方法:
public User findUserbyId(int id);
测试:
@Testpublic void test10() throws Exception{String resource="SqlMapConfig.xml";//读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//建立sqlsessionFactorySqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);//创建sessionSqlSession session=sqlSessionFactory.openSession();//第一次查询OrderExtMapper mapper1 = session.getMapper(OrderExtMapper.class);System.out.println(mapper1.findUserbyId(1));//第二次查询OrderExtMapper mapper2 = session.getMapper(OrderExtMapper.class);System.out.println(mapper2.findUserbyId(1));//提交事物session.commit();session.close();}
结果:
如果进行了增删改,则会清空一级缓存(提交的时候清空),下一次查询的时候的就会从数据库查
public void test10() throws Exception{String resource="SqlMapConfig.xml";//读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//建立sqlsessionFactorySqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);//创建sessionSqlSession session=sqlSessionFactory.openSession();//第一次查询OrderExtMapper mapper1 = session.getMapper(OrderExtMapper.class);User user=mapper1.findUserbyId(1);System.out.println(user);user.setId(33);mapper1.insertUser(user);//提交的时候,就会清空以及缓存信息session.commit();//第二次查询OrderExtMapper mapper2 = session.getMapper(OrderExtMapper.class);System.out.println(mapper2.findUserbyId(1));//提交事物session.close();}
二级缓存
sqlMapConfig开启二级缓存,默认就是开启的
<!--开启二级缓存 --><setting name="cacheEnabled" value="true"/>
sqlMap开启二级缓存
<cache/>
使用二级缓存要序列化pojo类
public class User implements Serializable {private int id;private String username;// 用户姓名private String sex;// 性别private Date birthday;// 生日private String address;// 地址
测试:
@Testpublic void test10() throws Exception{String resource="SqlMapConfig.xml";//读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//建立sqlsessionFactorySqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);//创建session1SqlSession session1=sqlSessionFactory.openSession();//创建session2SqlSession session2=sqlSessionFactory.openSession();//第一次查询OrderExtMapper mapper1 = session1.getMapper(OrderExtMapper.class);User user=mapper1.findUserbyId(1);System.out.println(user);//session关闭时保存二级缓存 session1.close();//第二次查询OrderExtMapper mapper2 = session2.getMapper(OrderExtMapper.class);System.out.println(mapper2.findUserbyId(1)); session2.close();}
禁用缓存
useCache默认是true
<select id="findUserbyId" parameterType="int" resultType="com.study.mpo.User" useCache="false">SELECT * FROM USER WHERE user.`id`=#{id}</select>
刷新缓存
select语句中默认是false,增删改中默认是true
<select id="findUserbyId" parameterType="int" resultType="com.study.mpo.User" flushCache="true">SELECT * FROM USER WHERE user.`id`=#{id}</select>
MyBatis结合Ehcache
添加jar包:
ehcache-core-2.6.5.jar
mybatis-ehcache-1.0.2.jar
配置ehcache.xml文件
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="E:\develop\ehcache" /><defaultCache maxElementsInMemory="1000"maxElementsOnDisk="10000000" eternal="false" overflowToDisk="false"timeToIdleSeconds="120" timeToLiveSeconds="120"diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>
设置cache的实现类
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
0 0
- MyBatis学习四 懒加载和缓存
- Mybatis懒加载和缓存机制
- Mybatis学习记录(四)--高级查询和缓存
- Mybatis学习记录(四)--高级查询和缓存
- MyBatis学习(5)---------调用存储过程和缓存
- Mybatis级联查询和缓存
- SDWebImage 图片加载和缓存
- Bitmap的加载和缓存
- Mybatis步步进阶(八)——Mybatis延迟加载和缓存机制
- httpd代理服务器和缓存学习
- MyBatis(三) 事务管理和缓存机制
- Mybatis实现事务的方式和缓存
- SDWebImage使用,图片加载和缓存
- SDWebImage使用,图片加载和缓存
- SDWebImage使用,图片加载和缓存
- SDWebImage使用,图片加载和缓存
- SDWebImage使用,图片加载和缓存
- android Picasso----图片加载和缓存
- SQL SERVER获取索引脚本
- JSON的简单书写(初学),使用Java语言反序列化
- 函数参数默认值设置
- 理解JAVASCRIPT 中hasOwnProperty()的作用
- 阿里云工程师用机器学习破解雾霾成因
- MyBatis学习四 懒加载和缓存
- L2-011. 玩转二叉树
- 数据结构之二叉排序树
- MaxCompute(原ODPS) MapReduce常见问题解答
- hadoop第二天
- RecyclerView中item布局的"match_parent"属性失效--LayoutInflate的深入了解
- Qt之GUI学习笔记(四)——创建对话框
- px与dp与sp之间的转换
- vue组件最佳实践