mybatis一对一嵌套查询

时间:2021-04-23 05:30:56

要求:查询一个员工的时候,把他对应的部门也查询出来

实现(其他配置这里不作说明,框架基于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;

/**
* 创建EmpDao接口并增加查询全部员工的方法
* @author 4750g
* 员工表的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()

);

最后控制台打印出的结果

mybatis一对一嵌套查询