7. MyBatis一對多查詢

    

一: 準備工作

    1. 建立數據

CREATE TABLE boss(
	b_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	b_name VARCHAR(255)
);
CREATE TABLE manager(
	m_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	m_name VARCHAR(255)
);
INSERT INTO boss(b_name) VALUES('Tom');
INSERT INTO manager(m_name) VALUES('Mgr1');
INSERT INTO manager(m_name) VALUES('Mgr2');
INSERT INTO manager(m_name) VALUES('Mgr3');

    

    2. 建立對應的實體類

package com.mybatis.entities;
public class Manager {

	private Integer id;
	private String name;
	// 提供對應的 getter/setter 方法
	// 提供 toString 方法
}
================================
package com.mybatis.entities;

import java.util.List;

public class Boss {

	private Integer id;
	private String name;
	private List<Manager> mgrs;
	// 提供相應的 getter/setter 方法
	// 提供 toString 方法
}


    3. 建立對應的sql映射文件

        這裏只查詢 Boss 然後接着把Boss下的所有管理者都查出來, 所以就只建立Boss的映射文件.


二: 測試

    1. 在 BossMapper.xml 寫 SQL語句, 以及對應的配置

<?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.BossMapper">
	
	<!-- 
		查詢方式有兩種, 分別是:
		1. 嵌套結果:使用嵌套結果映射來處理重複的聯合結果的子集封裝聯表查詢的數據(去除重複的數據)
		2. 嵌套查詢:通過執行另外一個SQL映射語句來返回預期的複雜類型
	 -->
	 
	 <!-- 測試 嵌套結果 -->
	 <!-- 由於返回值中有一個對象, 所以只用別名來映射不可用, 這裏就使用一個自定義一個返回值類型來映射 -->
	 <select id="getBoss1" parameterType="int" resultMap="getBoss1Map">
	 	SELECT * FROM boss b, manager m WHERE b.b_id=m.b_id AND b.b_id=#{b_id}
	 </select>
	 <!-- 
	 	id: 必須與上面的 resultMap="getStundet1Map" 對應起來
	 	type: 指定返回值類型, 可以理解爲 select標籤的resultType
	  -->
	 <resultMap type="Boss" id="getBoss1Map">
	 	<id column="b_id" property="id"/>
	 	<result column="b_name" property="name"/>
	 	<!-- ofType指定students集合中的對象類型 -->
	 	<collection property="mgrs" ofType="Manager">
	 		<id column="m_id" property="id"/>
	 		<result column="m_name" property="name"/>
	 	</collection>
	 </resultMap>
	 
	 <!-- 測試 嵌套查詢 -->
	 <!-- 由於返回值中有一個對象, 所以只用別名來映射不可用, 這裏就使用一個自定義一個返回值類型來映射 -->
	 <select id="getBoss2" parameterType="int" resultMap="getBoss2Map">
	 	SELECT b_id, b_name FROM boss WHERE b_id=#{b_id}
	 </select>
	 <!-- 這裏使用別名來映射實體類中的屬性 -->
	 <select id="getManager" parameterType="int" resultType="Teacher">
	 	SELECT m_id id, m_name name FROM manager WHERE b_id=#{b_id}
	 </select>
	 <resultMap type="Boss" id="getBoss2Map">
	 	<id column="b_id" property="id"/>
	 	<result column="b_name" property="name"/>
	 	<collection property="mgrs" column="b_id" ofType="Manager" select="getManager"></collection>
	 </resultMap>
	 
	
</mapper>


    2. 代碼測試

package com.mybatis.test;

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

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

public class TestBoss {

	@Test
	public void testGetBoss1(){
		
		SqlSession session = MyBatisUtil.getSqlSession();
		
		String statement = "com.mybatis.entities.BossMapper.getBoss1";
		Boss boss = session.selectOne(statement, 1);
		System.out.println(boss);
		
	}
	
	@Test
	public void testGetBoss2(){
		
		SqlSession session = MyBatisUtil.getSqlSession();
		
		String statement = "com.mybatis.entities.BossMapper.getBoss2";
		Boss boss = session.selectOne(statement, 1);
		System.out.println(boss);
		
	}
	
}


    完成測試!


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


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