MyBatis collection定义关联的集合类型的属性封装规则

本文详细介绍MyBatis中如何进行部门与员工的关联查询,包括一次性加载和懒加载两种方式,以及如何使用鉴别器根据性别不同改变封装行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实体类对象

@Data
public class Employee {

    private Integer id;

    private String lastName;

    private Integer gender;

    private String email;

    private Department department;
}
@Data
public class Department {

    private Integer id;

    private String deptName;
    /**
     * 一个部门下有很多个员工
     */
    private List<Employee> emps;
}

查询部门的时候将部门下的所有员工一并查出来

接口中的方法:

Department `selectDeptByIdPlus(Integer id);`

实现方式一:

<!--场景2:查询部门的时候将部门下的所有员工一并查出来-->
<!--collection定义关联的集合类型的属性封装规则,ofType:指定集合里边的元素类型-->
<!--和association一样,这样的话不管会不会用到部门下的员工信息都会把员工信息查询出来
也可以通过分步的方式,员工集合信息按需加载出来-->
<resultMap id="SimpleResultMap" type="com.gf.selfdemo.mybatis.bean.Department">
    <id column="d_id" property="id"/>
    <result column="dept_name" property="deptName"/>
    <collection property="emps" ofType="com.gf.selfdemo.mybatis.bean.Employee">
        <result column="e_id" property="id"/>
        <result column="last_name" property="lastName"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
    </collection>
</resultMap>

<select id="selectDeptByIdPlus" resultMap="SimpleResultMap">
    select d.id d_id,d.dept_name,e.id e_id,e.last_name,e.email,e.gender
    from department d
    left join employee e
    on e.dept_id=d.id
    where d.id=#{id}
</select>

实现方式二:

 <!--分步查询部门信息和部门下的员工集合信息-->
  <resultMap id="SimpleResultMap2" type="com.gf.selfdemo.mybatis.bean.Department">
        <id column="id" property="id"/>
        <result column="dept_name" property="deptName"/>
        <collection property="emps"
                    select="com.gf.selfdemo.mybatis.mapper.EmployeeMapperPlus.getEmpByDeptId"
                    column="id" fetchType="lazy">
        </collection>
    </resultMap>
    <select id="selectDeptByIdStep" resultMap="SimpleResultMap2">
        select * from department where id=#{id}
    </select>

其中关联的分步sql为:

  <select id="getEmpByDeptId" resultType="com.gf.selfdemo.mybatis.bean.Employee">
        select * from employee where dept_id=#{deptId}
    </select>

扩展知识

 <!--扩展:分布查询的时候不管是association还是collection,
    都可以将步骤一的查询结果作为步骤二的条件,如果步骤二需要传入多个条件,则需要变一下column的写法,封装为map传过去
    如:column="{key1=value1,key2=value2,key3=value3....}"
    另外,虽然全局开启了延迟加载,也可以在每个sql映射中改变,如:使用fetchType属性 lazy:延迟加载,eager:立即加载-->

discriminator 鉴别器的简单使用

<!--discriminator:鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为
    封装Employee:
        如果查出来的是女生,就把部门信息查询出来,否则不查询
        如果是男生,把last_name这一列的值赋给email-->

<resultMap id="ResultMapDis" type="com.gf.selfdemo.mybatis.bean.Employee">
        <id column="id" property="id"/>
        <result column="last_name" property="lastName"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <!--column:需要判定的列名   javaType:列值对应的java类型-->
        <discriminator javaType="string" column="gender">
            <!--女生,部门信息查出来-->
            <case value="0" resultType="com.gf.selfdemo.mybatis.bean.Employee">
                <!--分步查询-->
                <association property="department"
                             javaType="com.gf.selfdemo.mybatis.bean.Department"
                             column="dept_id">
                </association>
            </case>
            <!--男生,步查部门信息,把last_name赋值给email-->
            <case value="1" resultType="com.gf.selfdemo.mybatis.bean.Employee">
                <result column="last_name" property="lastName"/>
                <result column="last_name" property="email"/>
                <result column="gender" property="gender"/>
            </case>
        </discriminator>
    </resultMap>

    <select id="selectEmpDis" resultMap="ResultMapDis">
        select id,last_name,email,gender dpet_id from employee where id=#{id}
    </select>
### 回答1: MyBatis是一种Java持久化框架,它提供了一种将SQL语句与Java对象映射的方式。在MyBatis中,我们可以使用Collection来处理多个对象的映射关系,例如List、Set、Map等。通过使用Collection,我们可以更方便地处理多个对象之间的关系,提高程序的可读性和可维护性。同时,MyBatis还提供了一些高级特性,如动态SQL、缓存等,可以帮助我们更好地管理和优化SQL查询。 ### 回答2: collectionMyBatis中的一个复杂类型,用于处理数据库中的一对多关系。通过collection,我们可以将一个对象中的一个属性映射为另一个对象的集合。 在MyBatis的映射文件中,我们可以使用collection元素定义这种关系。首先,我们需要在主对象的属性中添加一个集合来存储与之相关联的对象。然后,通过collection元素,指定主对象的属性与从对象的映射关系,以及加载从对象的SQL语句。 例如,假设我们有一个Order对象和一个OrderItem对象,一个Order可以包含多个OrderItem。我们可以在Order对象中添加一个List<OrderItem>类型属性items,表示一个Order包含多个OrderItem。然后,在映射文件中,我们使用collection元素来描述Order与OrderItem之间的关系。 <resultMap id="orderResultMap" type="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <result property="amount" column="order_amount"/> <collection property="items" ofType="OrderItem"> <id property="id" column="item_id"/> <result property="name" column="item_name"/> <result property="price" column="item_price"/> </collection> </resultMap> 通过以上的映射配置,当我们查询一个Order对象时,MyBatis会自动加载与之相关联的OrderItem对象,并将其封装为List<OrderItem>类型集合,存储在Order对象的items属性中。 使用collection可以方便地处理一对多关系,并且可以提供简洁的映射配置。在实际开发中,我们经常会用到collection来处理对象之间的关联关系,提高数据的查询效率和编程的简洁性。 ### 回答3: Mybatis是一个基于Java的持久层框架,它是将数据库操作与Java对象之间的映射关系进行配置和管理的工具。在Mybatis中,使用Collection可以方便地处理一对多或多对多关系的数据。 在使用Mybatis时,我们可以在映射文件(Mapper)中使用Collection来表示一个属性集合。常见的Collection类型包括List、Set和Map等。在配置Collection时,我们需要指定该属性对应的Java集合类型元素类型,并在映射文件中使用相应的标签来描述。 例如,我们有一个User类和一个Order类,一个用户可以拥有多个订单。我们可以在User类中定义一个List<Order>类型属性来表示用户的订单列表。在Mybatis的映射文件中,可以使用collection标签来配置用户类和订单类之间的关系。在这个标签中,我们可以指定集合类型为List,元素类型为Order,并设置与User类对应的字段名和与Order类对应的字段名。 在配置完成后,Mybatis会根据映射文件的配置,自动将数据库中的数据查询出来,并通过Collection将相关的数据关联起来。我们可以通过调用相应的方法来获取用户的订单列表,并对订单数据进行操作。 总之,使用CollectionMybatis中可以方便地处理一对多或多对多的关系。通过正确配置映射文件,Mybatis能够自动将数据库中的数据与Java对象进行关联,方便我们进行操作和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值