二、mybatis处理一对多映射关系的两种方式

目录

前言

准备

第一种:通过collection

第二种:通过分布查询


前言

小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共同进步,欢迎关注!

处理数据库表之间的一对多的mybatis中及其的重要,并且需要我们掌握的

准备

先创建两张表emp(员工表),dept(部门表)如图所示:

emp(员工表)

 dept(部门表)

 在写出两张表对应的实体类

 

 

第一种:通过collection

 思路:以通过部门id,查询部门信息,以及部门中所有员工信息为例。

mapper接口

public interface DeptMapper {

//查询部门以及部门中的员工信息(一对多collection)
    Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);

}

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.obtk.mybatis.mapper.DeptMapper">
 <resultMap id="deptAndEmpResultMap" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
<!--
  ofType:设置集合类型的属性中存储的数据类型
-->
       <collection property="emps" ofType="emp">
           <id column="emp_id" property="empId"></id>
           <result column="emp_name" property="empName"></result>
           <result column="age" property="age"></result>
           <result column="gender" property="gender"></result>
       </collection>
    </resultMap>
<!--    Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpByDeptId" resultMap="deptAndEmpResultMap">
  select * FROM dept LEFT JOIN emp ON dept.dept_id =emp.dept_id WHERE
  dept.dept_id=#{deptId}
    </select>
</mapper>

 测试

public class ResultMapTest {
 @Test
    public void testGetEmpAndEmpByDeptId(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
//根据部门id=1来获取部门信息及员工信息
        Dept dept = mapper.getDeptAndEmpByDeptId(1);
        System.out.println(dept);
    }

}

 结果  由此可以看出通过左连接查询出来的多个员工信息放置在emps这个集合中

Dept{deptId=1, deptName='A', emps=[Emp{empId=1, empName='张三', age=20, gender='男', dept=null}, Emp{empId=4, empName='赵六', age=24, gender='男', dept=null}]}

第二种:通过分布查询

接口

  DeptMapper

public interface DeptMapper {

//通过部门id分布查询查询部门以及部门中的员工信息的第一步
    Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);
}

  EmpMapper

public interface EmpMapper {

//通过分步查询查询员工以及所对应的部门信息的第二步
    List<Emp> getDeptAndEmpByStepTwo(@Param("deptId")  Integer deptId);

}

  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.obtk.mybatis.mapper.DeptMapper">
  <resultMap id="deptAndEmpResultMapByStep" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <!--此处的select中写的是第二步接口中的方法的全路径,colum中写的是第一步查出的那个数据作为第二步的参数-->
        <collection property="emps"
                    select="com.obtk.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                    column="dept_id">
        </collection>
    </resultMap>

<!--    Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStep">
select * from dept where dept_id= #{deptId}
    </select>
</mapper>

EmpMapper.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.obtk.mybatis.mapper.EmpMapper">
<!--     List<Emp> getDeptAndEmpByStepTwo(@Param("deptId")  Integer deptId);-->
    <select id="getDeptAndEmpByStepTwo" resultType="Emp">
        select * from emp where dept_id=#{deptId}
    </select>
</mapper>

  测试

public class ResultMapTest {
  @Test
    public void testGetDeptAndEmpByStep(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
//        根据部门id=1来查询多条员工信息
        Dept dept = mapper.getDeptAndEmpByStepOne(1);
        System.out.println(dept);

    }
}

  结果  由此可以看出通过左连接查询出来的多个员工信息放置在emps这个集合中

Dept{deptId=1, deptName='A', emps=[Emp{empId=1, empName='张三', age=20, gender='男', dept=null}, Emp{empId=4, empName='赵六', age=24, gender='男', dept=null}]}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值