一、Mybatis处理多对一映射关系的三种方式

目录

前言

准备

第一种:级联方式处理

第二种:通过association

第三种:通过分步查询


前言

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

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

准备

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

emp(员工表)

 dept(部门表)

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

 第一种:级联方式处理

   思路:通过员工的id来查询员工的信息及部门的信息

mapper接口

public interface EmpMapper {

//根据员工id获取左外连接员工以及对应的部门信息
    Emp getEmpAndByEmpId(@Param("empId") Integer empId);

}

 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">
<resultMap id="empAndDeptResultMap" type="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>

 <!--部门中的字段dept_id与Emp实体类中的属性dept中的deptId相对应 -->
 <!--部门中的字段dept_name与Emp实体类中的属性dept中的deptName相对应 -->
    <result column="dept_id" property="dept.deptId"></result>
    <result column="dept_name" property="dept.deptName"></result>
</resultMap>
 <!--  Emp getEmpAndByEmpId(@Param("empId")Integer empId);
员工表和部门表左外连接-->
    <select id="getEmpAndByEmpId" resultMap="empAndDeptResultMap">
       select  emp.*,dept.* FROM emp LEFT JOIN dept ON emp.dept_id =dept.dept_id WHERE emp.emp_id=#{empId}
    </select>
</mapper>

测试 

public class ResultMapTest {
//    两张表实现左外连接查询内容
    @Test
    public void testGetEmpAndByEmpId(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//        根据员工id来查询
        Emp empAndByEmpId = mapper.getEmpAndByEmpId(1);
        System.out.println(empAndByEmpId);
    }

}

结果 由此可以看到查询的部门信息放置在dept这个属性里面

第二种:通过association

mapper接口

public interface EmpMapper {

//根据员工id获取左外连接员工以及对应的部门信息
    Emp getEmpAndByEmpId(@Param("empId") Integer empId);

}

 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">
  <resultMap id="empAndDeptResultMap2" type="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>
 <!--      
  将单独的dept分别来设置
  association:处理多对一的映射关系(处理实体类类型的属性)
  property:设置需要处理映射关系的属性的属性名
  javaType:设置要处理的属性的类型的(实体类)
-->
<association property="dept" javaType="Dept">
    <id column="dept_id" property="deptId"></id>
    <result column="dept_name" property="deptName"></result>
</association>
    </resultMap>

<!--  Emp getEmpAndByEmpId(@Param("empId")Integer empId);-->
    <select id="getEmpAndByEmpId" resultMap="empAndDeptResultMap2">
       select  emp.*,dept.* FROM emp LEFT JOIN dept ON emp.dept_id =dept.dept_id WHERE emp.emp_id=#{empId}
    </select>

</mapper>

 测试

public class ResultMapTest {
//    两张表实现左外连接查询内容
    @Test
    public void testGetEmpAndByEmpId(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//        根据员工id来查询
        Emp empAndByEmpId = mapper.getEmpAndByEmpId(1);
        System.out.println(empAndByEmpId);
    }

}

 结果  由此可以看到和第一种差不多

第三种:通过分步查询

 接口

EmpMapper

public interface EmpMapper {

//通过分步查询查询员工以及所对应的部门信息的第一步
    Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
}

 DeptMapper

public interface DeptMapper {
//    通过分布查询员工以及所对应的部门信息的第二步(多对一)
    Dept getEmpAndDeptBySteptTwo(@Param("deptId") Integer deptId);
}

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">


    <resultMap id="empAndDeptByStepResultMap" type="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>
    <!--    <result column="dept_id" property="dept.deptId"></result>
        <result column="dept_name" property="dept.deptName"></result>-->
       <!-- property:设置需要处理映射关系的属性的属性名
       select:设置分布查询的sql的唯一标识
       column:将查询出的某个字段作为分布查询的sql的条件
       fetchType:在全局配置中开启了延迟加载的环境时,
       通过该属性设置当前的分布查询是否使用延迟加载
       fetchType="eager"(立即加载)/Lazy(延迟加载)
       -->
        <association property="dept" select="com.obtk.mybatis.mapper.DeptMapper.getEmpAndDeptBySteptTwo"
                     column="dept_id" fetchType="eager">
        </association>
    </resultMap>
<!--    Emp getEmpAndDeptByStepOne(@Param("empId")Integer empId);-->
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
        select * from emp where  emp_id =#{empId};
    </select>
</mapper>

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">

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

测试 

public class ResultMapTest {
    @Test
    public void testGetEmpAndDeptByStep(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        //        通过员工id=1来查询
        Emp emp = mapper.getEmpAndDeptByStepOne(1);
//        System.out.println(emp.getEmpName());
        System.out.println(emp);
    }
}

结果 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值