zoukankan      html  css  js  c++  java
  • mybatis延迟加载和缓存

    一、延迟加载

    1、在mybatis.xml配置文件中,开启延迟加载
        <settings>
            <!--开启延迟加载-->
            <setting name="lazyLoadingEnabled" value="true"></setting>
            <setting name="aggressiveLazyLoading" value="false"></setting>
            <!--延迟加载触发方法,equals、hashCode、toString都会触发加载-->
            <setting name="lazyLoadTriggerMethods" value="hashCode"></setting>
            <!--数据库下划线(_)命名转驼峰命名-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
    2、配置mapper文件
        1、一对一
            * 一方
                <resultMap id="studentGradeById" type="Student">
                    <id column="id" property="id"></id>
                    <result column="name" property="name"></result>
                    <result column="age" property="age"></result>
                    <result column="sex" property="sex"></result>          <!--关闭延迟加载会做两次查询-->
                    <association column="grade_id" property="grade" javaType="Grade"
                                 select="com.wuxi.daos.GradeMapper.selectById"></association>
                </resultMap>
                <select id="selectStudentGradeById" resultMap="studentGradeById">
                    select * from student where id = #{id}
                </select>
            * 另一方
                <select id="selectById" resultType="Grade">
                    select * from grade where id = #{id}
                </select>
            * 测试
                Student student = smapper.selectStudentGradeById(4);
                System.out.println(student);
                // student.hashCode();
                System.out.println(student.getGrade());
        2、一对多
            * 一方
                <resultMap type="Grade" id="gradeStudents">
                    <id column="id" property="id"></id>
                    <result column="name" property="name"></result>          <!--关闭延迟加载会做两次查询-->
                    <collection property="students" ofType="Student" column="id"
                                select="com.wuxi.daos.StudentMapper.selectStudentsByGrade"></collection>
                </resultMap>
                <select id="selectById" resultMap="gradeStudents">
                    select * from grade where id = #{id}
                </select>
            * 多方
                <select id="selectStudentsByGrade" resultType="Student">
                    select * from student where grade_id=#{grade_id}
                </select>
            * 测试
                Grade grade = gmapper.selectById(1);
                System.out.println(grade);
                // student.hashCode();
                System.out.println(grade.getStudents());

    二、缓存

    1、一级缓存
        1、概念
            一级缓存是SqlSession范围的缓存,当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
        2、测试
            // Student student1 = smapper.selectStudentGradeById(1);
            // Student student2 = smapper.selectStudentGradeById(1);
            // System.out.println(student1 == student2);    // true
            // ********************************
            Student student1 = smapper.selectStudentGradeById(1);
            Student student = new Student();
            student.setName("杜兰特");
            student.setAge(28);
            student.setSex(1);
            smapper.insertStudent(student);
            Student student2 = smapper.selectStudentGradeById(1);
            System.out.println(student1 == student2);    // false
    2、二级缓存
        1、开启二级缓存
            1、对象需要实现Serializable接口
            2、在mybatis.xml配置文件中,开启二级缓存
                <settings>
                    <!--开启二级缓存-->
                    <setting name="cacheEnabled" value="true"/>
                </settings>
            3、配置mapper文件
                <cache/>
                <select id="selectStudentGradeById" resultMap="studentGradeById" useCache="true">
                    select * from student where id = #{id}
                </select>
        2、测试
            SqlSession sqlSession1 = sqlSessionFactory.openSession();
            StudentMapper mapper1 = sqlSession1.getMapper(StudentMapper.class);
            Student student1 = mapper1.selectStudentGradeById(1);
            sqlSession1.close();
            SqlSession sqlSession2 = sqlSessionFactory.openSession();
            StudentMapper mapper2 = sqlSession2.getMapper(StudentMapper.class);
            Student student2 = mapper2.selectStudentGradeById(1);
            sqlSession2.close();
            // 只查询了一次数据库。二级缓存存储的是数据,并不是对象
            System.out.println(student1 == student2);   // false
  • 相关阅读:
    k8s之一键部署docker及k8s脚本(适用于centos7,cnetos8及ubuntu)
    k8s之使用Kubeadm部署k8s集群
    lnmp架构之一键搭建wordpress博客网站脚本(适用于centos7和centos8)
    一键编译安装nginx-1.18.0脚本(适用centos7,ubuntu1804,debian10)
    xshell登陆服务器步骤
    xshell无法连接到linux主机原因分析
    数据库文件备份与还原
    Linux服务器运维基本命令
    服务器运维操作命令
    firewalld的基本使用
  • 原文地址:https://www.cnblogs.com/linding/p/13646060.html
Copyright © 2011-2022 走看看