Mybatis 雜記(三)
阿新 • • 發佈:2018-11-11
Mybatis雜記:
當資料庫涉及到多對多時mybatis的處理辦法:
- 例如在bean包中定義一下兩個類(Stu類和Course類),學生和課程之間是一對一的關係,一個學生可能對應多個課程,一個課程也可能對應多個學生。
此時你需要做的就是在兩邊都定義集合,list 和 set都可以!
public class Stu { private int id; private String name; private Set<Course> courses; //Getter and Setter //toString //Constuctor } public class Course { private long id; private String name; private Set<Stu> stus; //Getter and Setter //toString //Constuctor }
有了實體類以後做一些 demo:
1.儲存一個學生資訊:
在mapper介面中定義:void saveStu(Stu stu);
Mapper.xml檔案中:
由於在資料庫(oracle)定義一個序列在維護主鍵,故這樣寫:
<insert id="saveStu" parameterType="stu"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select sc_seq.nextval from dual </selectKey> insert into s_stu values(#{id},#{name}) </insert>
2.根據課程去查詢所有選課的學生:
在mapper介面中定義:Course findCourseAndStu(long id);
Mapper.xml檔案中:
<select id="findCourseAndStu" parameterType="long" resultMap="course2_model">
select id,name
from S_COURSE
where ID = #{id}
</select>
由於Course類中的private Set<Stu> stus;
不能從資料中直接查詢到,所以這裡用到resultMap
<resultMap id="course2_model" type="course">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="stus" column="id" select="findStuByIds"></collection>
</resultMap>
用到collection
來維護多對多的這層關係,property
屬性值得是你在Course類中定義的那個集合的名字,column
和select
表示從哪裡去查詢,這裡再寫一個select如下:
<select id="findStuByIds" parameterType="int" resultType="stu">
select s.id,s.NAME
from S_STU s,STU_COU sc
where s.ID = sc.STU_ID and sc.COU_ID = #{id}
</select>
這就表示根據id號去查詢對應的stu的各個屬性,通過collection
最後裝配成一個stu物件。
3.同樣你也可以通過學生去查詢所有的選課,與2中的程式碼類似,多對多比起一對多的關係就是由單向轉為雙向!