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
  • 相关阅读:
    PHP设计模式:简单工厂
    MySQL实现两张表数据的同步
    SSH中Action的单例与多例
    Java日期时间操作的一些方法
    Null value was assigned to a property of primitive type setter of
    Android Studio创建AVD
    一台主机上安装多个Tomcat
    Tomcat指定的服务已存在
    Unsupported major.minor version 52.0问题的解决
    修改MySQL自动递增值
  • 原文地址:https://www.cnblogs.com/linding/p/13646060.html
Copyright © 2011-2022 走看看