mybatis使用collection查询集合属性规则

接上篇mybatis使用associaton进行分步查询

相关的类还是上篇中的类。

查询部门的时候将部门对应的所有员工信息也查询出来

DepartmentMapper.xml

<!--嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则  -->
    <resultMap type="com.mybatis.bean.Department" id="MyDept">
        <id column="did" property="id"/>
        <result column="dept_name" property="departmentName"/>
        <!--
            collection定义关联集合类型的属性的封装规则
            ofType:指定集合里面元素的类型
        -->
        <collection property="emps" ofType="com.mybatis.bean.Employee">
            <!-- 定义这个集合中元素的封装规则 -->
            <id column="eid" property="id"/>
            <result column="last_name" property="lastName"/>
            <result column="email" property="email"/>
            <result column="gender" property="gender"/>
        </collection>
    </resultMap>
    <!-- public Department getDeptByIdPlus(Integer id); -->
    <select id="getDeptByIdPlus" resultMap="MyDept">
        SELECT d.id did,d.dept_name dept_name,
                e.id eid,e.last_name last_name,e.email email,e.gender gender
        FROM tbl_dept d
        LEFT JOIN tbl_employee e
        ON d.id=e.d_id
        WHERE d.id=#{id}
    </select>


collection分步查询

先通过部门表的id查出部门信息,再通过员工表的部门id查出所有的员工信息,也就是Department中的private List<Employee> emps;的属性信息

DepartmentMapper.xml:首先通过id="getDeptByIdStep"的sql查出部门信息

再通过collection中的select="com.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId"调用EmployeeMapper.xml中的查询语句,column="id"为传递的查询条件的值,也就是将这个值赋给EmployeeMapper.xml中的#{deptId}

    <!-- collection:分步查询 -->
    <resultMap type="com.mybatis.bean.Department" id="MyDeptStep">
        <id column="id" property="id"/>
        <id column="dept_name" property="departmentName"/>
        <collection property="emps"
            select="com.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId"
            column="id"></collection>
    </resultMap>
    <!-- public Department getDeptByIdStep(Integer id); -->
    <select id="getDeptByIdStep" resultMap="MyDeptStep">
        select id,dept_name from tbl_dept where id=#{id}
    </select>

EmployeeMapper.xml

    <!-- public List<Employee> getEmpsByDeptId(Integer deptId); -->
    <select id="getEmpsByDeptId" resultType="com.atguigu.mybatis.bean.Employee">
        select * from tbl_employee where d_id=#{deptId}
    </select>

最后呢,也就是将查询到的员工信息,即多条Employee记录封装给Departmentemps属性。

注意:collection的分步查询也是可以延迟加载的,具体配置与上篇中的association一致



另外,collection元素中还有个fetchType类型,也是用来控制延迟加载的,不过比全局配置的优先级更高。

fetchType 可选的。有效值为 lazyeager。 指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的值。

补充:collection中的column属性是数据库中的列名,或着是列的别名,用来传递给select属性所指定语句中的参数,那如果需要传递多个参数该怎么写?

官方文档:

原文地址:https://www.cnblogs.com/heliusKing/p/11173362.html

时间: 2024-08-28 07:13:43

mybatis使用collection查询集合属性规则的相关文章

Mybatis Collection查询集合只出现一条数据

Mybatis Collection查询集合只出现一条数据 1.原因 如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条. 2.解决办法 级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的.但在mybatis中主从表需要为相同字段名设置别名.设置了别名就OK了. 例子: 主表Standard, 从表StandEntity,均有名为id的字段 <resultMap id="StandardAndEntityResultMap"

mybatis的collection查询问题以及使用原生解决方案的结果

之前在springboot+mybatis环境的坑和sql语句简化技巧的第2点提到,数据库的一对多查询可以一次查询多级数据,并且把拿到的数据按id聚合,使父级表和子级表都有数据. 但是这种查询,必然要查询大量的重复父数据,如果不用这种方法,而是分级查询,效果会如何? 要知道这2种数据的查询效率如何,用Python可以简单查询到总时长. 首先用pip install MySQL-python这条指令安装,至于出错解决方法就是https://www.cnblogs.com/superxuezhazh

关于mybatis查询集合返回为[null]的问题

最近项目当中做功能遇到查询集合list为null,判非空却还是进入了非空的判断里面,后面才知道sql查询中 如果你是查询几个字段,必须加上不为空,否则sql查询前面的值是有值得,只是恰巧你查询的字段为Null 在此记录一下 原文地址:https://www.cnblogs.com/jbml-154312/p/8856647.html

&lt;MyBatis&gt;入门五 查询的返回值处理

select : 返回对象:  <select  id = " "  resultType= "对象的全类名"  /> List: <select  id = " "  resultType = "list泛型中的值" /> Map: 1.返回一条记录 Map<String,Object>      key -> 字段 value -> 值                    

7. MyBatis一对多查询

一: 准备工作 1. 建立数据 CREATE TABLE boss( b_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, b_name VARCHAR(255) ); CREATE TABLE manager( m_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, m_name VARCHAR(255) ); INSERT INTO boss(b_name) VALUES('Tom'); INSERT 

Mybatis关联表查询_5

使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明. 创建表和数据 创建教师表,班级表,学生表, 假设一个老师只负责教一个班,那么老师和班级之间的关系是一对一的关系. 假设一个班级有多个学生,那么班级和学生之间的关系是一对多的关系. CREATE TABLE teacher( t_id number(5) PRIMARY KEY, t_name VARCHAR2(20) ); CREATE TABLE class( c_id number(5)

Mybatis使用之查询详解

Mybatis使用之查询详解 一:简介 此篇主要知识点: 1.sql语句块 2.select标签属性 3.ResultMap 标签配置 4.一对一关联 5.一对多关联 6.多对多关联 7.嵌套查询 二:SQL语句块 2.1 作用 SQL元素可以被用来定义可重用的SQL 代码段,可以包含在其他语句中.比如在项目中常常做的分页查询.分别需要两条SQL语句.一条是查询所有具体记录信息.另一条需要查询记录数.而两条语句的where条件是一样的.这种类似情况就可以使用SQL语句块来简化配置信息. 2.2

Mybatis中collection和association的使用区别

1. 关联-association2. 集合-collection 比如同时有User.java和Card.java两个类 User.java如下: public class User{ private Card card_one; private List<Card> card_many; } 在映射card_one属性时用association标签, 映射card_many时用collection标签. 所以association是用于一对一和多对一,而collection是用于一对多的关

mybatis 联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUTO_INCREMEN