Mybatis如何實現(xiàn)延遲加載及緩存
一、延遲加載
1、在mybatis.xml配置文件中,開啟延遲加載
<settings> <!--開啟延遲加載--> <setting name='lazyLoadingEnabled' value='true'></setting> <setting name='aggressiveLazyLoading' value='false'></setting> <!--延遲加載觸發(fā)方法,equals、hashCode、toString都會觸發(fā)加載--> <setting name='lazyLoadTriggerMethods' value='hashCode'></setting> <!--數(shù)據(jù)庫下劃線(_)命名轉(zhuǎn)駝峰命名--> <setting name='mapUnderscoreToCamelCase' value='true'/> </settings>
2、配置mapper文件
1、一對一
* 一方
<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)閉延遲加載會做兩次查詢--><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>
* 測試
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> <!--關(guān)閉延遲加載會做兩次查詢--><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>
* 測試
Grade grade = gmapper.selectById(1);System.out.println(grade);// student.hashCode();System.out.println(grade.getStudents());
二、緩存
1、一級緩存
1、概念
一級緩存是SqlSession范圍的緩存,當調(diào)用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、對象需要實現(xiàn)Serializable接口
2、在mybatis.xml配置文件中,開啟二級緩存
<settings><!--開啟二級緩存--><setting name='cacheEnabled' value='true'/></settings>
3、配置mapper文件
<cache/><select 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();// 只查詢了一次數(shù)據(jù)庫。二級緩存存儲的是數(shù)據(jù),并不是對象System.out.println(student1 == student2); // false
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. MYSQL數(shù)據(jù)庫存文本轉(zhuǎn)存數(shù)據(jù)庫問題2. 如何實現(xiàn)MySQL數(shù)據(jù)庫的備份與恢復(fù)3. mysql 視圖操作和存儲過程4. oracle觸發(fā)器介紹5. mysql數(shù)據(jù)庫中最常用的時間轉(zhuǎn)換函數(shù)的用法6. sqlserver數(shù)據(jù)庫導(dǎo)入方法的詳細圖文教程7. MySQL快速插入一億測試數(shù)據(jù)8. SQL Server中的數(shù)據(jù)類型詳解9. ACCESS轉(zhuǎn)SQL數(shù)據(jù)庫相關(guān)的幾個技能10. mysql啟動時報錯 ERROR! Manager of pid-file quit without
