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ù)庫下劃線(_)命名轉(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>
* 測試
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>
* 測試
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、測試
// 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、測試
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ù)庫。二級(jí)緩存存儲(chǔ)的是數(shù)據(jù),并不是對(duì)象System.out.println(student1 == student2); // false
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. MySQL全文搜索之布爾搜索2. 啟動(dòng)MYSQL出錯(cuò) Manager of pid-file quit without updating file.3. 使用MySqldump命令導(dǎo)出數(shù)據(jù)時(shí)的注意4. 如何實(shí)現(xiàn)MySQL數(shù)據(jù)庫的備份與恢復(fù)5. MySql遠(yuǎn)程連接的實(shí)現(xiàn)方法6. MySQL Community Server 5.1.497. oracle觸發(fā)器介紹8. MYSQL(電話號(hào)碼,身份證)數(shù)據(jù)脫敏的實(shí)現(xiàn)9. 在AIX 5L上快速部署Oracle10. 在SQL Server 2005數(shù)據(jù)庫中修改存儲(chǔ)過程
