Mybatis如何關聯查詢

創建Teacher和Student表:

Teacher



Student



創建Teacher和Student類:

Teacher

public class Teacher {
	private Integer id;
	private String name;
	private List<Student> students;

	public Teacher() {
		super();
	}

	public Teacher(Integer id, String name, List<Student> students) {
		super();
		this.id = id;
		this.name = name;
		this.students = students;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<Student> getStudents() {
		return students;
	}

	public void setStudents(List<Student> students) {
		this.students = students;
	}
}
Student

public class Student {
	private Integer id;
	private String name;
	private Integer teacherId;
	private Teacher teacher;

	public Student() {
		super();
	}

	public Student(Integer id, String name, Integer teacherId, Teacher teacher) {
		super();
		this.id = id;
		this.name = name;
		this.teacherId = teacherId;
		this.teacher = teacher;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getTeacherId() {
		return teacherId;
	}

	public void setTeacherId(Integer teacherId) {
		this.teacherId = teacherId;
	}

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
}

我們在Teacher中定義了List<Student>,在Student中定義了Teacher,在關係映射時我們會用到這兩個屬性

首先是以Map類型返回數據:

	<select id="findTeacherMap" resultType="java.util.Map">
		SELECT
			t.id,
			t. NAME,
			s.id AS sid,
			s. NAME AS sname
		FROM
			teacher t
		LEFT JOIN student s ON t.id = s.teacher_id
	</select>

測試方法:

	@Test
	public void findTeacherMap() {
		try {
			SqlSession session = sessionFactory.openSession();
			List<Map<String, Object>> teachers = session.selectList("mybatis.model.TeacherMapper.findTeacherMap");
			for (Map<String, Object> map : teachers) {
				for (Entry<String, Object> teacher : map.entrySet()) {
					System.out.print(teacher.getKey() + ":" + teacher.getValue() + ",");
				}
				System.out.println();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
這種方法沒什麼好說的就是兩表聯查把結果集放到Map中,下面是運行結果

sname:小名,id:1,NAME:keke,sid:1,
sname:大明,id:1,NAME:keke,sid:2,
sname:微微,id:1,NAME:keke,sid:3,
sname:小華,id:2,NAME:array,sid:4,
sname:張三,id:2,NAME:array,sid:5,
sname:李四,id:2,NAME:array,sid:6,


當一對多的關係映射時我們有兩種方法來應對:

第一種:我們在mapper.xml中定義resultMap

	<resultMap type="Teacher" id="teacherMap1">
		<id column="id" property="id" />
		<result column="name" property="name" />
		<collection property="students" ofType="Student" fetchType="lazy">
			<id column="sid" property="id" />
			<result column="sname" property="name" />
		</collection>
	</resultMap>

	<select id="findTeacherResultMap1" resultMap="teacherMap1">
		SELECT
			t.id,
			t. NAME,
			s.id AS sid,
			s. NAME AS sname
		FROM
			teacher t
		LEFT JOIN student s ON t.id = s.teacher_id
	</select>
resultMap跟bean的屬性結構差不多.type是實際的java類型這裏我用到了別名所以直接寫的Teacher,id是標識引用這個resultMap時會用到,column是select標籤中的列名不可重複(重複用別名),property是bean中屬性名稱,bean中的students是集合我們用collection,這裏的ofType是集合的類型,延遲加載tetchType="lazy",雖然這裏啓用了延遲加載但實際開發中不建議用這種方法,因爲如果數據量大的話會非常耗性能.

測試方法:

	@Test
	public void findTeacherResultMap1() {
		try {
			SqlSession session = sessionFactory.openSession();
			List<Teacher> teachers = session.selectList("mybatis.model.TeacherMapper.findTeacherResultMap1");
			for (Teacher teacher : teachers) {
				System.out.println("id:" + teacher.getId() + ",name:" + teacher.getName());
				for (Student stuent : teacher.getStudents()) {
					System.out.println("sid:" + stuent.getId() + ",sname:" + stuent.getName());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

運行結果:

id:1,name:keke
sid:1,sname:小名
sid:2,sname:大明
sid:3,sname:微微
id:2,name:array
sid:4,sname:小華
sid:5,sname:張三
sid:6,sname:李四

第二種:我們還是mapper.xml中定義resultMap

	<resultMap type="Teacher" id="teacherMap2">
		<id column="id" property="id" />
		<result column="name" property="name" />
		<collection column="id" property="students" select="findStudentsResultMap2"/>
	</resultMap>
<span style="white-space:pre">	</span><select id="findTeacherResultMap2" resultMap="teacherMap2">
		SELECT
			id,
			NAME
		FROM
			teacher
	</select>
	<select id="findStudentsResultMap2" resultType="Student">
		SELECT
			id,
			NAME
		FROM
			student
		WHERE
			teacher_id = #{id}
		LIMIT 0,2
	</select>

這種方式我們把students集合的部分單獨查詢並限制條數,collection中的column是查詢是要傳入的參數,select是要執行那個select語句,這種方式比第一種方式性能方面會好很多也靈活很多.

測試方法:

	@Test
	public void findTeacherResultMap2() {
		try {
			SqlSession session = sessionFactory.openSession();
			List<Teacher> teachers = session.selectList("mybatis.model.TeacherMapper.findTeacherResultMap2");
			for (Teacher teacher : teachers) {
				System.out.println("id:" + teacher.getId() + ",name:" + teacher.getName());
				for (Student stuent : teacher.getStudents()) {
					System.out.println("sid:" + stuent.getId() + ",sname:" + stuent.getName());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
運行結果:

id:1,name:keke
sid:1,sname:小名
sid:2,sname:大明
id:2,name:array
sid:4,sname:小華
sid:5,sname:張三
多對一的關係映射:

首先是resultMap

	<resultMap type="Student" id="StudentMap">
		<id column="id" property="id" />
		<result column="name" property="name" />
		<association property="teacher" javaType="Teacher">
			<id column="tid" property="id" />
			<result column="tname" property="name" />
		</association>
	</resultMap>
	<select id="findStudents" resultMap="StudentMap">
		SELECT
			s.id,
			s. NAME,
			t.id AS tid,
			t. NAME AS tname
		FROM
			student s
		RIGHT JOIN teacher t ON s.teacher_id = t.id;
	</select>
測試方法:

	@Test
	public void findStudents() {
		try {
			SqlSession session = sessionFactory.openSession();
			List<Student> students = session.selectList("mybatis.model.TeacherMapper.findStudents");
			for (Student student : students) {
				System.out.println("id:" + student.getId() + ",name:" + student.getName());
				System.out.println("老師:"+student.getTeacher().getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
運行結果:

id:1,name:小名
老師:keke
id:2,name:大明
老師:keke
id:3,name:微微
老師:keke
id:4,name:小華
老師:array
id:5,name:張三
老師:array
id:6,name:李四
老師:array






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章