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
原创粉丝点击