MyBatis——缓存

一、缓存简述:

  1、缓存分类

    1)一级缓存:默认开启;

    2)二级缓存:默认关闭

  2、一级缓存:

    (1)作用域:一次SqlSession会话;

    (2)释放缓存:

      1SqlSession调用了close()方法,关闭缓存,缓存不再可用;

      2SqlSession调用了clearCache(),清空缓存,缓存还可再用;

      3SqlSession中执行了任何一个update操作(update()、delete()、insert()),清空缓存;

  3、二级缓存:

  (1)作用域:Application;

  (2)开启二级缓存:

    1)mybatis配置文件:添加<setting name="cacheEnabled" value="true"></setting>标签;

    2)映射配置:添加<cache/>标签;

    3)domain实体类:实现序列化接口Serializable;

  (3)缓存说明:

    1insert、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)实体类实现序列化接口:

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 +
                '}';
    }
}
User

  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)测试结果:

    

  //第一次查询数据库,第二次查询缓存;

 三、总结:

  这玩意有问题,别用;

 

posted @ 2019-08-07 17:54  开拖拉机的拉风少年  阅读(146)  评论(0编辑  收藏  举报