Mybatis(四)關聯映射
一. 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(四)關聯映射