MyBatis的?級(jí)映射及延遲加載過(guò)程詳解
一:MyBatis的?級(jí)映射及延遲加載
前期準(zhǔn)備:
模塊名:mybatis-010-advanced-mapping
打包?式:jar
引?依賴:mysql驅(qū)動(dòng)依賴、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
編寫測(cè)試類:com.powernode.mybatis.test.StudentMapperTest和ClazzMapperTest
拷??具類:com.powernode.mybatis.utils.SqlSessionUtil
準(zhǔn)備數(shù)據(jù)庫(kù)表:?個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)?:
班級(jí)表: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í)體類:只定義兩個(gè)字段;對(duì)于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. 多對(duì)?
pojo類Student中添加?個(gè)屬性:Clazz clazz; 表示學(xué)?關(guān)聯(lián)的班級(jí)對(duì)象,增加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; } }
多對(duì)一:多個(gè)學(xué)生Student對(duì)應(yīng)一個(gè)班級(jí)Clazz
多種?式,常?的包括三種:
① 第?種?式:?條SQL語(yǔ)句,級(jí)聯(lián)屬性映射。
② 第?種?式:?條SQL語(yǔ)句,association。
③第三種?式:兩條SQL語(yǔ)句,分步查詢。
第?種?式:級(jí)聯(lián)屬性映射
三兄弟之一:StudentMapper接口,編寫方法
根據(jù)id獲取學(xué)生Student信息,同時(shí)獲取學(xué)生關(guān)聯(lián)的班級(jí)Clazz信息
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Student; public interface StudentMapper { /* * @param id 學(xué)生的id * @return 學(xué)生對(duì)象,但是學(xué)生對(duì)象當(dāng)中含有班級(jí)對(duì)象 */ Student selectById(Integer id); }
三兄弟之二:StudentMapper.xml文件,編寫sql語(yǔ)句
(1)使用resultMap來(lái)指定映射關(guān)系,結(jié)果映射resultMap有兩個(gè)參數(shù):
一個(gè)參數(shù)是id,指定resultMap的唯一標(biāo)識(shí),這個(gè)id將來(lái)在select標(biāo)簽中使用。
一個(gè)參數(shù)是type,用來(lái)指定POJO類的類名。
(2)在resultMap下還有一個(gè)子標(biāo)簽result;首先對(duì)于有主鍵的需要配一個(gè)id,不是必須的,但可以增加效率;下面使用result子標(biāo)簽的property屬性和column屬性分別指定POJO類的屬性名和數(shù)據(jù)庫(kù)表中的字段表之間的映射關(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"> <!--多對(duì)一映射的第一種方式:一條SQL語(yǔ)句,級(jí)聯(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"> <!--多對(duì)一映射的第一種方式:一條SQL語(yǔ)句,級(jí)聯(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類,用來(lái)編寫測(cè)試類
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對(duì)象 System.out.println(student); // 輸出每個(gè)屬性 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)簽
第二種方式,和第一種方式的代碼很類似,就是多引入一個(gè)association標(biāo)簽,association翻譯為關(guān)聯(lián)的意思
三兄弟之一:StudentMapper接口,編寫方法
根據(jù)id獲取學(xué)生Student信息,同時(shí)獲取學(xué)生關(guān)聯(lián)的班級(jí)Clazz信息
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Student; public interface StudentMapper { /** * 一條SQL語(yǔ)句,使用association標(biāo)簽的方式 * @param id 學(xué)生的id * @return 學(xué)生對(duì)象,但是學(xué)生對(duì)象當(dāng)中含有班級(jí)對(duì)象 */ Student selectByIdAssociation(Integer id); }
三兄弟之二:StudentMapper.xml文件,編寫sql語(yǔ)句
association:翻譯為關(guān)聯(lián),一個(gè)Student對(duì)象關(guān)聯(lián)一個(gè)Clazz對(duì)象
①property標(biāo)簽:提供要映射的POJO類的屬性名,這里就是clazz
②javaType標(biāo)簽:用來(lái)指定要映射的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語(yǔ)句,引入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類,用來(lái)編寫測(cè)試類
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對(duì)象 System.out.println(student); sqlSession.close(); } }
執(zhí)行結(jié)果:
第三種?式:分步查詢
分布查詢,需要兩條SQL語(yǔ)句,這種?式常?:
①優(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語(yǔ)句,并指明兩者之間的關(guān)聯(lián)關(guān)系
還是需要association標(biāo)簽:
①property屬性:還是提供要映射的POJO類的屬性名,這里就是clazz
②select屬性:用來(lái)指定另外第二步SQL語(yǔ)句的id,這個(gè)id實(shí)際上就是namespace+id;通過(guò)第二步語(yǔ)句的查詢結(jié)果,把值賦值給clazz
③column屬性:是把第一條SQL語(yǔ)句查詢出來(lái)的cid傳給第第二條SQL語(yǔ)句
<?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查詢班級(jí)信息
①在ClazzMapper中編寫第二步的查詢方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Clazz; public interface ClazzMapper { // 分布查詢第二步:根據(jù)cid獲取查詢信息 Clazz selectByIdStep2(Integer cid); }
②在ClazzMapper.xml中編寫SQL語(yǔ)句
<?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獲取班級(jí)信息--> <select id="selectByIdStep2" resultType="Clazz"> select cid,cname from t_clazz where cid = #{id}; </select> </mapper>
(3)最終StudentMapperTest編寫測(cè)試,因?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. 多對(duì)?延遲加載
(1)延遲加載的核心是:用到的在查詢,暫時(shí)訪問(wèn)不到的數(shù)據(jù)可以先不查詢。
(2)作用:提?程序的執(zhí)?效率;不用的時(shí)候也查性能肯定低,例如笛卡爾積現(xiàn)象
(3)在MyBatis中如何開(kāi)啟延遲加載:asspciation標(biāo)簽當(dāng)中添加fetchType="lazy"
例1:不開(kāi)啟延遲加載機(jī)制,假如只訪問(wèn)學(xué)生表t_student的sname屬性,和t_clazz表實(shí)際上是沒(méi)有任何關(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); // 只訪問(wèn)sname屬性 System.out.println(student.getSname()); sqlSession.close(); } }
執(zhí)行結(jié)果:實(shí)際上執(zhí)行了兩個(gè)查詢語(yǔ)句,效率變低
例2:在asspciation標(biāo)簽中開(kāi)啟延遲機(jī)制,就能做到只執(zhí)行第一條SQL語(yǔ)句,第二條不執(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)簽,并開(kāi)啟延遲加載機(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é)果:同樣還是只訪問(wèn)學(xué)生表t_student的sname屬性,此時(shí)就是只查詢一張表即可
(4)在association標(biāo)簽中配置fetchType=“lazy”,實(shí)際上是局部的設(shè)置,只對(duì)當(dāng)前的association關(guān)聯(lián)的SQL語(yǔ)句起作用!
(5)那么怎樣在mybatis中如何開(kāi)啟全局的延遲加載呢?需要setting配置,如下:
(6)在核心配置文件mybatis-config.xml文件當(dāng)中使用setting標(biāo)簽進(jìn)行配置
<!--啟?全局延遲加載機(jī)制--> <settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>
(7)開(kāi)啟全局延遲加載之后,所有的SQL都會(huì)?持延遲加載,但是如果某個(gè)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)簽,不開(kāi)啟延遲加載機(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. ?對(duì)多
?對(duì)多的實(shí)現(xiàn),通常是在?的??中有List集合屬性!
pojo類Clazz中添加?個(gè)屬性:List<Student> stu; 表示班級(jí)關(guān)聯(lián)的學(xué)生對(duì)象,增加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; } }
?對(duì)多的實(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ù)班級(jí)編號(hào)查詢班級(jí)信息 Clazz selectByIdCollection(Integer cid); }
三兄弟之二:ClazzMapper.xml文件,編寫sql語(yǔ)句
使用collection標(biāo)簽,和上面使用association標(biāo)簽的第二種方法是很相似的
①property屬性:提供要映射的POJO類的屬性名,這里就是stus
②ofType屬性:用來(lái)指定集合當(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用來(lái)指定集合當(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類,用來(lái)編寫測(cè)試類
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變量是一個(gè)有三個(gè)數(shù)據(jù)的List集合,其中clazz是null屬于正?,F(xiàn)象,如果clazz還有值,就會(huì)與前面的Student形成遞歸循環(huán)
第?種?式:分步查詢和延遲加載
(1)分布查詢第一步:先根據(jù)班級(jí)編號(hào)獲取班級(jí)信息
①在ClazzMapper中編寫第一步的查詢方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Clazz; public interface ClazzMapper { // 分布查詢第一步:根據(jù)班級(jí)編號(hào),獲取班級(jí)信息 Clazz selectByStep1(Integer cid); }
②在ClazzMapper.xml中編寫SQL語(yǔ)句,并指明兩者之間的關(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ù)班級(jí)的cid獲取班級(jí)信息--> <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查詢班級(jí)信息
①在StudentMapper中編寫第二步的查詢方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Student; import java.util.List; public interface StudentMapper { // 分布查詢第二步:根據(jù)班級(jí)編號(hào)查詢學(xué)生信息 List<Student> selectByCidStep2(Integer cid); }
②在StudentMapper.xml中編寫SQL語(yǔ)句
<?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編寫測(cè)試,因?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é)果:
?對(duì)多延遲加載機(jī)制和多對(duì)?是?樣的,同樣是通過(guò)兩種?式:
第?種:fetchType="lazy"
第?種:修改全局的配置setting,lazyLoadingEnabled=true,如果開(kāi)啟全局延遲加載,想讓某個(gè) sql不使?延遲加載:fetchType="eager"
到此這篇關(guān)于MyBatis的?級(jí)映射及延遲加載的文章就介紹到這了,更多相關(guān)MyBatis延遲加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)雙色球抽獎(jiǎng)算法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)雙色球抽獎(jiǎng)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05Spring Boot實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了Spring Boot實(shí)現(xiàn)圖片上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程
日常開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要使用到郵件發(fā)送任務(wù),比方說(shuō)驗(yàn)證碼的發(fā)送、日常信息的通知等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程,需要的朋友可以參考下2022-10-10SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法
本篇文章主要介紹了SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)
這篇文章主要介紹了SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringBoot中的配置文件加載優(yōu)先級(jí)詳解
這篇文章主要介紹了SpringBoot中的配置文件加載優(yōu)先級(jí)詳解,springboot啟動(dòng)會(huì)掃描以下位置的application.properties或者application.yml文件作為Spring?boot的默認(rèn)配置文件,需要的朋友可以參考下2024-01-01Intellij IDEA導(dǎo)入eclipse web項(xiàng)目的操作步驟詳解
Eclipse當(dāng)中的web項(xiàng)目都會(huì)有這兩個(gè)文件,但是idea當(dāng)中應(yīng)該是沒(méi)有的,所以導(dǎo)入會(huì)出現(xiàn)兼容問(wèn)題,但是本篇文章會(huì)教大家如何導(dǎo)入,并且導(dǎo)入過(guò)后還能使用tomcat運(yùn)行,需要的朋友可以參考下2023-08-08springboot集成gzip和zip數(shù)據(jù)壓縮傳輸(適用大數(shù)據(jù)信息傳輸)
?在大數(shù)據(jù)量的傳輸中,壓縮數(shù)據(jù)后進(jìn)行傳輸可以一定程度的解決速度問(wèn)題,本文主要介紹了springboot集成gzip和zip數(shù)據(jù)壓縮傳輸,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼示例
ip2region v2.0 - 是一個(gè)離線IP地址定位庫(kù)和IP定位數(shù)據(jù)管理框架,10微秒級(jí)別的查詢效率,提供了眾多主流編程語(yǔ)言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn),本文介紹了SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼工程,需要的朋友可以參考下2024-08-08