mybatis缓存。

先说结论:

  • mybatis默认开启一级缓存。
  • mybatis默认是TRANSACTION_SERIALIZABLE,所以测试的时候,需要修改为TRANSACTION_READ_COMMITTED(2)级别.
  • 同一个mapper下,如果执行了修改和删除,比如说id为1的数据。则该mapper下的缓存都会失效,包括缓存的id为2,3的也会失效。
  • 同一session下的不同mapper,执行更新(改,删,增),也会缓存失效。
  • 同sessionfactory下的不同session下的不同mapper,执行更新,不会缓存失效。
  • 不同sessionfactory修改,缓存不会失效。

  • 二级缓存是namespace,也就是说不同sqlsession针对同一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>
        <!-- lazyLoadingEnabled:延迟加载启动,默认是false -->
        <setting name="lazyLoadingEnabled" value="false" />
        <!-- aggressiveLazyLoading:积极的懒加载,false的话按需加载,默认是true -->
        <setting name="aggressiveLazyLoading" value="false" />
        <!-- 开启二级缓存,默认是false -->
        <setting name="cacheEnabled" value="true" />
    </settings>

    <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/wang" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/wang/BlogMapper.xml" />
        <mapper resource="com/wang/PersonMapper.xml" />
    </mappers>
</configuration>

PersonMapper.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="com.wang.PersonMapper">
    <select id="get" resultType="com.wang.Person">
        select * from Person where id =
        #{id}
    </select>

    <update id="update" parameterType="com.wang.Person">
        update person set name=#{name}
        where id=#{id}
    </update>
    <delete id="delete" parameterType="integer">
        delete from person where
        id=#{id}
    </delete>

    <insert id="insert" parameterType="com.wang.Person">
        insert into person(name)
        values(#{name});
    </insert>
</mapper>

BlogMapper.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="com.wang.BlogMapper">
    <select id="get" resultType="com.wang.Blog">
        select * from Blog where id =
        #{id}
    </select>

    <update id="update" parameterType="com.wang.Blog">
        update blog set name=#{name}
        where id=#{id}
    </update>

    <delete id="delete" parameterType="integer">
        delete from blog where id=#{id}
    </delete>
</mapper>

java代码

package com.wang;

public class Blog {
    private int id;
    private String name;

    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;
    }
}


package com.wang;

public class Person {
    private int id;
    private String name;

    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;
    }
}
package com.wang;

public interface BlogMapper {
    public Blog get(int id);

    public void delete(int id);

    public void update(Blog blog);

    public int insert(Blog blog);
}
package com.wang;

public interface PersonMapper {
    public Person get(int id);

    public void delete(int id);

    public void update(Person person);

    public int insert(Person person);
}


package com.wang;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {
    public static void main(String[] args) throws Exception {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        Connection con = session.getConnection();
        // 打印4
        System.out.println(con.getTransactionIsolation());
        con.setTransactionIsolation(2);
        BlogMapper blogMappe = session.getMapper(BlogMapper.class);
        System.out.println(blogMappe.get(1).getName());
        // Blog blog = new Blog();
        // blog.setId(2);
        // blog.setName("cccccccccc");
        // blogMappe.update(blog);
        System.out.println(blogMappe.get(1).getName());
        //
        Person p = new Person();
        p.setName("c");
        sqlSessionFactory.openSession().getMapper(PersonMapper.class).delete(22);;
        //
        System.out.println(blogMappe.get(1).getName());
        System.out.println(blogMappe.get(1).getName());
        session.close();
    }

    public static SqlSession getSession() throws IOException{
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }
}

设计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值