您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Mybatis一對多和多對一處理的區別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
SQL:
create table teacher( id int not null, name varchar(30) default null, primary key (id) ); insert into teacher (id, name) values (1, '蔡老師'); create table student( id int not null , name varchar(30) default null, tid int default null, constraint fk_tid foreign key (tid) references teacher(id) ); insert into student(id, name, tid) VALUES (1, '小名', 1); insert into student(id, name, tid) VALUES (2, '小紅', 1); insert into student(id, name, tid) VALUES (3, '小亮', 1); insert into student(id, name, tid) VALUES (4, '小蘭', 1); insert into student(id, name, tid) VALUES (5, '笑笑', 1);
多個學生對應一個老師
對于學生這邊而言,關聯。即多個學生關聯一個老師【多對一】
對于老師這邊而言,集合。即一個老師有很多的學生【一對多】
//查詢所有的學生信息以及對應的老師的信息 List<Student> queryStudentAndTeacher();
@Data @AllArgsConstructor @NoArgsConstructor public class Student { private int id; private String name; //學生需要關聯一個老師 private Teacher teacher; }
@Data @AllArgsConstructor @NoArgsConstructor public class Teacher { private int id; private String name; }
<!--思路: 1.查詢所有的學生 2.根據查詢出來的學生的tid尋找對應的老師 尋找對應的老師,子查詢 --> <resultMap id="rStuAndTea" type="student"> <result property="id" column="id"/> <result property="name" column="name"/> <!-- 復雜的屬性我們需要單獨處理 指定屬性的類型 對象使用association javaType 集合使用collection ofType --> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="queryStudentAndTeacher" resultMap="rStuAndTea"> select * from student </select> <select id="getTeacher" resultType="teacher"> select * from teacher where id = #{id} </select>
<!--方式二 按照結果嵌套處理--> <resultMap id="rStuAndTea2" type="student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association> </resultMap> <select id="queryStudentAndTeacher2" resultMap="rStuAndTea2"> select s.id sid, s.name sname, t.name tname from student s, teacher t where s.tid = t.id </select>
子查詢
聯表查詢
一個老師有多個學生
對于老師這邊而言,集合。即一個老師有很多的學生【一對多】
//查詢指定老師的信息及其所有的學生 Teacher queryTeaAndStu(@Param("tid") int id);
@Data @AllArgsConstructor @NoArgsConstructor public class Teacher { private int id; private String name; //一個老師擁有多個學生 private List<Student> students; }
@Data @AllArgsConstructor @NoArgsConstructor public class Student { private int id; private String name; private int tid; }
<!--按照結果嵌套查詢--> <resultMap id="rTeaAndStu" type="teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <collection property="students" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap> <select id="queryTeaAndStu" resultMap="rTeaAndStu"> select s.id sid, s.name sname, t.name tname, t.id tid from student s, teacher t where s.tid = t.id and t.id = #{tid} </select>
<!--按照查詢嵌套處理--> <select id="queryTeaAndStu2" resultMap="rTeaAndStu2"> select * from teacher where id = #{tid} </select> <resultMap id="rTeaAndStu2" type="teacher"> <collection property="students" javaType="ArrayList" ofType="Student" select="queryStudentByTeacherId" column="id"/> </resultMap> <select id="queryStudentByTeacherId" resultType="Student"> select * from student where tid = #{tid} </select>
小結
關聯 - association 【多對一】
集合 - collection 【一對多】
javaType & ofType
javaType 用來指定實體類中屬性的類型
ofType 用來指定映射到List或者集合中的entity類型,泛型中的約束類型
注意點:
保證SQL的可讀性,盡量保證通俗易懂
注意一對多和多對一中屬性名和字段的問題
如果問題不好排查錯誤,可以使用LOG4J日志
看完上述內容,你們對Mybatis一對多和多對一處理的區別是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。