1. 程式人生 > >mybatis多表查詢:一對多

mybatis多表查詢:一對多

思想:設每個員工對應一個部門,而我將員工查詢出來要帶出相應的部門資訊

我的emp表:

在這裡插入圖片描述

我的dept表:

在這裡插入圖片描述
設我有一個部門表的實體類:
Dept.java

public class Dept {
	private int deptNo;
	private String dname;
	private List<Emp> emp;
	
	public int getDeptNo() {
		return deptNo;
	}
	public void setDeptNo(int deptNo) {
		this.deptNo = deptNo;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public List<Emp> getEmp() {
		return emp;
	}
	public void setEmp(List<Emp> emp) {
		this.emp = emp;
	}
	@Override
	public String toString() {
		return "Dept [deptNo=" + deptNo + ", dname=" + dname + ", emp=" + emp + "]";
	}
	
}

部門對應的介面類:

public interface deptMapper {
	public Dept queryDept(int deptNo);
}

員工對應的介面類

public interface EmpMapper { 	
	
}

員工的實體類:
Emp.java

public class Emp {
	private int empno;
	private String ename;
	private String myJob;
	private Dept dept;
	
	public Dept getDept() {
		return dept;
	}
	public void setDept(Dept dept) {
		this.dept = dept;
	}
	public String getMyJob() {
		return myJob;
	}
	public void setMyJob(String myJob) {
		this.myJob = myJob;
	}
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", myJob=" + myJob + ", dept=" + dept + "]";
	}	
}

mybatis的confing.xml檔案:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	
	<!-- 打印出執行日誌 -->
	<settings>
		<setting name="logImpl" value="STDOUT_LOGGING" />
	</settings>
	<!-- 設定一段路徑的別名,可以在對映的xml檔案中使用 -->
	<typeAliases>
		<typeAlias type="com.pk.resultMap.Emp" alias="emps" />
	</typeAliases>
	
	<!-- 這裡是資原始檔路徑 -->
	<properties resource="jdbc.properties" />
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbcDriver}" />
				<property name="url" value="${jdbcUrl}" />
				<property name="username" value="${jdbcUsername}" />
				<property name="password" value="${jdbcPassword}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 路徑需要自己設 -->
	<mappers>
		<mapper resource="com/pk/resultMap/empMapping.xml" />
	</mappers>
</configuration>

部門表dept的對映檔案:deptMapper.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.pk.resultMap.deptMapper">
	
	<!-- autoMapping屬性設定是否啟動自動對映功能 -->
	<resultMap type="com.pk.resultMap.Dept" id="depts" autoMapping="true">
		<!-- 將主鍵的值對映到實體類中的欄位 -->
		<result column="deptNo" property="deptNo" />
		<!-- collection標籤:往這個標籤定義的 ‘類’ 的 list 屬性中設定值, 如何設定值? 還要根據其 select="selectAuthority"  , 把值查詢出來。 -->
		<!-- 
			property:實體類中的欄位
			javaType:返回的型別,list
			select:呼叫方法
			column:往方法裡面傳參
		 -->
		<collection property="emp" javaType="list"
			select="com.pk.resultMap.EmpMapper.queryByDeptNo" column="deptNo" />
	</resultMap>

	<!-- 一對多:當我查詢一個部門的時候帶出多個員工 -->
	<select id="queryDept" parameterType="int" resultMap="depts">
		select *
		from dept where deptNo = #{0}
	</select>
</mapper>

員工表emp的對映檔案:empMapping.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.pk.resultMap.EmpMapper">
	<!-- 一對多 -->
	<select id="queryByDeptNo" resultType="com.pk.resultMap.Emp">
		select e.* from emp e
		where e.deptNo = #{0}
	</select>
</mapper>

測試:

package com.pk.resultMap;

import java.io.InputStream;
import java.util.List;

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

/**
 * mybatis的終極思想:1.為了解決sql語句硬編碼的問題(約定大於配置) 2.解決面向物件設計問題(面向介面程式設計)
 * 每個物件對應一個xml檔案(對映檔案 MAPPING) 設:emp表 emp.xml dept表 dept.xml
 * 
 * @author 
 *
 *         2018年11月10日上午9:06:27
 */
public class TestMybatis {
	// 獲取SqlSession物件
	public static SqlSession getSession() {
		String resource = "config.xml";
		InputStream resourceAsStream = TestMybatis.class.getResourceAsStream(resource);
		// session工廠 負責產生會話
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
		// 會話就是打開了和資料庫的連結
		SqlSession openSession = sqlSessionFactory.openSession();
		return openSession;
	}
	@Test
	public void test4() {
//		一對一多 查詢部門帶出員工
		SqlSession session = getSession();
		deptMapper mapper = session.getMapper(deptMapper.class);
		Dept queryDept = mapper.queryDept(1);
		System.out.println(queryDept);
	}


}