遇到一个业务场景,我有两张表一张员工表(staff) 主键staff_id 另一张叫 (员工部门关系表)staff_department。
因为一个员工(staff)可以属于多个部门(department),一个部门(department)会很多员工(staff),所以staff_department是一个 staff_id 与 department_id的一张多对多的关系表。
现在我需要在mybatis 查询一条staff的时候获得当前这个staff关联的所有department,于是用到collection。
staff 实体类
package com.asclepius.slhdt.serv.dao.domain.staff;
/**
* @author chensg
*
*/
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import org.springframework.format.annotation.DateTimeFormat;
import com.asclepius.slhdt.serv.dao.domain.department.Department;
import com.fasterxml.jackson.annotation.JsonFormat;
public class Staff implements Serializable {
private static final long serialVersionUID = 1L;
// 自动增长id
private Integer staffIncId;
// uuid
private String staffId;
// 姓名
private String staffName;
// 性别
private Integer staffGender;
// 所属部门
private List<Department> departmentList;
public Integer getStaffIncId() {
return staffIncId;
}
public void setStaffIncId(Integer staffIncId) {
this.staffIncId = staffIncId;
}
public String getStaffId() {
return staffId;
}
public void setStaffId(String staffId) {
this.staffId = staffId;
}
public String getStaffName() {
return staffName;
}
public void setStaffName(String staffName) {
this.staffName = staffName;
}
public Integer getStaffGender() {
return staffGender;
}
public void setStaffGender(Integer staffGender) {
this.staffGender = staffGender;
}
public List<Department> getDepartmentList() {
return departmentList;
}
public void setDepartmentList(List<Department> departmentList) {
this.departmentList = departmentList;
}
}
staff与department是一个一对多关系,所以这里定义List<Department>
在xml中
<mapper namespace="com.asclepius.slhdt.serv.dao.mapper.staff.StaffMapper">
<resultMap type="staff" id="staffResult">
<id property="staffIncId" column="staff_inc_id" />
<result property="staffId" column="staff_id" />
<result property="staffName" column="staff_name" />
<result property="staffGender" column="staff_gender" />
<collection property="departmentList" column="staff_id" select="selectDepartment" ofType="department" javaType="ArrayList" />
</resultMap>
<select id="selectDepartment" parameterType="String" resultType="department" resultMap="departmentResult" >
select SD.department_id,
D.department_parent_id,
DP.department_name_alias
from shulan_staff_department SD
left join shulan_department_prop DP on
DP.department_id = SD.department_id
left join shulan_department D on
D.department_id = SD.department_id
where SD.staff_id=#{staffId}
</select>
<resultMap type="department" id="departmentResult">
<id property="departmentIncId" column="department_inc_id" />
<result property="departmentId" column="department_id" />
<result property="departmentParentId" column="department_parent_id" />
<result property="departmentNameAlias" column="department_name_alias" />
</resultMap>
<!-- 查询员工数据 -->
<select id="getStaffById" parameterType="String" resultMap="staffResult">
select S.staff_id,S.staff_name,S.staff_gender,
from staff S
where S.staff_id = #{param1}
</select>
这里省去了很多staff中无关的字段。看collection标签 property="departmentList" 对应的就是实体类中的List<Department> departmentList属性。column与select要连在一起看,select=selectDepartment指的就是 下面id="selectDepartment的select映射SQL,column=staff_id指的就是关联主键的id。调用getstaffById就可以获得当前这个staff以及其关联的所有department
分享到:
相关推荐
这篇博文可能深入解析了MyBatis如何处理List作为参数或者返回值的情况,以及字符串操作在SQL构建中的应用。 描述中提到的"NULL"并没有提供具体的信息,但我们可以从标签"源码"和"工具"推断,这篇博客可能包含了对...
在本主题中,我们将深入探讨Mybatis在数据库基本应用中的关键功能,包括增删改查(CRUD)操作,以及如何与Eclipse集成进行开发。 1. **Mybatis概述** Mybatis是一个轻量级的ORM(对象关系映射)框架,它消除了几乎...
详解MyBatis foreach collection示例 MyBatis foreach collection是一个非常强大的功能,它允许开发者动态构建In集合条件查询。该功能可以指定一个集合,声明集合项和索引变量,这些变量可以在元素体内使用。此外,...
在本场景中,我们探讨的是如何利用MyBatis的`collection`标签来实现帖子评论的多级回复以及与用户信息的关联查询。MyBatis是一个强大的Java持久层框架,它简化了数据库操作,使得开发者能更专注于SQL语句本身,而...
Mybatis 是一个流行的持久层框架,它提供了多种方式来实现在 Java 应用程序中与数据库交互。在 Mybatis 中,Collection 和 Association 是两个重要的概念,它们都是用于描述对象之间的关系,但是它们之间有着很大的...
在企业级应用开发中,MyBatis 是一个广泛使用的持久层框架,它允许开发者将 SQL 查询与 Java 代码直接结合,提供了比传统 JDBC 更高效、更便捷的数据访问方式。本实验报告将详细阐述如何在 MyBatis 中进行关联映射的...
在 JavaEE 开发中,Mybatis 的高级应用涉及到多个方面,包括动态 SQL、缓存机制、结果映射、事务管理以及自定义插件等。以下是对这些高级知识点的详细说明: 1. **动态 SQL**: Mybatis 的动态 SQL 功能允许开发者...
MyBatis作为一款优秀的持久层框架,主要解决了Java应用与数据库交互的问题。它支持普通的SQL查询、存储过程和高级映射,可以用来处理复杂的SQL,例如联表查询等,并且支持动态SQL语句,这在处理有较多条件判断的场景...
MyBatis是一款强大的Java持久层框架,它将SQL与...通过这份“MyBatis入门到精通”的学习资料,新手可以系统地学习MyBatis的基础知识,理解其核心概念,并逐步掌握实际项目中的应用技巧,从而成为熟练的MyBatis开发者。
MyBatis 提供了强大的映射元素,如`<resultMap>`用于定义结果集映射,`<association>`和`<collection>`用于处理复杂对象关系,以及`<choose>`, `<when>`, `<otherwise>`等结构,实现类似Java的if-else逻辑。...
标题中的“mybatis延迟加载样例”意味着我们将探讨如何在MyBatis中实现和使用延迟加载,以及它的具体应用场景。延迟加载是ORM框架的一个重要特性,能够有效防止大数据量的加载导致的内存溢出问题。 描述中提到的...
在MyBatis中,这需要使用`association`和`collection`标签来配置映射。在实际应用中,你可能会遇到懒加载和急加载的概念,前者在需要时加载关联数据,后者则在获取主对象时一并加载关联数据。 在这些范例中,你会...
【标题】:MyBatis框架的应用 在Java开发中,MyBatis是一个广泛使用的持久层框架,它将SQL语句与代码分离,提高了开发效率和可维护性。本主题主要探讨MyBatis中的动态SQL元素,包括、、、、、和,这些都是构建灵活...
在MyBatis的映射XML文件中,`<collection>`标签用于表示一对多的关系,它允许我们在一次查询中获取到一个对象的所有子对象,从而构建出树形结构。例如,如果我们有一个`Department`实体类,其中包含一个`List...
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数...通过深入研究这个示例,你可以逐步熟悉MyBatis的工作原理,并将其应用于实际的项目开发中。
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis ...
在实际应用中,`mybatis-3-config.xml`通常包含整个MyBatis系统的配置,而多个`mybatis-3-mapper.xml`文件则分别对应不同的数据库表或业务对象,每个文件内定义了对应的SQL语句和结果映射。 在项目中,`mybatis-3-...
Mybatis提供了处理复杂关联关系的能力,通过association(一对一)、collection(一对多)和many-to-many(多对多)标签,可以轻松地映射出复杂的数据库表关系。 12、自定义类型处理器 对于特殊的数据类型,Mybatis...
本教程将全面介绍MyBatis的核心概念、主要功能以及实际应用。 首先,我们要了解MyBatis的基本架构。MyBatis的核心是SqlSessionFactory,它是MyBatis的配置中心,负责创建SqlSession对象。SqlSession提供了与数据库...
在MyBatis中,使用`<collection>`标签来表示这种关系。你需要指定集合类型(如List或Set),关联的Java类,以及用于连接的主键字段。MyBatis会执行子查询,将所有关联的对象加载到主对象的集合属性中。在`chapter10_...