实体类:

package com.entity;

import java.util.List;

public class Dept {

    private Integer deptId;
private String deptName;
private List<Employee> employees; @Override
public String toString() {
return "Dept{" +
"deptId=" + deptId +
", deptName='" + deptName + '\'' +
", employees=" + employees +
'}';
} public Integer getDeptId() {
return deptId;
} public void setDeptId(Integer deptId) {
this.deptId = deptId;
} public String getDeptName() {
return deptName;
} public void setDeptName(String deptName) {
this.deptName = deptName;
} public List<Employee> getEmployees() {
return employees;
} public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}

  

package com.entity;

import java.math.BigDecimal;

public class Employee {

    private Integer employeeId;
private String employeeName;
private Integer employeeGender;
private BigDecimal employeeSalary;
private Integer deptId;
private Dept dept; @Override
public String toString() {
return "Employee{" +
"employeeId=" + employeeId +
", employeeName='" + employeeName + '\'' +
", employeeGender=" + employeeGender +
", employeeSalary=" + employeeSalary +
", deptId=" + deptId +
", dept=" + dept +
'}';
} public Integer getEmployeeId() {
return employeeId;
} public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
} public String getEmployeeName() {
return employeeName;
} public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
} public Integer getEmployeeGender() {
return employeeGender;
} public void setEmployeeGender(Integer employeeGender) {
this.employeeGender = employeeGender;
} public BigDecimal getEmployeeSalary() {
return employeeSalary;
} public void setEmployeeSalary(BigDecimal employeeSalary) {
this.employeeSalary = employeeSalary;
} public Integer getDeptId() {
return deptId;
} public void setDeptId(Integer deptId) {
this.deptId = deptId;
} public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
}
}

  多对一的几种方式:

1.

<mapper namespace="com.dao.EmployeeDao">

    <!--<insert id="insert">-->
