日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Mybatis的一对一查询以及延迟加载

發布時間:2025/4/16 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis的一对一查询以及延迟加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一對一的關聯查詢:

  • 使用業務擴展類
  • 使用ResultMap
    • 表如下
    create table student(sid int(11) primary key not null, sname varchar(20), cardid int(11));create table studentcard(cardid int(11) primary key not null, cardinfo varchar(20));alter table student add constraint fk_student_studentcard_cardid foreign key(cardid) references studentcard(cardid);insert into studentcard values(1,'學生公交卡'); insert into studentcard values(2,'學生校園卡'); insert into studentcard values(3,'學生購物卡'); insert into student(sname,cardid) values('王富貴',1); insert into student(sname,cardid) values('王祈年',2); insert into student(sname,cardid) values('曾小賢',3);
    • StudentMapper.xml
    <select id="TestOneForOne" resultType="entity.StudentBusiness">SELECT s.*,c.* from student s inner join studentcard con s.cardid=c.cardidwhere s.sid=#{sid}</select>

    因為查詢到的信息是既包含student,又包含StudentCard。所以resultType需要一個同時包含這兩個字段的實體類。

    package entity;/*** @ClassName:StudentAndStudentCard* @Description:學生業務擴展類* @author:zgy19* @data:2020/1/14 15:04* @History:* @UpdateDate:* @author:* @UpdateContent:*/ public class StudentBusiness extends Student {private Integer cardid;private String cardinfo;@Overridepublic Integer getCardid() {return cardid;}@Overridepublic void setCardid(Integer cardid) {this.cardid = cardid;}public String getCardinfo() {return cardinfo;}public void setCardinfo(String cardinfo) {this.cardinfo = cardinfo;}@Overridepublic String toString() {return super.toString()+", cardid='" + cardid +", cardinfo='" + cardinfo + '\'';} }

    測試代碼:

    public static void main(String[] args) throws IOException {Reader reader= Resources.getResourceAsReader("config.xml");SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);SqlSession session=sqlSessionFactory.openSession();StudentMapper studentMapper=session.getMapper(StudentMapper.class);Student student=new Student();student.setSid(3);Student student1=studentMapper.selectStudentBySid(student);StudentBusiness studentBusiness=studentMapper.TestOneForOne(student);System.out.println(student1);System.out.println(studentBusiness);session.close();}

    測試結果:

    Student:sid=3, sname='曾小賢', cardid=3 Student:sid=3, sname='曾小賢',cardid='3, cardinfo='學生購物卡'

    上面為使用業務擴展類的方法,適用于表較小且簡單的查詢
    下面為使用使用ReultMap:

    既然不使用業務擴展類,又需要返回類型中包含查詢的所有字段,則需要把兩個實體類關聯起來。
    在數據庫中,兩張表之間的關聯使用外鍵,
    在實體類中,我們使用屬性使兩張表相關聯,如下Student.java所示
    Student.java

    //學生信息private Integer sid;private String sname;private Integer cardid;//學生證信息private StudentCard studentCard;

    StudentMapper.xml

    <select id="TestOneForOne2" resultMap="student_studentcard_map">SELECT s.*,c.* from student s inner join studentcard con s.cardid=c.cardidwhere s.sid=#{sid}</select><resultMap id="student_studentcard_map" type="student"><!--這里的id標簽中寫主鍵--><id property="sid" column="sid"></id><result property="sname" column="sname"></result><result property="cardid" column="cardid"></result><!--因為是一對一的關系,所以使用association標簽,如果是一對多,則使用collections標簽--><association property="studentCard" javaType="entity.StudentCard"><id property="cardid" column="cardid"></id><result property="cardinfo" column="cardinfo"></result></association></resultMap>

    測試結果如下(需要重寫Student中的toString):

    Student:sid=3, sname='曾小賢', cardid=3, cardinfo=學生購物卡

    使用延遲加載
    如果不采用延遲加載,在加載時,會將所有信息全部查詢出來,無論你是否需要。這種情況在數據量很大時,會大大增加查詢時間。降低效率。


    使用延遲加載,先查詢需要的數據,其他數據在需要時再加載。
    StudentMapper.xml

    <!--一對一使用ResultMap和延遲加載--><select id="TestOneForOneAndLazyLoad" resultMap="student_studentcard_lazyload_map">SELECT * from student where sid=#{sid}</select><resultMap id="student_studentcard_lazyload_map" type="student"><!--這里的id標簽中寫主鍵--><id property="sid" column="sid"></id><result property="sname" column="sname"></result><result property="cardid" column="cardid"></result><!--因為是一對一的關系,所以使用association標簽,如果是一對多,則使用collection標簽--><association property="studentCard" javaType="entity.StudentCard" select="querystudentcardByCardid" column="cardid"></association></resultMap><!--根據cardid來查詢證件信息--><select id="querystudentcardByCardid" parameterType="int" resultType="entity.StudentCard">select * from studentcard where cardid=#{cardid}</select>

    解釋:重點標簽

    <association property="studentCard" javaType="entity.StudentCard" select="querystudentcardByCardid" column="cardid"></association>

    這里的select中是需要延遲加載的語句,column是關聯外鍵
    此外還需要在config.xml中配置開啟懶加載
    config.xml

    <settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/><!--開啟日志,并指定使用日志的類型--><setting name="logImpl" value="LOG4J"></setting></settings>

    測試代碼:

    Student student2=studentMapper.TestOneForOneAndLazyLoad(student);System.out.println(student2.getSname()+","+student2.getCardid());System.out.println(student2.getStudentCard().getCardid()+","+student2.getStudentCard().getCardinfo());

    測試結果

    可以看出,先查詢了學生的信息,在執行第二個sout語句時,才執行查詢studentcard的select語句。

    總結

    以上是生活随笔為你收集整理的Mybatis的一对一查询以及延迟加载的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。