mybatis一對一嵌套查詢


要求:查詢一個員工的時候,把他對應的部門也查詢出來

實現(其他配置這里不作說明,框架基於spring_springMVC_mybatis_oracle):

如有不對或不適的地方,請多多指教。

1、新建Emp實體類(get 和set方法省略)

package app.cmsg.entity;

import java.sql.Date;

public class Emp {
private Integer f_empno;
private String f_ename;
private String f_ejob;
private Integer f_emgr;
private Date f_hiredate;
private Double f_sal;
private Double f_comm;
private Integer f_deptno;

...

省略get和set方法

}

/**
* 關聯屬性,封裝dept員工對應的部門信息
* @return
*/
private Dept dept;

2 、新建關聯屬性對應的部門實體類

package app.cmsg.entity;

public class Dept {
private Integer f_deptno;
private String f_dname;
private String f_loc;

...

省略get和set方法

}

3 EmpDao中添加根據員工ID查詢員工的方法

package app.cmsg.dao;

import java.util.List;

import app.cmsg.annotation.MyBatisRepostory;
import app.cmsg.entity.Condition;
import app.cmsg.entity.Emp;

/**
* @author 
* 員工表的Dao組件
*/
@MyBatisRepostory //<!--mybatis注解 app.cmsg.annotation.MyBatisRepostory需要自定義-->applicationContext.xml中配置的
public interface EmpDao {
Emp findById(int f_empno);
}

4 配置mapper.xml文件

<select id="findById" parameterType="java.lang.Integer" resultMap="empMap">
  select * from t_emp t where t.f_empno = #{id}
</select>
<resultMap type="app.cmsg.entity.Emp" id="empMap">
  <association property="dept" column="f_deptno"  javaType="app.cmsg.entity.Dept" select="findByDeptApp">
</association>
</resultMap>
<select id="findByDeptApp" parameterType="java.lang.Integer"  resultType="app.cmsg.entity.Dept">
  select * from t_dept t where t.f_deptno = #{f_deptno}
</select>

先是請求id為findById的select映射,然后得到一個id為empMap的ResultMap對象,在對應的resultMap的返回
類型是一個app.cmsg.entity.Emp對象,其中只有一個association節點,其仍會把對應的id等屬性賦給app.cmsg.entity.Emp對象,
這就是MyBatis擁有自動封裝功能,只要你提供了返回類型,MyBatis會根據自己的判斷來利用查詢結果封裝對應的對象,MyBatis的自
身判斷是把查詢的field或其對應的別名與返回對象的屬性進行比較,如果相匹配且類型也相匹配,MyBatis則會對其進行賦值。在上面對應的
resultMap中關聯了一個dept屬性,其對應的JAVA類型為Dept,在上述的寫法中,關聯對象是通過子查詢來進行關聯的,當然也可以直接
通過關聯查詢來進行關聯。上面的association子節點中,Property屬性表示是resultMap返回類型的哪個關聯屬性,對於上面的例子
就是Emp管理的dept屬性;select表示進行哪個select映射來映射對應的關聯屬性,即會去請求id為select所對應的值的select映射 來
查詢出其所關聯的屬性對象;Column表示當前關聯對象在id為empMap的resultMap中所對應的鍵值對,該鍵值對將作為對關聯對象子查詢的參數,
即將把在findById中查詢出來的dept屬性的值作為參數傳給進行關聯對象dept的子查詢findByDeptApp的參數;javaType表示當前關聯
對象在JAVA中是什么類型。

5 添加測試類(需要引入Junit包)

package app.cmsg.test;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import app.cmsg.dao.EmpDao;
import app.cmsg.entity.Condition;
import app.cmsg.entity.Emp;

public class JUintTest {

/**
* 多對一嵌套查詢映射
* 根據ID查詢一條員工記錄,並查詢他們所在的部門
*/
@Test
public void findById(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
EmpDao empDao = ctx.getBean(EmpDao.class);
Emp emp = empDao.findById(12);
System.out.println(
  emp.getF_empno()+", "+
  emp.getF_ename()+", "+
  emp.getF_ejob()+", "+
  emp.getDept().getF_deptno()+", "+
  emp.getDept().getF_dname()+", "+
  emp.getDept().getF_loc()

);

最后控制台打印出的結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM