上回我们讲到了mybatis缓存的工作原理,这次我们就来具体说一说, mybatis二级缓存该怎么配置,又该怎么开启吧。
我们首先知道,二级缓存它的机制其实与一级缓存是相同的,它会默认采用 PerpetualCache,HashMap等存储对象,不同的是它其的存储作用域是Mapper(Namespace),且它能够自定义存储源,如 Ehcache等。
二级缓存配置
在MyBatis中,它的二级缓存一定是和命名空间绑定的,即二级缓存必须配置在 Mapper.xml 映射文件或 Mapper.java接口中。在映射文件中,命名空间就是 XML 根节点中 mapper 的 namespace 属性。在 Mapper 接口中,命名空间就是接口的全限定名称。
二级缓存启动
一、mybatis-config.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="logImpl" value="STDOUT_LOGGING"/> <setting name="cacheEnabled" value="true"/><!-- 二级缓存 --> </settings> <typeAliases> <package name="pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/lol?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="pojo/Product.xml"/> </mappers> </configuration>
二、增加Product.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"> <mapper namespace="pojo"> <cache/> <insert id="addProduct" parameterType="Product" > insert into product (name, price) values (#{name}, #{price}) </insert> <select id="listProduct" resultType="Product"> select * from product </select> <delete id="deleteProduct" parameterType="Product" > delete from product where id= #{id} </delete> <select id="getProduct" parameterType="_int" resultType="Product"> select * from product where id=#{id} </select> <select id="listProductByIdAndName" resultType="Product"> <bind name="likename" value="'%' + name + '%'" /> select * from product <where> <if test="name!=null"> and name like #{likename} <if test="price!=null"> and price > #{price} </if> </if> </where> </select> </mapper>
三、序列化Product.java
package pojo; import java.io.Serializable; public class Product implements Serializable { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
一般来说,在二级缓存的机制里会有一个:符号,当它缓存的个数达到某个数量的时候,就把缓存对象保存在硬盘上。但如若需把对象保存在硬盘上,就必须要实现序列化接口。
四、开始测试
package controller; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import pojo.Product; public class TestMybatis { public static void main(String [] args) throws IOException{ String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); Product p = session.selectOne("getProduct", 1); session.commit(); session.close(); SqlSession session1 = sqlSessionFactory.openSession();//二级缓存测试 Product p2 = session1.selectOne("getProduct", 1); session1.commit(); session1.close(); } }
五、结果
以上就是关于mybatis缓存配置的所有内容了,想了解更多mybatis常见问题一直关注我们的网站吧。
推荐阅读: