Mybatis如何實(shí)現(xiàn)延遲加載及緩存
一、延遲加載
1、在mybatis.xml配置文件中,開(kāi)啟延遲加載
<settings> <!--開(kāi)啟延遲加載--> <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、開(kāi)啟二級(jí)緩存
1、對(duì)象需要實(shí)現(xiàn)Serializable接口
2、在mybatis.xml配置文件中,開(kāi)啟二級(jí)緩存
<settings><!--開(kāi)啟二級(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. mybatis 連接mysql數(shù)據(jù)庫(kù) tinyint 為boolean類型詳解2. Oracle數(shù)據(jù)庫(kù)不完全恢復(fù)實(shí)例3. Oracle數(shù)據(jù)庫(kù)備份與恢復(fù)精華資料集錦4. Oracle冷備份的不完全恢復(fù)5. 怎樣才能保護(hù)好SQL Server 數(shù)據(jù)庫(kù)6. Sql Server 壓縮數(shù)據(jù)庫(kù)日志文件的方法7. MySQL case when使用方法實(shí)例解析8. 如何在Windows 2000下將Oracle完全卸載9. MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理10. MySQL 性能、監(jiān)控與災(zāi)難恢復(fù)
