1. 程式人生 > >Mybatis(四)關聯映射

Mybatis(四)關聯映射

默認 enter 指向 傳遞 gen log clas ner mapper

一. Mybatis關聯映射

1 講數據庫中關聯關系,主鍵表與外鍵表

一對多,多對一,主鍵表表示 與外鍵表表示

學生與學校的關系,工人與工廠,人員與部門的關系,。。。。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

2 多表查詢

多表查詢 方法一

select a.*,b.* from student a,school b where a.t_sid=b.t_id

select a.*,b.t_name from student a,school b where a.t_sid=b.t_id

select a.*,b.t_name from student a,school b where a.t_sid=b.t_id and b.t_id=1

多表查詢 方法二

select student.*,school.* from student inner join school on student.t_sid=school.t_id

select student.*,school.t_name from student inner join school on student.t_sid=school.t_id

select student.*,school.t_name from student inner join school on student.t_sid=school.t_id and school.t_id=1

3 mybatis多對一

要查詢多個表中信息:有三種方法:

方法一:

<resultMap type="com.softjx.model.Student" id="StudentMap1">
  <result column="t_id" property="id"/>
  <result column="t_name" property="studentName" />
  <result column="t_age" property="age"/>
  <result column="t_enterdate" property
="enterDate"/> <result column="t_sid" property="sid"/> <!—關聯字段--> <result column="t_id1" property="school.id"/> <result column="t_name1" property="school.schoolName"/> </resultMap> <!-- 根據id查詢數據表中的一條記錄 --> <select id="getStudentId1" resultMap="StudentMap1"> select a.t_id,a.t_name,a.t_age,a.t_enterdate,a.t_sid,b.t_id as t_id1,b.t_name as t_name1 from student a,school b where a.t_sid=b.t_id and a.t_id=#{id}; </select>

方法二:使用association定義關聯的單個對象

  <resultMap type="com.softjx.model.Student" id="StudentMap2">
  <result column="t_id" property="id"/>
  <result column="t_name" property="studentName" />
  <result column="t_age" property="age"/>
  <result column="t_enterdate" property="enterDate"/>
  <result column="t_sid" property="sid"/>
    <!--  association可以指定聯合的javaBean對象
        property="school":指定哪個屬性是聯合的對象
        javaType:指定這個屬性對象的類型[不能省略]
        -->
  <association property="school" javaType="com.softjx.model.School">
            <id column="t_id" property="id"/>
            <result column="t_name" property="schoolName"/>
  </association>
  </resultMap>
  

<!-- 根據id查詢數據表中的一條記錄 -->
<select id="getStudentId2"  resultMap="StudentMap2">
 select a.t_id,a.t_name,a.t_age,a.t_enterdate,a.t_sid,b.t_id as t_id1,b.t_name as t_name1 from student a,school b  where a.t_sid=b.t_id and a.t_id=#{id};
</select>

方法三:使用association進行分步查詢

1)、先按照t_id查詢學生信息

2)、根據查詢學生信息中的t_sid值去學校表查出學校的信息

3)、學校信息設置到學生中;

1、先按照t_id查詢學生信息
2、根據查詢學生信息中的t_sid值去學校表查出學校的信息
    3、學校信息設置到學生中;

<resultMap type="com.softjx.model.Student" id="StudentMap3">
  <result column="t_id" property="id"/>
  <result column="t_name" property="studentName" />
  <result column="t_age" property="age"/>
  <result column="t_enterdate" property="enterDate"/>
  <result column="t_sid" property="sid"/>
<!-- association定義關聯對象的封裝
    select:表明當前屬性再去調用哪個方法查出的結果
    column:指定根據當前表中哪一列的值傳給這個方法             
     流程:使用select指定的方法查出對象,並封裝給property指定的屬性
-->
  <association property="school" 
             select="com.softjx.dao.SchoolMapper.getSchoolId"
             column="t_sid">
 </association>
 
  </resultMap>

使用association進行分步查詢,可以是立即加載,延遲加載;

可以使用延遲加載(懶加載);(按需加載)

Student==>School

我們每次查詢Student對象的時候,都將一起查詢出來,(立即加載)

學校信息在我們使用的時候再去查詢(延遲加載)

分段查詢的基礎之上(懶加載)加上兩個配置在全局配置文件中config.xml

<settings>

<setting name="lazyLoadingEnabled" value="true"/>

<setting name="aggressiveLazyLoading" value="false"/>

</settings>

4 mybatis一對多

方法一:使用collection標簽

1)在學校中有一個集合類型,指向多個學生

