MyBatis——缓存
一、缓存简述:
1、缓存分类:
1)一级缓存:默认开启;
2)二级缓存:默认关闭
2、一级缓存:
(1)作用域:一次SqlSession会话;
(2)释放缓存:
1)SqlSession调用了close()方法,关闭缓存,缓存不再可用;
2)SqlSession调用了clearCache(),清空缓存,缓存还可再用;
3)SqlSession中执行了任何一个update操作(update()、delete()、insert()),清空缓存;
3、二级缓存:
(1)作用域:Application;
(2)开启二级缓存:
1)mybatis配置文件:添加<setting name="cacheEnabled" value="true"></setting>标签;
2)映射配置:添加<cache/>标签;
3)domain实体类:实现序列化接口Serializable;
(3)缓存说明:
1)insert、update和delete语句会刷新缓存,而不是清空缓存;
2)注意提交事务和或者关闭session,不然缓存错误;
二、示例:
1)mybatis配置文件:
<?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> <!-- 引入db配置文件,可以使用${}配置服务器 --> <properties resource="db.properties"/> <settings> <!-- 启用延迟加载特性,不配置默认关闭该特性--> <setting name="lazyLoadingEnabled" value="true"></setting> <!-- 延迟加载: false;及时加载:true; --> <setting name="aggressiveLazyLoading" value="false"/> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"></setting> </settings> <!--配置对象别名--> <typeAliases> <!--<typeAlias type="com.qf.entity.User" alias="user"></typeAlias>--> <!-- 批量别名,只写包名,包下的所有类的别名为首字母小写 --> <package name="com.qf.entity"/> </typeAliases> <!--配置转换器--> <!--<typeHandlers>--> <!-- <typeHandler handler="全限命名" javaType="" jdbcType="" />--> <!--</typeHandlers>--> <!-- 开发环境 default指定使用的环境id --> <environments default="development"> <!-- 开发环境id--> <environment id="development"> <!-- 事务提交方式: JDBC:利用JDBC方式处理事务(commit、rollback、close); MANAGED:将事务交由其它组件托管(spring、jobss),默认关闭连接; --> <transactionManager type="JDBC"/> <!-- 数据源类型: UNPOOLED:传统JDBC模式,不使用连接池; POOLED:使用数据库连接池,三方连接池; JNDI:从tomcat中获取一个内置的连接池; --> <dataSource type="POOLED"> <!--配置数据库信息 --> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </dataSource> </environment> </environments> <mappers> <!-- 加载映射文件 --> <!--<mapper resource="com.qf.entity/UserMapper.xml" />--> <!-- 批量加载映射文件,只写包名;要求xml和mapper接口放一个包内,且名称相同 --> <package name="com.qf.mapper"/> </mappers> </configuration>
2)实体类实现序列化接口:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class User implements Serializable { private Long id; private String name; private Integer age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
3)映射文件配置:
<?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"> <mapper namespace="com.qf.mapper.UserMapper"> <cache></cache> <resultMap id="BaseResultMap" type="com.qf.entity.User"> <id column="id" jdbcType="BIGINT" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> <result column="age" jdbcType="INTEGER" property="age"/> </resultMap> <select id="selectAll" resultMap="BaseResultMap"> select * from user; </select> </mapper>
4)测试结果:
//第一次查询数据库,第二次查询缓存;
三、总结:
这玩意有问题,别用;