武漢微信網(wǎng)站建設(shè)網(wǎng)站seo推廣員招聘
目錄
1、使用VO聚合對(duì)象(可以解決這兩種情況)
多對(duì)一:
一對(duì)多:
2、非聚合的多對(duì)一做法:
3、非聚合的一對(duì)多做法:
1、使用VO聚合對(duì)象(可以解決這兩種情況)
當(dāng)我需要多對(duì)一、一對(duì)多時(shí),可以創(chuàng)建VO聚合對(duì)象。
例如:學(xué)生類(lèi)和老師類(lèi),會(huì)出現(xiàn)多對(duì)一、一對(duì)多的情況。此時(shí)創(chuàng)建一個(gè)聚合類(lèi),里面包含所需要的學(xué)生類(lèi)和老師類(lèi)的屬性。并先查詢出前面的內(nèi)容,再根據(jù)前面的內(nèi)容查詢出后面的內(nèi)容。
多對(duì)一:
數(shù)據(jù)庫(kù)設(shè)計(jì),學(xué)生表中有一個(gè)tid來(lái)匹配老師id:
?
在學(xué)生類(lèi)和老師類(lèi)后,再創(chuàng)建出一個(gè)聚合類(lèi):
@Data
public class Student {private Integer id;private String username;private Integer tid;
}
@Data
public class Teacher {private Integer id;private String username;
}
@Data
public class StudentAndTeacher {private Integer id;private String username;private Teacher teacher;
}
寫(xiě)出查詢所有學(xué)生和根據(jù)學(xué)生類(lèi)里的tid查詢老師:?
@Mapper
public interface AllMapper {List<Student> AllStudent();Teacher AllTeacherByTid(Integer tid);
}
<select id="AllStudent" resultType="com.example.demo.entity.Student">select * from student;</select><select id="AllTeacherByTid" resultType="com.example.demo.entity.Teacher">select * from teacher where id=#{tid};</select>
通過(guò)聚合類(lèi),把這兩個(gè)查詢到的內(nèi)容聚合到一起:
@Testpublic void AllStudent() {List<Student> students = allMapper.AllStudent();for (Student student : students) {StudentAndTeacher studentAndTeacher = new StudentAndTeacher();studentAndTeacher.setId(student.getId());studentAndTeacher.setUsername(student.getUsername());studentAndTeacher.setTeacher(allMapper.AllTeacherByTid(student.getTid()));System.out.println(studentAndTeacher);}}
結(jié)果如下:
一對(duì)多:
學(xué)生類(lèi)和老師類(lèi)一樣,但是聚合類(lèi)不一樣,因?yàn)楝F(xiàn)在的主體是老師,而不是學(xué)生。
@Data
public class Student {private Integer id;private String username;private Integer tid;
}
@Data
public class Teacher {private Integer id;private String username;
}
@Data
public class TeacherAndStudent {private Integer id;private String username;private List<Student> studentList;
}
寫(xiě)出查詢所有老師和根據(jù)老師的id去學(xué)生表里查對(duì)應(yīng)tid的學(xué)生:?
@Mapper
public interface AllMapper {List<Teacher> AllTeacher();List<Student> AllStudentById(Integer id);
}
<select id="AllTeacher" resultType="com.example.demo.entity.Teacher">select * from teacher;</select><select id="AllStudentById" resultType="com.example.demo.entity.Student">select * from student where tid=#{id};</select>
通過(guò)聚合類(lèi),把這兩個(gè)查詢到的內(nèi)容聚合到一起:
@Testpublic void AllTeacher() {List<Teacher> Teachers = allMapper.AllTeacher();for (Teacher teacher : Teachers) {List<Student> students = allMapper.AllStudentById(teacher.getId());TeacherAndStudent studentAndTeacher = new TeacherAndStudent();studentAndTeacher.setId(teacher.getId());studentAndTeacher.setUsername(teacher.getUsername());studentAndTeacher.setStudentList(students);System.out.println(studentAndTeacher);}}
結(jié)果如下:
2、非聚合的多對(duì)一做法:
知識(shí)點(diǎn):association標(biāo)簽是用在多對(duì)一時(shí),當(dāng)一個(gè)類(lèi)中有其他類(lèi)作為該類(lèi)的屬性時(shí),要用到這個(gè)標(biāo)簽。
此時(shí)的Student類(lèi)中有一個(gè)屬性是Teacher類(lèi):
@Data
public class Student {private Integer id;private String username;private Teacher teacher;
}
@Data
public class Teacher {private Integer id;private String username;
}
@Mapper
public interface AllMapper {List<Student> AllStudent();
}
這里用resultMap來(lái)匹配。?
要注意兩點(diǎn):
1、result 標(biāo)簽里的property對(duì)應(yīng)的是java類(lèi)的屬性名,column對(duì)應(yīng)的是select 標(biāo)簽里查詢出來(lái)的字段名。并且要注意,若多個(gè)表的字段名相同,必須要用別名區(qū)分,并在column中寫(xiě)上別名而非字段名。
2、association 標(biāo)簽中,property對(duì)應(yīng)的是Student類(lèi)中的teacher屬性,類(lèi)型為Student類(lèi),這里的類(lèi)型用javaType而不是Type。
<select id="AllStudent" resultMap="StudentAndTeacher">select s.id sid, s.username susername, t.id tid, t.username tusernamefrom student s, teacher twhere s.tid = t.id;</select><resultMap id="StudentAndTeacher" type="com.example.demo.entity.Student"><result property="id" column="sid"></result><result property="username" column="susername"></result><association property="teacher" javaType="com.example.demo.entity.Teacher"><result property="id" column="tid"></result><result property="username" column="tusername"></result></association></resultMap>
@Testpublic void StudentAndTeacher() {List<Student> students = allMapper.AllStudent();for (Student student : students) {System.out.println(student);}}
結(jié)果如下:
3、非聚合的一對(duì)多做法:
知識(shí)點(diǎn):collection標(biāo)簽是用在一對(duì)多時(shí),當(dāng)一個(gè)類(lèi)中有其他類(lèi)集合作為該類(lèi)的屬性時(shí),要用到這個(gè)標(biāo)簽。
此時(shí)的Teacher類(lèi)中有一個(gè)屬性是List<Student>:
@Data
public class Student {private Integer id;private String username;private Integer tid;
}
@Data
public class Teacher {private Integer id;private String username;private List<Student> students;
}
@Mapper
public interface AllMapper {List<Teacher> AllTeacher();
}
這里用resultMap來(lái)匹配。?
要注意兩點(diǎn):
1、result 標(biāo)簽里的property對(duì)應(yīng)的是java類(lèi)的屬性名,column對(duì)應(yīng)的是select 標(biāo)簽里查詢出來(lái)的字段名。并且要注意,若多個(gè)表的字段名相同,必須要用別名區(qū)分,并在column中寫(xiě)上別名而非字段名。
2、collection標(biāo)簽中,property對(duì)應(yīng)的是Teacher類(lèi)中的students屬性,類(lèi)型為L(zhǎng)ist,這里的類(lèi)型用javaType而不是Type,ofType指的是List的泛型。
<select id="AllTeacher" resultMap="TeacherAndStudent">select s.id sid, s.username susername, s.tid stid, t.id tid, t.username tusernamefrom student s, teacher twhere s.tid = t.id;</select><resultMap id="TeacherAndStudent" type="com.example.demo.entity.Teacher"><result property="id" column="tid"></result><result property="username" column="tusername"></result><collection property="students" javaType="List" ofType="com.example.demo.entity.Student"><result property="id" column="sid"></result><result property="username" column="susername"></result><result property="tid" column="stid"></result></collection></resultMap>
@Testpublic void StudentAndTeacher() {List<Teacher> teachers = allMapper.AllTeacher();for (Teacher teacher : teachers) {System.out.println(teacher);}}
此時(shí)結(jié)果: