一.懒加载
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"/>