MyBatis 系列五 之 关联映射

Posted 回青

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 系列五 之 关联映射相关的知识,希望对你有一定的参考价值。

                                                                 MyBatis 系列五 之 关联映射

一对多的关联映射

一对多关联查询多表数据

1.1在MyBatis映射文件中做如下配置

<!--一对多单向的连接两表的查询-->
<resultMap type="Dept" id="deptMapper">
    <id property="deptNo" column="deptNo"/>
    <result property="deptName" column="deptName"/>
    <collection property="emps" ofType="Emp">
    <id property="empNo" column="empNo"/>
    <result property="empName" column="empName"/>
    </collection>
</resultMap>
<sql id="columns">
  dept.deptNo,deptName,empNo,empName 
</sql>

<select id="findDeptInfoById" resultMap="deptMapper">
   select <include refid="columns"/> from dept,emp 
   where dept.deptNo=emp.deptNo and dept.deptNo=#{deptNo}

</select> 

1.2在接口类中定义与映射文件查询语句的id值相同的方法名

package cn.hmy.dao;


import cn.hmy.entity.Dept;

public interface DeptDao {
    //根据编号查询部门信息
    public Dept findDeptInfoById(Dept dept);

}

1.3在测试类中书写一下代码进行测试

package cn.hmy.test;

import java.io.IOException;
import java.util.List;

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

import cn.hmy.dao.DeptDao;
import cn.hmy.entity.Dept;
import cn.hmy.util.MyBatisUtil;

public class MyTest {
    DeptDao deptDao;
    @Before
    public void myBefore(){
        SqlSession session = MyBatisUtil.getSession();
        deptDao = session.getMapper(DeptDao.class);
    }
    
    
    
    /**
     * 根据编号查找部门信息
     * @throws IOException
     */
    @Test
    public void findDeptInfoById() throws IOException{
        Dept dept=new Dept();
        dept.setDeptNo(3);
        Dept dept2 = deptDao.findDeptInfoById(dept);
        System.out.println(dept2);
        
    }
    
}

一对多的单张表的查询

1.1在MyBatis的映射文件中配置如下文件

<!--一对多单向的单张表的查询  -->
<select id="selectEmpByDeptNo" resultType="Emp">
  select empNo,empName from Emp where deptNo=#{deptNo}
</select>
<sql id="columns">
deptNo,deptName
</sql>
<resultMap type="Dept" id="deptMapper">
   <id property="deptNo" column="deptNo"/>
    <result property="deptName" column="deptName"/>
    <collection property="emps" ofType="Emp"
     select="selectEmpByDeptNo"
     column="deptNo"
    />
</resultMap>

<select id="findDeptInfoById" resultMap="deptMapper">
select <include refid="columns"/> from Dept
where deptNo=#{deptNo}
</select>

1.2在接口类中定义与映射文件查询语句的id值相同的方法名

1.3在测试类中书写一下代码进行测试

均如上

 

 

 

多对一的关联映射

多对一多表查询的配置

1.1在MyBatis的映射文件中,配置如下信息

<!-- 一对多单向的连接两表的查询 -->
<resultMap type="Emp" id="empMapper">
    <id property="empNo" column="empNo"/>
    <result property="empName" column="empName"/>
    <association property="dept" javaType="Dept">
      <id property="deptNo" column="deptNo"/>
      <result property="deptName" column="deptName"/>
    </association>
</resultMap>
<sql id="columns">
  dept.deptNo,deptName,empNo,empName 
</sql>

<select id="findEmpById" resultMap="empMapper">
   select <include refid="columns"/> from dept,emp 
   where dept.deptNo=emp.deptNo and empNo=#{empNo}

</select>

1.2在接口类中定义一个和映射文件的查询语句的id值相同的方法名

package cn.hmy.dao;


import cn.hmy.entity.Emp;

public interface EmpDao {
    //根据员工编号查找员工信息
    public Emp findEmpById(Emp emp);

}

 

1.3在测试类中书写如下代码进行测试

package cn.hmy.test;

import java.io.IOException;
import java.util.List;

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

import cn.hmy.dao.EmpDao;
import cn.hmy.entity.Dept;
import cn.hmy.entity.Emp;
import cn.hmy.util.MyBatisUtil;

public class MyTest {
    EmpDao empDao;
    @Before
    public void myBefore(){
        SqlSession session = MyBatisUtil.getSession();
        empDao = session.getMapper(EmpDao.class);
    }
    
    
    
    /**
     * 根据员工编号查找员工信息
     * @throws IOException
     */
    @Test
    public void findEmpById() throws IOException{
        Emp emp=new Emp();
        emp.setEmpNo(2);
        Emp emp2 = empDao.findEmpById(emp);
        System.out.println(emp2);
        
    }
    
}

多对一的单表的查询配置

1.1在MyBatis的映射文件中配置如下信息

<!-- 多对一单向的连接单表的查询 -->
<select id="selectDeptInfoBydeptNo" resultType="Dept">
  select deptNo,deptName from dept where deptNo=#{deptNo}
</select>

<resultMap type="Emp" id="empMapper">
    <id property="empNo" column="empNo"/>
    <result property="empName" column="empName"/>
    <association property="dept" javaType="Dept"
       select="selectDeptInfoBydeptNo"
       column="deptNo"
    />
</resultMap>
<sql id="columns">
  empNo,empName,deptNo
</sql>

<select id="findEmpById" resultMap="empMapper">
   select <include refid="columns"/> from emp 
   where empNo=#{empNo}

</select>

1.2在接口类中定义一个和映射文件的查询语句的id值相同的方法名

1.3在测试类中书写如下代码进行测试

代码同上

 

 

 

 

 

以上是关于MyBatis 系列五 之 关联映射的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis系列关联映射

MyBatis框架之第二篇

mybatis之关联映射

mybatis xml数据层框架应用--Mybatis关系映射之一对多关系映射

Mybatis之关联关系(一对多多对多)

mybatis xml数据层框架应用--Mybatis关系映射之一对一关系映射