MyBatis框架(7.0)

MyBatis框架(7.0)

MyBatis缓存机制

持久化的开发框架,必须有缓存机制,可以减少数据库的访问操作,以达到性能的提升。
在这里插入图片描述

一级缓存

范例:观察一级缓存
New.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 设置命名空间,可以与不同表的同类型操作进行区分,使用时以“空间名称.id”的方式调用 -->
<mapper namespace="cn.mldn.mapping.NewsNS"> 
	<!-- 结果转换映射,一般都会在查询的时候使用 -->
	<resultMap type="News" id="NewsResultMap">
		<id property="nid" column="nid"/>
		<result property="title" column="title"/>
		<result property="pubdate" column="pub_date"/>
	</resultMap>
	<select id="findById" parameterType="int" resultMap="NewsResultMap">
		SELECT nid,title,pub_date FROM news WHERE nid=#{pnid} ;
	</select> 
</mapper>

测试:

package cn.mldn.cachedemo;
import cn.mldn.util.MyBatisSessionFactory;
import cn.mldn.vo.News;
public class TestFirstCacheDemoA {
	public static void main(String[] args) {
		News voa = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(voa);
		System.out.println("=====================================");
		News vob = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(vob);
	}
}

在这里插入图片描述
修改测试代码:

package cn.mldn.cachedemo;
import cn.mldn.util.MyBatisSessionFactory;
import cn.mldn.vo.News;
public class TestFirstCacheDemoA {
	public static void main(String[] args) {
		News voa = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(voa);
		voa.setNid(300);	// 修改nid数据
		System.out.println("=====================================");
		News vob = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(vob);
	}
}

在这里插入图片描述
因为只是引用传递,返回的对象与原始的对象保存着同样的引用。
范例:提交一次事务

package cn.mldn.cachedemo;
import cn.mldn.util.MyBatisSessionFactory;
import cn.mldn.vo.News;
public class TestFirstCacheDemoB {
	public static void main(String[] args) {
		News voa = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(voa);
		voa.setTitle("田老师不是好人");	// 修改nid数据
		MyBatisSessionFactory.getSession().commit();
		System.out.println("=====================================");
		News vob = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(vob);
	}
}

在这里插入图片描述
如果数据发生了事务的提交处理,那么程序会认为该数据已经发生了变更,所以会自动将缓存中的数据清楚掉,那么之后如果继续查询同样的数据,最终发现重复出现了查询指令。
手工清除缓存:

package cn.mldn.cachedemo;
import cn.mldn.util.MyBatisSessionFactory;
import cn.mldn.vo.News;
public class TestFirstCacheDemoC {
	public static void main(String[] args) {
		News voa = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(voa);
		MyBatisSessionFactory.getSession().clearCache();
		System.out.println("=====================================");
		News vob = MyBatisSessionFactory.getSession().selectOne(
				"cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(vob);
	}
}

在这里插入图片描述

二级缓存

在这里插入图片描述
范例:观察二级缓存

package cn.mldn.cachedemo;
import org.apache.ibatis.session.SqlSession;
import cn.mldn.util.MyBatisSessionFactory;
import cn.mldn.vo.News;
public class TestSecondCacheDemoA {
	public static void main(String[] args) {
		SqlSession sessionA = MyBatisSessionFactory.getSessionFactory()
				.openSession();
		News voa = sessionA.selectOne("cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(voa);
		System.out.println("=====================================");
		SqlSession sessionB = MyBatisSessionFactory.getSessionFactory()
				.openSession();
		News vob = sessionB.selectOne("cn.mldn.mapping.NewsNS.findById", 2); 
		System.out.println(vob);
	}
}

在这里插入图片描述
1,修改mybatis.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration   
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>	
	<settings>
		<!-- 启用二级缓存的配置 -->
		<setting name="cacheEnabled" value="true"/>
	</settings>
	<typeAliases>
		<typeAlias type="cn.mldn.vo.News" alias="News"/>
	</typeAliases>
	<environments default="development">		<!-- 配置数据源的相关信息 -->
		<environment id="development">
			<!-- 此时的事务控制交由JDBC负责处理 -->
			<transactionManager type="jdbc" />	<!-- 使用JDBC方式管理 -->
			<dataSource type="POOLED">			<!-- 设置数据源类型,此时为POOLED -->
				<property name="driver" value="org.gjt.mm.mysql.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mldn" />
				<property name="username" value="root" />
				<property name="password" value="mysqladmin" />
			</dataSource>
		</environment>
	</environments>
	<mappers>									<!-- 映射文件信息 -->
		<mapper resource="cn/mldn/vo/mapping/News.xml" />
	</mappers>
</configuration>

2,在需要使用的缓存文件上进行配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 设置命名空间,可以与不同表的同类型操作进行区分,使用时以“空间名称.id”的方式调用 -->
<mapper namespace="cn.mldn.mapping.NewsNS"> 
	<cache />
	<!-- 结果转换映射,一般都会在查询的时候使用 -->
	<resultMap type="News" id="NewsResultMap">
		<id property="nid" column="nid"/>
		<result property="title" column="title"/>
		<result property="pubdate" column="pub_date"/>
	</resultMap>
	<select id="findById" parameterType="int" resultMap="NewsResultMap" useCache="false"> 
		SELECT nid,title,pub_date FROM news WHERE nid=#{pnid} ;
	</select> 
</mapper>

3,还要注意两点:
·第一个session必须关闭才可以将内容写入二级缓存中;

public class TestSecondCacheDemoA {
	public static void main(String[] args) {
		SqlSession sessionA = MyBatisSessionFactory.getSessionFactory()
				.openSession();
		News voa = sessionA.selectOne("cn.mldn.mapping.NewsNS.findById", 2);
		System.out.println(voa);
		sessionA.close(); 
		System.out.println("=====================================");
		SqlSession sessionB = MyBatisSessionFactory.getSessionFactory()
				.openSession();
		News vob = sessionB.selectOne("cn.mldn.mapping.NewsNS.findById", 2); 
		System.out.println(vob);
	}
}

2,vo类必须实现java.io.Serializable接口;

@SuppressWarnings("serial")
public class News implements Serializable {
	private Integer nid ;
	private String title ;
	private Date pubdate ;
	}

在这里插入图片描述
`如果不要进行缓存可以取消:

<select id="findById" parameterType="int" resultMap="NewsResultMap" useCache="false"> 
		SELECT nid,title,pub_date FROM news WHERE nid=#{pnid} ;
	</select> 

还可以配置缓存项:

<cache eviction="FIFO" flushInterval="10000" readOnly="true" size="512"/>
eviction="FIFO"       :表示该缓存操作所使用的算法,先进先出
(LRU,FIFO,SOFT,WEAK)
flushInterval="10000" :缓存的刷新时间,单位为毫秒
readOnly="true"       : 缓存永远做只读配置。
size="512"            :占用的内存的大小
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值