6.MyBatis實現一對一查詢

    

    現在有這麼一個需求:

        當查詢這個學生信息的時候, 接着把這個學生對應的老師的信息查詢出來.

    這就需要一對一進行查詢.


一: 準備工作

    1. 建立數據表  

CREATE TABLE teacher(
	t_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	t_name VARCHAR(255)
);
CREATE TABLE student(
	s_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	s_name VARCHAR(255),
	t_id INT(11),
	FOREIGN KEY(t_id) REFERENCES teacher(t_id)
)
INSERT INTO teacher(t_name) VALUES('Tom');
INSERT INTO student(s_name,t_id) VALUES('Stu1', 1);
INSERT INTO student(s_name,t_id) VALUES('Stu2', 1);
INSERT INTO student(s_name,t_id) VALUES('Stu3', 1);


    2. 建立對應的實體類

package com.mybatis.entities;

public class Teacher {
	
	private Integer id;
	private String name;
	// 寫好 getter/ setter方法
	// 寫好 toString 方法, 便於測試
	
}
====================================
package com.mybatis.entities;

public class Student {
	
	private Integer id;
	private String name;
	private Teacher teacher;
	// 寫好 getter/ setter方法
	// 寫好 toString 方法, 便於測試
	
}


    3. 定義對應的映射文件, 並在 conf.xml 文件中註冊

        由於我們只查詢學生的信息, 所以, 這裏指定義 Student類的映射文件 StudentMapper.xml. 如下:

wKioL1Zzsv6SHAdUAAC_r1ZRJ9I305.png


二: 測試

    1. 在 StudentMapper.xml 中寫入對應的查詢語句, 接着進行一些配置.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.mybatis.entities.StudentMapper">
	
	<!-- 
		查詢方式有兩種, 分別是:
		1. 嵌套結果:使用嵌套結果映射來處理重複的聯合結果的子集封裝聯表查詢的數據(去除重複的數據)
		2. 嵌套查詢:通過執行另外一個SQL映射語句來返回預期的複雜類型
	 -->
	 
	 <!-- 測試 嵌套結果 -->
	 <!-- 由於返回值中有一個對象, 所以只用別名來映射不可用, 這裏就使用一個自定義一個返回值類型來映射 -->
	 <select id="getStudent1" parameterType="int" resultMap="getStundet1Map">
	 	SELECT t.t_id, t.t_name, s.s_id, s.s_name, s.t_id 
	 	FROM teacher t, student s 
	 	WHERE t.`t_id`=s.`t_id` AND s.`s_id`=#{id}
	 </select>
	 <resultMap type="Student" id="getStundet1Map">
	         <!-- id: 這個表對應的主鍵 -->
	 	<id column="s_id" property="id"/>
	 	<!-- result: 一個一般的字段 -->
	 	<result column="s_name" property="name"/>
	 	<!-- 利用這個標籤, 來映射一個對象, 其中jdbcTyp是返回值類型 -->
	 	<association property="teacher" javaType="Teacher">
	 		<id column="t_id" property="id"/>
	 		<result column="t_name" property="name"/>
	 	</association>
	 </resultMap>
	 
	 <!-- 測試 嵌套查詢 -->
	 <!-- 由於返回值中有一個對象, 所以只用別名來映射不可用, 這裏就使用一個自定義一個返回值類型來映射 -->
	 <select id="getStudent2" parameterType="int" resultMap="getStudent2Map">
	 	SELECT s_id, s_name, t_id FROM student WHERE s_id=#{s_id}
	 </select>
	 <!-- 這裏使用別名來映射實體類中的屬性 -->
	 <select id="getTeacher" parameterType="int" resultType="Teacher">
	 	SELECT t_id id, t_name name FROM teacher WHERE t_id=#{t_id}
	 </select>
	 <resultMap type="Student" id="getStudent2Map">
	 	<id column="s_id" property="id"/>
	 	<result column="s_name" property="name"/>
	 	<!-- 
	 	    select: 執行 select id爲 getTeacher 中的 sql.
	 	    column: 因爲 select id爲 getTeacher 中的 sql 語句需要一個t_id
	 	            所以這裏傳給它一個 t_id
	 	 -->
	 	<association property="teacher" column="t_id" select="getTeacher">
	 	</association>
	 </resultMap>
	 
</mapper>


    2. 測試代碼

package com.mybatis.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.mybatis.entities.Student;
import com.mybatis.util.MyBatisUtil;

public class TestStudent {

	@Test
	public void testGetStudent1() {
		
		SqlSession session = MyBatisUtil.getSqlSession();
		
		String statement = "com.mybatis.entities.StudentMapper.getStudent1";
		Student student = session.selectOne(statement, 1);
		System.out.println(student);
		
	}
	
	@Test
	public void testGetStudent2() {
		
		SqlSession session = MyBatisUtil.getSqlSession();
		
		String statement = "com.mybatis.entities.StudentMapper.getStudent2";
		Student student = session.selectOne(statement, 2);
		System.out.println(student);
		
	}

}
// 執行結果
//Student [id=2, name=Stu2, teacher=Teacher [id=1, name=Tom]]


本篇博文的源代碼點擊 http://pan.baidu.com/s/1o7oLSj4 下載.



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