一.Mybatis 極簡入門
二.Mybatis 級聯查詢
本篇:Mybatis 延遲加載
現在我們有如下需求:有時候只需要查詢學生姓名,不需要查詢學生班級,有時候不僅需要查詢姓名還要查詢班級。怎麼才能實現這個功能呢?Mybatis爲我們提供了延遲加載功能。
上一篇級聯查詢中,我們根據學生id查詢出學生姓名和班級,同時查詢了兩張表,我們要重寫一個延遲加載。
第一步:在config.xml中開啓打印SQL語句和懶加載。
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
第二步:添加查詢方法如下
package com.ibuyi.mybatis.repository;
import com.ibuyi.mybatis.entity.Student;
public interface StudentDAO {
//根據student ID查詢學生姓名班級
Student findStudentByID(long id);
//懶加載添加的方法
Student findStudentByIDLazy(long id);
}
緊接着,在mapper文件中
<resultMap id="studentLazy" type="com.ibuyi.mybatis.entity.Student">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<!--這裏進行修改,不是以前的和查詢結果一一對應,而是調用ClassDAO中的查詢方法-->
<association property="classes" javaType="com.ibuyi.mybatis.entity.Classes" select="com.ibuyi.mybatis.repository.ClassDAO.findClassedByID" column="cid"></association>
</resultMap>
<select id="findStudentByIDLazy" parameterType="long" resultMap="studentLazy">
select * from student where id=#{id}
</select>
在ClassDAO中也要聲明一個方法:
package com.ibuyi.mybatis.repository;
import com.ibuyi.mybatis.entity.Classes;
import java.util.List;
public interface ClassDAO {
//根據cid查詢班級全部學生
List<Classes> findStudentByID(long id);
Classes findClassedByID(long id);
}
<select id="findClassedByID" parameterType="long" resultType="com.ibuyi.mybatis.entity.Classes">
select * from classes where id=#{id}
</select>
測試代碼:
package com.ibuyi.mybatis.test;
import com.ibuyi.mybatis.entity.Student;
import com.ibuyi.mybatis.repository.StudentDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Test {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
Student student=studentDAO.findStudentByIDLazy(2L);
//System.out.println(student.getName());
System.out.println(student.getClasses());
}
}
public class Test {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
Student student=studentDAO.findStudentByIDLazy(2L);
System.out.println(student.getName());
//System.out.println(student.getClasses());
}
}
根據結果我們可以看出,只有在需要用到班級信息的時候,mybatis纔會幫我們執行第二條sql語句,不需要用到就不會執行。