=========================
MyBatis关联映射之多多关联
=========================
学生<->课程
1 数据表
1.1 学生
create table t_student(
id int primary key auto_increment,
number char(5) not null unique,
name varchar(20) not null,
gender char(2) not null,
age int not null
);
1.2 课程
create table t_course(
cid int primary key auto_increment,
cname varchar(50) not null unique
);
1.3 分数
create table t_score(
student int not null,
course int not null,
score int not null
);
2 实体类
2.1 学生
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
private int id;
private String number;
private String name;
private String gender;
private int age;
}
2.2 课程
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Course {
private int cid;
private String cname;
}
2.3 分数
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Score {
private int student;
private int course;
private int score;
}
3 DAO
3.1 学生
public interface StudentDao {
public int addStudent(Student student);
}
3.2 课程
public interface CourseDao {
public int addCourse(Course course);
}
3.3 分数
public interface ScoreDao {
public int addScore(Score score);
}
4 映射
...
...
...
...
4.1 学生
insert into t_student(number, name, gender, age)
values(#{number}, #{name}, #{gender}, #{age})
4.2 课程
insert into t_course(cname) values(#{cname})
4.3 分数
insert into t_score(student, course, score)
values(#{student}, #{course}, #{score})
5 测试
public class StudentDaoTest {
@Test
public void testAddStudent() {
StudentDao studentDao = MyBatisUtil.getMapper(StudentDao.class);
Student caocao = new Student(0, "2001", "曹操", "男", 50);
assertEquals(1, studentDao.addStudent(caocao));
Student liubei = new Student(0, "2002", "刘备", "男", 40);
assertEquals(1, studentDao.addStudent(liubei));
Student sunquan = new Student(0, "2003", "孙权", "男", 30);
assertEquals(1, studentDao.addStudent(sunquan));
CourseDao courseDao = MyBatisUtil.getMapper(CourseDao.class);
Course chinese = new Course(0, "语文");
assertEquals(1, courseDao.addCourse(chinese));
Course math = new Course(0, "数学");
assertEquals(1, courseDao.addCourse(math));
Course english = new Course(0, "英语");
assertEquals(1, courseDao.addCourse(english));
ScoreDao scoreDao = MyBatisUtil.getMapper(ScoreDao.class);
assertEquals(1, scoreDao.addScore(
new Score(caocao.getId(), chinese.getCid(), 50)));
assertEquals(1, scoreDao.addScore(
new Score(caocao.getId(), math.getCid(), 60)));
assertEquals(1, scoreDao.addScore(
new Score(liubei.getId(), math.getCid(), 70)));
assertEquals(1, scoreDao.addScore(
new Score(liubei.getId(), english.getCid(), 80)));
assertEquals(1, scoreDao.addScore(
new Score(sunquan.getId(), english.getCid(), 90)));
assertEquals(1, scoreDao.addScore(
new Score(sunquan.getId(), chinese.getCid(), 100)));
}
}
运行测试用例。
例程:Association
6 查询课程附带学生
6.1 连接查询
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class CourseStudents {
private Course course;
private List students;
}
public interface CourseDao {
...
public CourseStudents getCourseStudents(String cname);
...
}
...
...
...
...
public class CourseDaoTest {
...
@Test
public void testGetCourseStudents() {
CourseDao courseDao = MyBatisUtil.getMapper(CourseDao.class);
CourseStudents courseStudents = courseDao.getCourseStudents("语文");
assertNotEquals(null, courseStudents);
System.out.println(courseStudents);
}
...
}
运行测试用例。
例程:Association
6.2 子查询
public interface StudentDao {
...
public List getStudents(int course);
...
}
...
...
...
...
运行测试用例。
例程:Association
7 查询学生附带课程
7.1 连接查询
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class StudentCourses {
private Student student;
private List courses;
}
public interface StudentDao {
...
public StudentCourses getStudentCourses(String number);
...
}
...
...
...
...
public class StudentDaoTest {
...
@Test
public void testGetStudentCourses() {
StudentDao studentDao = MyBatisUtil.getMapper(StudentDao.class);
StudentCourses studentCourses = studentDao.getStudentCourses("2001");
assertNotEquals(null, studentCourses);
System.out.println(studentCourses);
}
...
}
运行测试用例。
例程:Association
7.2 子查询
public interface CourseDao {
...
public List getCourses(int student);
...
}
...
...
...
...
运行测试用例。
例程:Association