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
  • 相关阅读:
    Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)
    Linux下面配置文件~/.bash_profile
    Java数据结构之回溯算法的递归应用迷宫的路径问题
    Java数据结构之对称矩阵的压缩算法---
    Java数据结构之字符串模式匹配算法---KMP算法2
    Java数据结构之字符串模式匹配算法---KMP算法
    Java数据结构之字符串模式匹配算法---Brute-Force算法
    Java数据结构之表的增删对比---ArrayList与LinkedList之一
    Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
    Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
  • 原文地址:https://www.cnblogs.com/linding/p/13646060.html
Copyright © 2011-2022 走看看