Mybatis如何實(shí)現(xiàn)延遲加載及緩存
一、延遲加載
1、在mybatis.xml配置文件中,開啟延遲加載
<settings> <!--開啟延遲加載--> <setting name='lazyLoadingEnabled' value='true'></setting> <setting name='aggressiveLazyLoading' value='false'></setting> <!--延遲加載觸發(fā)方法,equals、hashCode、toString都會(huì)觸發(fā)加載--> <setting name='lazyLoadTriggerMethods' value='hashCode'></setting> <!--數(shù)據(jù)庫(kù)下劃線(_)命名轉(zhuǎn)駝峰命名--> <setting name='mapUnderscoreToCamelCase' value='true'/> </settings>
2、配置mapper文件
1、一對(duì)一
* 一方
<resultMap 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> <!--關(guān)閉延遲加載會(huì)做兩次查詢--><association column='grade_id' property='grade' javaType='Grade' select='com.wuxi.daos.GradeMapper.selectById'></association> </resultMap> <select resultMap='studentGradeById'>select * from student where id = #{id} </select>
* 另一方
<select resultType='Grade'>select * from grade where id = #{id} </select>
* 測(cè)試
Student student = smapper.selectStudentGradeById(4);System.out.println(student);// student.hashCode();System.out.println(student.getGrade());
2、一對(duì)多
* 一方
<resultMap type='Grade' id='gradeStudents'><id column='id' property='id'></id><result column='name' property='name'></result> <!--關(guān)閉延遲加載會(huì)做兩次查詢--><collection property='students' ofType='Student' column='id' select='com.wuxi.daos.StudentMapper.selectStudentsByGrade'></collection> </resultMap> <select resultMap='gradeStudents'>select * from grade where id = #{id} </select>
* 多方
<select resultType='Student'>select * from student where grade_id=#{grade_id} </select>
* 測(cè)試
Grade grade = gmapper.selectById(1);System.out.println(grade);// student.hashCode();System.out.println(grade.getStudents());
二、緩存
1、一級(jí)緩存
1、概念
一級(jí)緩存是SqlSession范圍的緩存,當(dāng)調(diào)用SqlSession的修改,添加,刪除,commit(),close()等方法時(shí),就會(huì)清空一級(jí)緩存。
2、測(cè)試
// 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、二級(jí)緩存
1、開啟二級(jí)緩存
1、對(duì)象需要實(shí)現(xiàn)Serializable接口
2、在mybatis.xml配置文件中,開啟二級(jí)緩存
<settings><!--開啟二級(jí)緩存--><setting name='cacheEnabled' value='true'/></settings>
3、配置mapper文件
<cache/><select resultMap='studentGradeById' useCache='true'>select * from student where id = #{id}</select>
2、測(cè)試
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();// 只查詢了一次數(shù)據(jù)庫(kù)。二級(jí)緩存存儲(chǔ)的是數(shù)據(jù),并不是對(duì)象System.out.println(student1 == student2); // false
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Navicat Premium操作MySQL數(shù)據(jù)庫(kù)(執(zhí)行sql語(yǔ)句)2. navicat for mysql導(dǎo)出sql文件的方法3. navicat for mysql導(dǎo)出數(shù)據(jù)庫(kù)的方法4. 使用DB2look重新創(chuàng)建優(yōu)化器訪問計(jì)劃(5)5. Oracle Job任務(wù)異常原因分析及其解決6. Centos7 mysql數(shù)據(jù)庫(kù)安裝及配置實(shí)現(xiàn)教程7. Oracle單行函數(shù)(字符,數(shù)值,日期,轉(zhuǎn)換)8. 用 SQL 查詢 DB2 XML 數(shù)據(jù)(1)9. mybatis plus代碼生成工具的實(shí)現(xiàn)代碼10. MySQL5.7 mysqldump備份與恢復(fù)的實(shí)現(xiàn)
