MyBatis学习四 懒加载和缓存


一.懒加载

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
*
FROM
orders
</select>

测试;

@Test
	public void test7() throws Exception{
		

		String resource="SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session
		SqlSession 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);

测试:

@Test
	public void test10() throws Exception{
		String resource="SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session
		SqlSession 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);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session
		SqlSession 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;// 地址

测试:

@Test
	public void test10() throws Exception{
		String resource="SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session1
		SqlSession session1=sqlSessionFactory.openSession();
		//创建session2
		SqlSession 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值