mybatis多表查詢:一對多
阿新 • • 發佈:2018-12-06
思想:設每個員工對應一個部門,而我將員工查詢出來要帶出相應的部門資訊
我的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);
}
}