一路繁花似锦绣前程
失败的越多,成功才越有价值

导航

 

一、延迟加载

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

 

posted on 2020-09-10 15:38  一路繁花似锦绣前程  阅读(183)  评论(0编辑  收藏  举报