private List<Student> students;
    
    
    public List<Student> getStudents() {
        return students;
    }
    public void setStudents(List<Student> students) {
        this.students = students;
    }

2)SchoolMapper.xml文件中配置collection標簽,標簽中ofType:指定集合裏面元素的類型,property:指定bean的屬性名。

<resultMap type="com.softjx.model.School" id="SchoolMap1">
         <result column="t_id" property="id"/>
         <result column="t_name" property="schoolName" />
        <!-- 
            collection定義關聯集合類型的屬性 
            ofType:指定集合裏面元素的類型
        -->
        <collection property="students" ofType="com.softjx.model.Student">
            <!-- 定義這個集合中元素的封裝規則 -->
             <result column="t_id1" property="id"/>
             <result column="t_name1" property="studentName" />
             <result column="t_age" property="age"/>
             <result column="t_enterdate" property="enterDate"/>
             <result column="t_sid" property="sid"/>
        </collection>
    </resultMap>



<select id="getSchoolId1" resultMap="SchoolMap1">
select b.t_id as t_id,b.t_name as t_name ,a.t_id as t_id1 ,a.t_name as t_name1,a.t_age,a.t_enterdate, a.t_sid from school b, student a where b.t_id=a.t_sid and b.t_id=#{id}
</select>

方法二:使用collection分段:

1)首先要根據學校編號在學生表中查詢所有學生:

<!-- 根據學生的學校id查詢所有的學生 -->


public List<Student> getStudentsBySchoolId(Integer sid);


<select id="getStudentsBySchoolId" resultMap="StudentMap">
 select * from student where t_sid=#{sid};
</select>

註意:這個sid是collection標簽中要訪問的。

2)Collection分段代碼:

<!-- sid是方法的參數名,t_id是字段名 -->
    <resultMap type="com.softjx.model.School" id="SchoolMap2">
        <result column="t_id" property="id"/>
        <result column="t_name" property="schoolName" />
        <collection property="students" 
            select="com.softjx.dao.StudentMapper.getStudentsBySchoolId"
            column="{sid=t_id}" fetchType="lazy">
        </collection>
    </resultMap>
    
    
<select id="getSchoolId2" resultMap="SchoolMap2">
        select * from school where t_id=#{id}
    </select>

註意:

1)fetchType="lazy":表示使用延遲加載,默認是延遲;它的取值是 lazy:延遲加載,eager:立即加載。

2)多列的值傳遞:

column="{key1=column1,key2=column2}"key1是方法的參數名,column1是字段名, key2是方法的參數名,column2是字段名。

5 mybatis一對多,多對一(使用註解)

1)mybatis全局配置文件要應用接口類:

       <mappers>
          <mapper class="com.softjx.dao.SchoolMapper"/>
          <mapper class="com.softjx.dao.StudentMapper"/>
       </mappers>

2)沒有mapper.xml文件,只有接口文件:

多對一關系:

//根據id查詢學生,包括學生的學校
//property="school",column="t_sid" column是當前表中關聯字段名t_sid
//查詢一個用戶
    @Select("select * from student where t_id=#{id}")
    @Results({@Result(property="id",column="t_id")
             ,@Result(property="studentName",column="t_name")
             ,@Result(property="age",column="t_age")
             ,@Result(property="enterDate",column="t_enterdate")
             ,@Result(property="sid",column="t_sid")
             ,@Result(property="school",column="t_sid",one=@One(select="com.softjx.dao.SchoolMapper.getSchoolId",fetchType=FetchType.EAGER))
     
            })
    public Student getStudentId1(Integer id);

一對多的關系:

1.先要在多這一方查詢數據。

//根據學生的學校id查詢所有的學生
    @Select("select * from student where t_sid=#{sid}")
    @Results({@Result(property="id",column="t_id")
             ,@Result(property="studentName",column="t_name")
             ,@Result(property="age",column="t_age")
             ,@Result(property="enterDate",column="t_enterdate")
             ,@Result(property="sid",column="t_sid")
            })
    public List<Student> getStudentsBySchoolId(Integer sid);

2.
//根據id查詢學校
    //property="students",column="t_id" column是當前表中的主鍵字段名t_id
    @Select("select * from school where t_id=#{id}")
    @Results({@Result(property="id",column="t_id")
             ,@Result(property="schoolName",column="t_name")
             ,@Result(property="students",column="t_id",many=@Many(select="com.softjx.dao.StudentMapper.getStudentsBySchoolId",fetchType=FetchType.LAZY))
            })
    public School getSchoolId1(Integer id);

Mybatis(四)關聯映射