mybatis二级缓存配置要如何编写?该怎么启动?

上回我们讲到了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缓存配置的所有内容了,想了解更多mybatis常见问题一直关注我们的网站吧。

推荐阅读:

mybatis缓存的作用是什么?mybatis缓存有几种?

mybatis和hibernate的区别是什么?有什么区别?

mybatis的使用需要用到什么?java使用mybatis