<!--<selectKey order="BEFORE" keyColumn="employeeId,employeeGender" keyProperty="employeeId,employeeGender" resultType="com.entity.Employee">-->
<!--select employee_id employeeId,employee_gender employeeGender from employee where employee_id=13-->
<!--</selectKey>-->
<!--insert into subtable(employee_id,employee_name,employee_gender) values (#{employeeId},"mdzz",#{employeeGender})-->
<!--</insert>--> <resultMap id="empResultMap" type="com.entity.Employee">
<id property="employeeId" column="employee_id"></id>
<result property="employeeName" column="employee_name"></result>
<result property="employeeGender" column="employee_gender"></result>
<result property="employeeSalary" column="employee_salary"></result>
<result property="deptId" column="dept_id"></result>
<result property="dept.deptId" column="dept_id"></result>
<result property="dept.deptName" column="dept_name"></result>
</resultMap> <select id="queryAll" resultMap="empResultMap">
select employee_id,employee_name,employee_gender,employee_salary,e.dept_id,dept_name,d.dept_id from employee e left outer join dept d on e.dept_id = d.dept_id;
</select>
</mapper>

  2.

<resultMap id="empResultMap" type="com.entity.Employee">
<id property="employeeId" column="employee_id"></id>
<result property="employeeName" column="employee_name"></result>
<result property="employeeGender" column="employee_gender"></result>
<result property="employeeSalary" column="employee_salary"></result>
<result property="deptId" column="dept_id"></result>
<!--<result property="dept.deptId" column="dept_id"></result>-->
<!--<result property="dept.deptName" column="dept_name"></result>-->
<association property="dept" resultMap="deptResultMap"></association>
</resultMap> <resultMap id="deptResultMap" type="com.entity.Dept">
<id property="deptId" column="dept_id"></id>
<result property="deptName" column="dept_name"></result>
</resultMap> <select id="queryAll" resultMap="empResultMap">
select employee_id,employee_name,employee_gender,employee_salary,e.dept_id,dept_name,d.dept_id from employee e left outer join dept d on e.dept_id = d.dept_id;
</select>

  2较之1的好处是单独把Dept类的resultMap提出来,可以复用

3.

<resultMap id="empResultMap" type="com.entity.Employee">
<id property="employeeId" column="employee_id"></id>
<result property="employeeName" column="employee_name"></result>
<result property="employeeGender" column="employee_gender"></result>
<result property="employeeSalary" column="employee_salary"></result>
<result property="deptId" column="dept_id"></result>
<!--<result property="dept.deptId" column="dept_id"></result>-->
<!--<result property="dept.deptName" column="dept_name"></result>-->
<association property="dept">
<id property="deptId" column="dept_id"></id>
<result property="deptName" column="dept_name"></result>
</association>
</resultMap> <select id="queryAll" resultMap="empResultMap">
select employee_id,employee_name,employee_gender,employee_salary,e.dept_id,dept_name,d.dept_id from employee e left outer join dept d on e.dept_id = d.dept_id;
</select>

  只不过是第2中方法把<association>的resultMap省略,直接在里面配置管理实体的映射配置,无法做到2那样的resultMap复用

4.不推荐,n+1查询,耗费资源。解决方法有:内嵌resultMap或者使用内部缓存(cache)解决一部分

<resultMap id="empResultMap" type="com.entity.Employee">
<id property="employeeId" column="employee_id"></id>
<result property="employeeName" column="employee_name"></result>
<result property="employeeGender" column="employee_gender"></result>
<result property="employeeSalary" column="employee_salary"></result>
<result property="deptId" column="dept_id"></result>
<association property="dept" column="dept_id" select="getDept"></association>
</resultMap> <select id="queryAll" resultMap="empResultMap">
select employee_id,employee_name,employee_gender,employee_salary,dept_id from employee;
</select> <select id="getDept" resultType="com.entity.Dept">
select dept_id,dept_name from dept where dept_id=#{deptId};
</select>

  也就是使用<association>的property指定实体类的字段,column是这个字段所代表的表的主键,即子表的外键(employee的外键dept_id),select指定<select>的id。

  再一个注意点就是<select id="getDept">中的select语句的where条件。

一对多:写法和多对一类似

1.resultMap+collection

<mapper namespace="com.dao.DeptDao">
<select id="queryAll" resultMap="deptResultMap">
select employee_id,employee_name,employee_gender,employee_salary,e.dept_id,dept_name,d.dept_id from employee e right outer join dept d on e.dept_id = d.dept_id;
</select> <resultMap id="deptResultMap" type="com.entity.Dept">
<id property="deptId" column="dept_id"></id>
<result property="deptName" column="dept_name"></result>
<collection property="employees" resultMap="empResultMap"></association>
</resultMap> <resultMap id="empResultMap" type="com.entity.Employee">
<id property="employeeId" column="employee_id"></id>
<result property="employeeName" column="employee_name"></result>
<result property="employeeGender" column="employee_gender"></result>
<result property="employeeSalary" column="employee_salary"></result>
<result property="deptId" column="dept_id"></result>
</resultMap>
</mapper>

  另一种:n+1查询

<select id="queryAll" resultMap="deptResultMap">
select dept_id,dept_name from dept;
</select> <resultMap id="deptResultMap" type="com.entity.Dept">
<id property="deptId" column="dept_id"></id>
<result property="deptName" column="dept_name"></result>
<collection property="employees" select="getEmp" column="dept_id"></collection>
</resultMap> <select id="getEmp" resultMap="basicEmpResultMap">
select employee_id,employee_name,employee_gender,employee_salary,dept_id from employee;
</select> <resultMap id="basicEmpResultMap" type="com.entity.Employee">
<id property="employeeId" column="employee_id"></id>
<result property="employeeName" column="employee_name"></result>
<result property="employeeGender" column="employee_gender"></result>
<result property="employeeSalary" column="employee_salary"></result>
<result property="deptId" column="dept_id"></result>
</resultMap>

  

public interface DeptDao {

    List<Dept> queryAll();
}

  

public class DeptDaoTest {

    @Test
public void testQueryAll() {
DeptDao deptDao = MapperFactory.generateMapper(DeptDao.class);
List<Dept> depts = deptDao.queryAll();
System.out.println(depts);
}
}

  

mybatis的一对多和多对一的连接查询的更多相关文章

  1. mybatis 中一对多、多对一、多对多、父子继承关系

    mybatis 中处理一对多.多对一.多对多.父子继承关系的有关键词:association .collection .discriminator id – 一个 ID 结果:标记出作为 ID 的结果 ...

  2. mybatis的一对多,多对一,以及多对对的配置和使用

    1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧   2.首先我们开始对mybatis的一对多的探究   根据这个应用场景 ...

  3. MyBatis:一对多、多对一处理

    多对一的处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 数据库设计 CREATE TABLE `teacher` ( `id` INT( ...

  4. MyBatis数据持久化(七)多表连接查询

    本节继续以多表连接查询的案例介绍使用resultMap的好处,对于两张以上的表进行关联查询,当我们有选择的从不同表查询所需字段时,使用resultMap是相当方便的.例如我们有两张表,分别为用户表Us ...

  5. Mybatis 中一对多,多对一的配置

    现在有很多电商平台,就拿这个来说吧.顾客跟订单的关系,一个顾客可以有多张订单,但是一个订单只能对应一个顾客. 一对多的顾客 <?xml version="1.0" encod ...

  6. Mybatis【一对多、多对一、多对多】知识要点

    Mybatis[多表连接] 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联 ...

  7. EF里一对一、一对多、多对多关系的配置和级联删除

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  8. EF——一对一、一对多、多对多关系的配置和级联删除 04(转)

    EF里一对一.一对多.多对多关系的配置和级联删除   本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...

  9. 六 mybatis高级映射(一对一,一对多,多对多)

    1  订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习.

随机推荐

  1. Django 利用第三方平台实现用户注册02

    前言: 上篇博客我们已经对设置了图形验证码,短信验证码对用户信息进行了一些简单的验证,本篇博客我们会将上篇的一些验证方法进行结合,来进一步完成我们的注册工作 1. 创建视图类 在user中的view创 ...

  2. SQL中的Where,Group By,Order By和Having

    说到SQL语句,大家最开始想到的就是他的查询语句: select * from tableName: 这是最简单的一种查询方式,不带有任何的条件. 当然在我们的实际应用中,这条语句也是很常用到的,当然 ...

  3. 009.CI4框架CodeIgniter, 网页访问GET的URL参数获取,分段输出URL参数

    01.代码如下,我们给在PHP CI4框架中定义了一个show函数,并给了3个参数,代码如下: <?php namespace App\Controllers\System; use App\C ...

  4. Ado.NET SQLHelper(2)

    测试发现前面发的那个功能太简单,不能调用getdate()等内部函数.  完善后重载了insert和update两个功能,将函数作为字符串传入SQL语句构造,需要的可以试用一下   using Sys ...

  5. 在 .net 中释放嵌入的资源

        private static void ExtractResourceToFile(string resourceName, string filename) {     if (!Syste ...

  6. Arduino读取串口数据并进行字符串分割

    String comdata = ""; int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0; voi ...

  7. unicode字符等价探究

    Demobaidu.com(\uff41)能跳转到baidu.combаidu.com(\u0430)不能跳转到baidu.com,被认为成一个其他域名 等价原因两个不同编码的Unicode字符之间可 ...

  8. scala 语言特性

    Scala 语言特性 Unit 表示无值, 等价于java, C++中的void Null 表示空值或空引用 Nothing 所有其他类型的子类型, 表示没有值 Any 所有类型的超类, 任何实例都属 ...

  9. .NET via C#笔记5——基元类型,引用类型和值类型

    5 基元类型,引用类型和值类型 5.3 值类型的装箱和拆箱 将值类型转化为引用类型需要进行装箱(boxing) 赋值,传参等操作,如果从值类型转为引用类型,都会进行装箱 装箱的代价比较大 申请一块堆内 ...

  10. 文件的概念、标准IO其一

    1.文件的概念 文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现. 系统调用.文件IO.标准IO的关系如下: 2.linux系统的文件分 ...