当前位置:   article > 正文

五,mybatis的多表关联查询_mybatis多表联合查询

mybatis多表联合查询

一,association关联查询

先来介绍association。Association有两种用法,第一种是自己创建要查询的内容。
在这里插入图片描述

<resultMap id="empResultMapByAssociation" 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>
        <association property="dept" javaType="dept">
            <id column="dept_id" property="deptId"></id>
            <result column="dept_name" property="deptName"></result>
        </association>
    </resultMap>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以看到,我们在resultMap里面加了一个association,这个property属性是说明这个association关联的实体类的名称是什么,javaType是对应实体类的类名或者是类型别名(比如String,Int等等)。
那么现在就来创建对应的方法

List<Emp> selectEmpByAssociationOne(@Param("empId") Integer empId);  
  • 1

和sql语句

<select id="selectEmpByAssociationOne" resultMap="empResultMapByAssociation">
        select * from t_emp left join t_dept on t_emp.dept_id=t_dept.dept_id where t_emp.emp_id=#{empId}
    </select>

  • 1
  • 2
  • 3
  • 4

观察这个sql语句可以看到含义是 t_emp表与t_dept表左连接,以t_emp的dept_id字段和t_dept的dept_id字段相同连接,并且筛选所有t_emp的emp_id的值等同于输入的值的情况。

现在来讲association的第二个用法。就是不自己创建要查询的字段,在association里面锁定要查询的另一个表的mapper的方法查询,将结果拼接在一起。
在这里插入图片描述

<resultMap id="empResultMapStepOne" 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>
        <association property="dept"
                     select="com.chenchao.mybatis.mapper.DeptMapper.selectDeptStepTwo"
                     column="dept_id">
        </association>
    </resultMap>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这里的property和上面的是一样的,select就是查询语句是我们mapper的DeptMapper里面的selectDeptStepTwo方法,然后我们传递过去的参数是查询出来的每行数据的dept_id字段数据。
在这里插入图片描述
这也意味着使用这个方法必须要到DeptMapper里面创建对应的方法来满足查询。现在我们从EmpMapper开始创建方法。在EmpMapper创建方法

List<Emp> selectEmpByAssociationStepOne(@Param("empId") Integer empId);
  • 1

再创建对应的sql语句

<select id="selectEmpByAssociationStepOne" resultMap="empResultMapStepOne">
        select * from t_emp where emp_id=#{empId}
    </select>

  • 1
  • 2
  • 3
  • 4

为了满足查询我们还要到DeptMapper里面创建方法,而且方法里面有参数,是我们传递过去的dept_id。
DeptMapper里面的方法是

List<Dept> selectDeptStepTwo(@Param("deptId") Integer deptId);
  • 1

对应的sql语句是

<select id="selectDeptStepTwo" resultType="com.chenchao.mybatis.pojo.Dept">
        select * from t_dept where dept_id=#{deptId}
    </select>

  • 1
  • 2
  • 3
  • 4

这里直接使用resultType的原因是开启了转换命名法的setting所以可以查询到。

二,collection关联查询

使用collection也差不多。这两个基本可以互换。但是默认情况下assiociation应用于一对一和多对一的情况,而collection应用于一对多的情况。
现在简单解释collection的用法。

<resultMap id="resultMapByCollection" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以看到用法和association基本相同,只有ofType有差别,ofType是对象的类型。
那么我们就只需要创建对应的方法和sql语句就可以了。这个用法没有使用别的mapper的方法,所以只是使用左连接方法查询表
先创建方法

List<Emp> selectEmpByAssociationOne(@Param("empId") Integer empId);
  • 1

再创建sql语句

<select id="selectEmpByAssociationOne" resultMap="empResultMapByAssociation">
        select * from t_emp left join t_dept on t_emp.dept_id=t_dept.dept_id where t_emp.emp_id=#{empId}
    </select>

  • 1
  • 2
  • 3
  • 4

在启动类创建对应的方法

@Test
    public void testForSelectDeptByCollection() throws IOException {
        SqlSession sqlSession= SqlSessionUtil.getSqlSession();
        DeptMapper deptMapper= sqlSession.getMapper(com.chenchao.mybatis.mapper.DeptMapper.class);
        List<Dept>  result=deptMapper.selectDeptByCollection(1);
        System.out.println(result);
        sqlSession.close();
    }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

现在介绍使用别的Mapper方法的collection

<resultMap id="selectDeptStepOne" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <collection property="emps"
                    select="com.chenchao.mybatis.mapper.EmpMapper.selectStepTwoByCollection"
                    column="dept_id"></collection>
    </resultMap>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

创建方法

List<Dept> selectStepOneByCollection(@Param("deptId") Integer deptId);
  • 1

创建sql方法

<select id="selectStepOneByCollection" resultMap="selectDeptStepOne">
        select * from t_dept where dept_id=#{deptId}
    </select>

  • 1
  • 2
  • 3
  • 4

再到EmpMapper里面创建方法

List<Emp> selectStepTwoByCollection(@Param("deptId") Integer deptId);
  • 1

创建sql语句

<select id="selectStepTwoByCollection" resultType="emp">
        select * from  t_emp where  dept_id = #{deptId}
    </select>


  • 1
  • 2
  • 3
  • 4
  • 5

在启动类创建对应的方法

@Test
    public void testForSelectDeptByCollectionStepOne() throws IOException {
        SqlSession sqlSession= SqlSessionUtil.getSqlSession();
        DeptMapper deptMapper= sqlSession.getMapper(com.chenchao.mybatis.mapper.DeptMapper.class);
        List<Dept>  result=deptMapper.selectStepOneByCollection(1);
        System.out.println(result);
        sqlSession.close();
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/391758
推荐阅读
相关标签
  

闽ICP备14008679号