MyBatis的?級映射及延遲加載過程詳解
一:MyBatis的?級映射及延遲加載
前期準(zhǔn)備:
模塊名:mybatis-010-advanced-mapping
打包?式:jar
引?依賴:mysql驅(qū)動依賴、mybatis依賴、junit依賴、logback依賴
pojo:com.powernode.mybatis.pojo.Student和Calzz
mapper接?:com.powernode.mybatis.mapper.StudentMapper和ClazzMapper
引?配置?件:mybatis-config.xml、jdbc.properties、logback.xml
mapper配置?件:com/powernode/mybatis/mapper/StudentMapper.xml和ClazzMapper.xml
編寫測試類:com.powernode.mybatis.test.StudentMapperTest和ClazzMapperTest
拷??具類:com.powernode.mybatis.utils.SqlSessionUtil
準(zhǔn)備數(shù)據(jù)庫表:?個班級對應(yīng)多個學(xué)?:
班級表:t_clazz

學(xué)?表:t_student

clazz實(shí)例類
package com.bjpowernode.mybatis.pojo;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.pojo
* @Project:mybatis
* @name:Clazz
* @Date:2023/1/7 18:18
*/
public class Clazz {
private Integer cid;
private String cname;
public Clazz() {
}
public Clazz(Integer cid, String cname) {
this.cid = cid;
this.cname = cname;
}
@Override
public String toString() {
return "Clazz{" +
"cid=" + cid +
", cname='" + cname + '\'' +
'}';
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
Student實(shí)體類:只定義兩個字段;對于cid屬性,是為了維護(hù)兩者關(guān)系的屬性
package com.bjpowernode.mybatis.pojo;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.pojo
* @Project:mybatis
* @name:Student
* @Date:2023/1/7 18:18
*/
public class Student {
private Integer sid;
private String sname;
public Student() {
}
public Student(Integer sid, String sname) {
this.sid = sid;
this.sname = sname;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
'}';
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}

1. 多對?

pojo類Student中添加?個屬性:Clazz clazz; 表示學(xué)?關(guān)聯(lián)的班級對象,增加setter and getter方法,重寫toString方法。
package com.bjpowernode.mybatis.pojo;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.pojo
* @Project:mybatis
* @name:Student
* @Date:2023/1/7 18:18
*/
public class Student { // Student是多的一方
private Integer sid;
private String sname;
private Clazz clazz; // Clazz是一的一方
public Student() {
}
public Student(Integer sid, String sname) {
this.sid = sid;
this.sname = sname;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", clazz=" + clazz +
'}';
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
多對一:多個學(xué)生Student對應(yīng)一個班級Clazz
多種?式,常?的包括三種:
① 第?種?式:?條SQL語句,級聯(lián)屬性映射。
② 第?種?式:?條SQL語句,association。
③第三種?式:兩條SQL語句,分步查詢。
第?種?式:級聯(lián)屬性映射
三兄弟之一:StudentMapper接口,編寫方法
根據(jù)id獲取學(xué)生Student信息,同時獲取學(xué)生關(guān)聯(lián)的班級Clazz信息
package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Student;
public interface StudentMapper {
/*
* @param id 學(xué)生的id
* @return 學(xué)生對象,但是學(xué)生對象當(dāng)中含有班級對象
*/
Student selectById(Integer id);
}三兄弟之二:StudentMapper.xml文件,編寫sql語句
(1)使用resultMap來指定映射關(guān)系,結(jié)果映射resultMap有兩個參數(shù):
一個參數(shù)是id,指定resultMap的唯一標(biāo)識,這個id將來在select標(biāo)簽中使用。
一個參數(shù)是type,用來指定POJO類的類名。
(2)在resultMap下還有一個子標(biāo)簽result;首先對于有主鍵的需要配一個id,不是必須的,但可以增加效率;下面使用result子標(biāo)簽的property屬性和column屬性分別指定POJO類的屬性名和數(shù)據(jù)庫表中的字段表之間的映射關(guān)系。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.StudentMapper">
<!--多對一映射的第一種方式:一條SQL語句,級聯(lián)屬性映射-->
<resultMap id="studentResultMap" type="Student">
<id property="id" column="id"/>
<result property="sid" column="sid"/>
<result property="clazz.cid" column="cid"/>
<result property="clazz.cname" column="cname" />
</resultMap>
<select id="selectById" resultMap="studentResultMap">
select
s.sid,s.sname,c.cid,c.cname
from
t_student s
left join
t_clazz c
on s.cid = c.cid
where
s.sid = #{sid}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.StudentMapper">
<!--多對一映射的第一種方式:一條SQL語句,級聯(lián)屬性映射-->
<resultMap id="studentResultMap" type="Student">
<id property="id" column="id"/>
<result property="sid" column="sid"/>
<result property="clazz.cid" column="cid"/>
<result property="clazz.cname" column="cname" />
</resultMap>
<select id="selectById" resultMap="studentResultMap">
select
s.sid,s.sname,c.cid,c.cname
from
t_student s
left join
t_clazz c
on s.cid = c.cid
where
s.sid = #{sid}
</select>
</mapper>三兄弟之三:StudentMappeTest類,用來編寫測試類
package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class StudentMapperTest {
@Test
public void testSelectById(){
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.selectById(1);
// 直接輸出Student對象
System.out.println(student);
// 輸出每個屬性
System.out.println(student.getSid());
System.out.println(student.getSname());
System.out.println(student.getClazz().getCid());
System.out.println(student.getClazz().getCname());
sqlSession.close();
}
}執(zhí)行結(jié)果:

第?種?式:association標(biāo)簽
第二種方式,和第一種方式的代碼很類似,就是多引入一個association標(biāo)簽,association翻譯為關(guān)聯(lián)的意思
三兄弟之一:StudentMapper接口,編寫方法
根據(jù)id獲取學(xué)生Student信息,同時獲取學(xué)生關(guān)聯(lián)的班級Clazz信息
package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Student;
public interface StudentMapper {
/**
* 一條SQL語句,使用association標(biāo)簽的方式
* @param id 學(xué)生的id
* @return 學(xué)生對象,但是學(xué)生對象當(dāng)中含有班級對象
*/
Student selectByIdAssociation(Integer id);
}三兄弟之二:StudentMapper.xml文件,編寫sql語句
association:翻譯為關(guān)聯(lián),一個Student對象關(guān)聯(lián)一個Clazz對象
①property標(biāo)簽:提供要映射的POJO類的屬性名,這里就是clazz
②javaType標(biāo)簽:用來指定要映射的java類型,這里就是com.bjpowernode.mybatis.Clazz
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.StudentMapper">
<!--一條SQL語句,引入association標(biāo)簽-->
<resultMap id="studentResultMapAssociation" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<!--使用assocaition標(biāo)簽-->
<association property="clazz" javaType="Clazz">
<!--雖然字段是相同的,但是不能省略不寫-->
<id property="cid" column="cid"/>
<result property="cname" column="cname" />
</association>
</resultMap>
<select id="selectByIdAssociation" resultMap="studentResultMapAssociation">
select
s.sid,s.sname,c.cid,c.cname
from
t_student s
left join
t_clazz c
on s.cid = c.cid
where
s.sid = #{sid}
</select>
</mapper>三兄弟之三:StudentMappeTest類,用來編寫測試類
package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class StudentMapperTest {
@Test
public void testSelectByIdAssociation(){
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.selectByIdAssociation(2);
// 直接輸出Student對象
System.out.println(student);
sqlSession.close();
}
}執(zhí)行結(jié)果:

第三種?式:分步查詢
分布查詢,需要兩條SQL語句,這種?式常?:
①優(yōu)點(diǎn)?是可復(fù)?。
②優(yōu)點(diǎn)?是?持懶加載(延遲加載)
(1)分布查詢第一步:先根據(jù)學(xué)生的sid查詢學(xué)生信息
①在StudentMapper中編寫第一步的查詢方法
package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Student;
public interface StudentMapper {
// 分布查詢第一步:現(xiàn)根據(jù)學(xué)生的sid查詢學(xué)生信息
Student selectByIdStep1(Integer id);
}②在StudentMapper.xml中編寫SQL語句,并指明兩者之間的關(guān)聯(lián)關(guān)系
還是需要association標(biāo)簽:
①property屬性:還是提供要映射的POJO類的屬性名,這里就是clazz
②select屬性:用來指定另外第二步SQL語句的id,這個id實(shí)際上就是namespace+id;通過第二步語句的查詢結(jié)果,把值賦值給clazz
③column屬性:是把第一條SQL語句查詢出來的cid傳給第第二條SQL語句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.StudentMapper">
<!--這是第一步:根據(jù)學(xué)生的id查詢學(xué)生的所有信息,包含cid-->
<resultMap id="studentResultMapByStep" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname" />
<!--使用association標(biāo)簽,指明關(guān)聯(lián)關(guān)系-->
<association property="clazz"
select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2"
column="cid"/>
</resultMap>
<select id="selectByIdStep1" resultMap="studentResultMapByStep">
select sid,sname,cid from t_student where sid = #{sid};
</select>
</mapper>(2)分布查詢第二步:根據(jù)學(xué)生的cid查詢班級信息
①在ClazzMapper中編寫第二步的查詢方法
package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Clazz;
public interface ClazzMapper {
// 分布查詢第二步:根據(jù)cid獲取查詢信息
Clazz selectByIdStep2(Integer cid);
}②在ClazzMapper.xml中編寫SQL語句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.ClazzMapper">
<!--分布查詢第二步:根據(jù)cid獲取班級信息-->
<select id="selectByIdStep2" resultType="Clazz">
select cid,cname from t_clazz where cid = #{id};
</select>
</mapper>(3)最終StudentMapperTest編寫測試,因?yàn)镾tudent是主表
package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class StudentMapperTest {
@Test
public void testSelectByIdStep1(){
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.selectByIdStep1(3);
System.out.println(student);
sqlSession.close();
}
}執(zhí)行結(jié)果:

2. 多對?延遲加載
(1)延遲加載的核心是:用到的在查詢,暫時訪問不到的數(shù)據(jù)可以先不查詢。
(2)作用:提?程序的執(zhí)?效率;不用的時候也查性能肯定低,例如笛卡爾積現(xiàn)象
(3)在MyBatis中如何開啟延遲加載:asspciation標(biāo)簽當(dāng)中添加fetchType="lazy"
例1:不開啟延遲加載機(jī)制,假如只訪問學(xué)生表t_student的sname屬性,和t_clazz表實(shí)際上是沒有任何關(guān)系的
package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class StudentMapperTest {
@Test
public void testSelectByIdStep1(){
SqlSession sqlSession = SqlSessionUtil.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.selectByIdStep1(3);
// System.out.println(student);
// 只訪問sname屬性
System.out.println(student.getSname());
sqlSession.close();
}
}執(zhí)行結(jié)果:實(shí)際上執(zhí)行了兩個查詢語句,效率變低

例2:在asspciation標(biāo)簽中開啟延遲機(jī)制,就能做到只執(zhí)行第一條SQL語句,第二條不執(zhí)行;
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.StudentMapper">
<resultMap id="studentResultMapByStep" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname" />
<!--使用association標(biāo)簽,并開啟延遲加載機(jī)制-->
<association property="clazz"
select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2"
column="cid"
fetchType="lazy"/>
</resultMap>
<select id="selectByIdStep1" resultMap="studentResultMapByStep">
select sid,sname,cid from t_student where sid = #{sid};
</select>
</mapper>執(zhí)行結(jié)果:同樣還是只訪問學(xué)生表t_student的sname屬性,此時就是只查詢一張表即可

(4)在association標(biāo)簽中配置fetchType=“lazy”,實(shí)際上是局部的設(shè)置,只對當(dāng)前的association關(guān)聯(lián)的SQL語句起作用!
(5)那么怎樣在mybatis中如何開啟全局的延遲加載呢?需要setting配置,如下:

(6)在核心配置文件mybatis-config.xml文件當(dāng)中使用setting標(biāo)簽進(jìn)行配置
<!--啟?全局延遲加載機(jī)制-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>(7)開啟全局延遲加載之后,所有的SQL都會?持延遲加載,但是如果某個SQL你不希望它?持延遲加載怎么辦呢? 將fetchType設(shè)置為eager
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.StudentMapper">
<resultMap id="studentResultMapByStep" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname" />
<!--使用association標(biāo)簽,不開啟延遲加載機(jī)制-->
<association property="clazz"
select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2"
column="cid"
fetchType="eager"/>
</resultMap>
<select id="selectByIdStep1" resultMap="studentResultMapByStep">
select sid,sname,cid from t_student where sid = #{sid};
</select>
</mapper>3. ?對多
?對多的實(shí)現(xiàn),通常是在?的??中有List集合屬性!

pojo類Clazz中添加?個屬性:List<Student> stu; 表示班級關(guān)聯(lián)的學(xué)生對象,增加setter and getter方法,重寫toString方法。
package com.bjpowernode.mybatis.pojo;
import java.util.*;
public class Clazz {
private Integer cid;
private String cname;
private List<Student> stus;
public Clazz() {
}
public Clazz(Integer cid, String cname) {
this.cid = cid;
this.cname = cname;
}
@Override
public String toString() {
return "Clazz{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", stus=" + stus +
'}';
}
public List<Student> getStus() {
return stus;
}
public void setStus(List<Student> stus) {
this.stus = stus;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
?對多的實(shí)現(xiàn)通常包括兩種實(shí)現(xiàn)?式:
①第?種?式:collection
②第?種?式:分步查詢
第?種?式:collection
注:這次t_calss是主表,所以是在ClazzMapper、ClazzMapper.xml、ClazzMapperTest當(dāng)中完成一些列操作。
三兄弟之一:ClazzMapper接口,編寫方法
package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Clazz;
public interface ClazzMapper {
// 根據(jù)班級編號查詢班級信息
Clazz selectByIdCollection(Integer cid);
}三兄弟之二:ClazzMapper.xml文件,編寫sql語句
使用collection標(biāo)簽,和上面使用association標(biāo)簽的第二種方法是很相似的
①property屬性:提供要映射的POJO類的屬性名,這里就是stus
②ofType屬性:用來指定集合當(dāng)中的元素類型com.bjpowernode.mybatis.Student
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.ClazzMapper">
<resultMap id="clazzResultMap" type="Clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
<!--ofType用來指定集合當(dāng)中的元素類型-->
<collection property="stus" ofType="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</collection>
</resultMap>
<select id="selectByIdCollection" resultMap="clazzResultMap">
select
c.cid,c.cname,s.sid,s.sname
from
t_clazz c
left join
t_student s
on c.cid = s.cid
where c.cid = #{cid}
</select>
</mapper>三兄弟之三:ClazzMappeTest類,用來編寫測試類
package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.ClazzMapper;
import com.bjpowernode.mybatis.pojo.Clazz;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class ClazzMapperTest {
@Test
public void testSelectByIdCollection(){
SqlSession sqlSession = SqlSessionUtil.openSession();
ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
Clazz clazz = mapper.selectByIdCollection(1001);
System.out.println(clazz);
sqlSession.close();
}
}執(zhí)行結(jié)果:
查詢的結(jié)果是stus變量是一個有三個數(shù)據(jù)的List集合,其中clazz是null屬于正?,F(xiàn)象,如果clazz還有值,就會與前面的Student形成遞歸循環(huán)

第?種?式:分步查詢和延遲加載
(1)分布查詢第一步:先根據(jù)班級編號獲取班級信息
①在ClazzMapper中編寫第一步的查詢方法
package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Clazz;
public interface ClazzMapper {
// 分布查詢第一步:根據(jù)班級編號,獲取班級信息
Clazz selectByStep1(Integer cid);
}②在ClazzMapper.xml中編寫SQL語句,并指明兩者之間的關(guān)聯(lián)關(guān)系
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.ClazzMapper">
<!--分布查詢第一步:根據(jù)班級的cid獲取班級信息-->
<resultMap id="clazzResultMapStep" type="Clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
<collection property="stus"
select="com.bjpowernode.mybatis.mapper.StudentMapper.selectByCidStep2"
column="cid" />
</resultMap>
<select id="selectByStep1" resultMap="clazzResultMapStep">
select cid,cname from t_clazz where cid = #{cid}
</select>
</mapper>(2)分布查詢第二步:根據(jù)學(xué)生的cid查詢班級信息
①在StudentMapper中編寫第二步的查詢方法
package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Student;
import java.util.List;
public interface StudentMapper {
// 分布查詢第二步:根據(jù)班級編號查詢學(xué)生信息
List<Student> selectByCidStep2(Integer cid);
}②在StudentMapper.xml中編寫SQL語句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mybatis.mapper.StudentMapper">
<select id="selectByCidStep2" resultType="Student">
select * from t_student where cid = #{cid}
</select>
</mapper>(3)最終ClazzMapperTest編寫測試,因?yàn)镃lazz是主表
package com.bjpowernode.mybatis.test;
import com.bjpowernode.mybatis.mapper.ClazzMapper;
import com.bjpowernode.mybatis.pojo.Clazz;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class ClazzMapperTest {
@Test
public void testSelectByStep1(){
SqlSession sqlSession = SqlSessionUtil.openSession();
ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
Clazz clazz = mapper.selectByStep1(1001);
System.out.println(clazz);
sqlSession.close();
}
}執(zhí)行結(jié)果:

?對多延遲加載機(jī)制和多對?是?樣的,同樣是通過兩種?式:
第?種:fetchType="lazy"
第?種:修改全局的配置setting,lazyLoadingEnabled=true,如果開啟全局延遲加載,想讓某個 sql不使?延遲加載:fetchType="eager"
到此這篇關(guān)于MyBatis的?級映射及延遲加載的文章就介紹到這了,更多相關(guān)MyBatis延遲加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了Spring Boot實(shí)現(xiàn)圖片上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過程
日常開發(fā)過程中,我們經(jīng)常需要使用到郵件發(fā)送任務(wù),比方說驗(yàn)證碼的發(fā)送、日常信息的通知等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過程,需要的朋友可以參考下2022-10-10
SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法
本篇文章主要介紹了SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)
這篇文章主要介紹了SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Intellij IDEA導(dǎo)入eclipse web項目的操作步驟詳解
Eclipse當(dāng)中的web項目都會有這兩個文件,但是idea當(dāng)中應(yīng)該是沒有的,所以導(dǎo)入會出現(xiàn)兼容問題,但是本篇文章會教大家如何導(dǎo)入,并且導(dǎo)入過后還能使用tomcat運(yùn)行,需要的朋友可以參考下2023-08-08
springboot集成gzip和zip數(shù)據(jù)壓縮傳輸(適用大數(shù)據(jù)信息傳輸)
?在大數(shù)據(jù)量的傳輸中,壓縮數(shù)據(jù)后進(jìn)行傳輸可以一定程度的解決速度問題,本文主要介紹了springboot集成gzip和zip數(shù)據(jù)壓縮傳輸,具有一定的參考價值,感興趣的可以了解一下2023-09-09
SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼示例
ip2region v2.0 - 是一個離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,10微秒級別的查詢效率,提供了眾多主流編程語言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn),本文介紹了SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼工程,需要的朋友可以參考下2024-08-08

