mybatis实现一对多的两种方法(适用于分页查询)

mybatis 实现一对多的查询方式

实体类代码

package com.sgcc.demo.model.bo;
/**  
 * @author liyalong
 * @description //TODO 
 * @date 13:44 2019/12/2
 **/
import com.sgcc.demo.model.po.DemoFileInfo;
import com.sgcc.demo.model.po.DemoFileManagement;
import lombok.Data;

import java.util.List;
@Data
public class DemoFileManagementBo extends DemoFileManagement {
    // 文件list
    private List<DemoFileInfo> fileInfos;
}

第一种 (适合单条查询一对多)

XML:

 <resultMap id="BaseResultMap" type="com.sgcc.demo.model.po.DemoFileManagement">
        <id column="GUID" jdbcType="VARCHAR" property="guid"/>
        <result column="NAME" jdbcType="VARCHAR" property="name"/>
        <result column="VERSION" jdbcType="VARCHAR" property="version"/>
        <result column="REMARK" jdbcType="VARCHAR" property="remark"/>
        <result column="UPDATE_TIME" jdbcType="TIMESTAMP" property="updateTime"/>
        <result column="DELETE_FLG" jdbcType="CHAR" property="deleteFlg"/>
    </resultMap>
    <resultMap id="fileMap" type="com.sgcc.demo.model.po.DemoFileInfo">
        <id column="GUID" jdbcType="VARCHAR" property="guid"/>
        <result column="INFO_ID" jdbcType="VARCHAR" property="infoId"/>
        <result column="FILE_NAME" jdbcType="VARCHAR" property="fileName"/>
        <result column="FILE_ADDRESS" jdbcType="VARCHAR" property="fileAddress"/>
        <result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime"/>
    </resultMap>
    <select id="selectById" resultMap="productsListMap" parameterType="string">
        select
        a.GUID,
        a.VERSION,
        a.REMARK,
        a.UPDATE_TIME,
        a.NAME,
        b.GUID as file_GUID,
        b.FILE_NAME,
        b.FILE_ADDRESS,
        b.CREATE_TIME
        from demo_file_management a
        left join demo_file_info b on a.GUID = b.INFO_ID
        <where>
            a.DELETE_FLG = '0'
            <if test="id != null and id != ''">
                and a.GUID = #{id}
            </if>
        </where>
    </select>

返回参数
在这里插入图片描述
这种方式仅适合于 查询一条信息,或者多条信息不使用PageQuery进行分页的情况下。(效率比较快,然是局限性比较强)

第二种方式(适用于分页查询)

 	<resultMap id="productsListMap" type="com.sgcc.demo.model.bo.DemoFileManagementBo" extends="BaseResultMap">
        <collection property="fileInfos"  ofType="com.sgcc.demo.model.po.DemoFileInfo">
            <id column="file_GUID" jdbcType="VARCHAR" property="guid"/>
            <result column="INFO_ID" jdbcType="VARCHAR" property="infoId"/>
            <result column="FILE_NAME" jdbcType="VARCHAR" property="fileName"/>
            <result column="FILE_ADDRESS" jdbcType="VARCHAR" property="fileAddress"/>
            <result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime"/>
        </collection>
    </resultMap>

    <resultMap id="productsListMap1" type="com.sgcc.demo.model.bo.DemoFileManagementBo">
        <id column="GUID" jdbcType="VARCHAR" property="guid"/>
        <result column="NAME" jdbcType="VARCHAR" property="name"/>
        <result column="VERSION" jdbcType="VARCHAR" property="version"/>
        <result column="REMARK" jdbcType="VARCHAR" property="remark"/>
        <result column="UPDATE_TIME" jdbcType="TIMESTAMP" property="updateTime"/>
        <result column="DELETE_FLG" jdbcType="CHAR" property="deleteFlg"/>
        <collection property="fileInfos" ofType="com.sgcc.demo.model.po.DemoFileInfo" select="selectFileList" column="GUID"/>
    </resultMap>


    <!--主查询-->
    <select id="select" resultMap="productsListMap1" parameterType="com.sgcc.demo.model.po.DemoFileManagement">
        select
        a.GUID,
        a.VERSION,
        a.REMARK,
        a.UPDATE_TIME,
        a.NAME
        from demo_file_management a
        <where>
            a.DELETE_FLG = '0'
            <if test="name != null and name != ''">
                and a.NAME LIKE concat("%",#{name},"%")
            </if>
        </where>
        Order by  a.UPDATE_TIME desc
    </select>
    <!--  子查询  -->
    <select id="selectFileList" resultType="com.sgcc.demo.model.po.DemoFileInfo">
        select
            b.GUID as guid,
            b.FILE_NAME as fileName,
            b.FILE_ADDRESS as fileAddress,
            b.CREATE_TIME as createTime
        from
            demo_file_info b
        where
            b.INFO_ID = #{guid}

    </select>

采用两套查询,主查询和子查询进行配合(缺点就是,效率不如第一种,但是可以分页使用,不限制连表方式)。

PS:对于自己封装的分页方法的,比如sql直接写limit的,建议第一种。毕竟效率比较高,不过此时需要先分页,然后再链表的嵌套查询。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Mybatis查询一对多分页可以通过两种方式实现。 第一种方式是使用Mybatis的内置分页插件PageHelper。通过在需要分页查询方法前加上PageHelper.startPage(pageNum, pageSize)代码,然后执行查询语句,就可以在查询结果中获取到分页后的数据。同时,可以使用PageInfo对查询结果进行封装,获取到分页的相关信息。 第二种方式是手动实现分页功能。可以通过编写SQL语句,使用LIMIT和OFFSET关键字来实现分页查询。根据页面传来的页码和每页显示数量,计算出需要跳过的记录数量,然后在查询语句中使用LIMIT限制查询结果的数量,OFFSET指定跳过的记录数量。最后,将查询结果返回即可。 无论使用哪种方式,一对多分页查询都需要考虑到关联表的关系。在设置分页查询条件时,需要注意关联表之间的查询条件,以及在查询结果中如何处理关联表的数据。 总结起来,Mybatis查询一对多分页可以通过使用内置分页插件PageHelper或者手动编写SQL语句实现。在设置分页查询条件时,要考虑关联表的关系,以及在查询结果中如何处理关联表的数据。 ### 回答2: MyBatis是一个在Java中使用的持久层框架,它可以用来简化数据库查询和操作的编码工作。在MyBatis中进行一对多查询并分页,需要通过配置文件和SQL语句来实现。 首先,在配置文件中配置数据库连接信息和映射文件等。然后,在映射文件中编写需要的SQL语句。对于一对多查询,可以使用嵌套查询或者关联查询。 使用嵌套查询的方式,可以先查询主表的信息,然后在嵌套查询中查询与主表关联的从表的信息。在查询结束后,可以通过PageHelper插件来实现分页功能。 使用关联查询的方式,可以使用SQL的连接语句来一次性查询主表和从表的信息。在查询结束后,同样可以通过PageHelper插件来实现分页功能。 无论使用哪种方式,最后都需要将查询结果封装为Java对象,并返回给调用方。 总结起来,要在MyBatis中进行一对多查询并分页,首先需要配置数据库连接信息和映射文件。然后,根据需要的查询方式编写SQL语句。最后,使用PageHelper插件实现分页功能,将查询结果封装为Java对象返回。 ### 回答3: Mybatis是一种用于Java语言的持久层框架,可以方便地进行数据库操作。当需要查询一对多关系并进行分页时,可以通过以下步骤实现: 1. 首先,在数据库中建立相关的表,例如主表和从表,确保它们之间有一对多的关系。 2. 在Mybatis的XML配置文件中定义两个对应主表和从表的实体类和映射关系。在主表的映射文件中,使用collection标签引入从表的实体类和映射关系,并指明关联的字段。在从表的映射文件中,使用association标签引入主表的实体类和映射关系,并指明关联的字段。 3. 在主表的Mapper接口中定义一对多查询的方法,使用@Results和@Result注解进行映射配置。在@Results注解中使用@Result注解指定查询结果的字段名和对应的实体类属性名。在@Result注解中使用@Collection注解指定从表的映射配置。 4. 在Mapper接口的XML配置文件中实现一对多查询的SQL语句,并使用分页相关的SQL语句进行结果分页。可以使用limit和offset关键字实现分页查询。 5. 在DAO层或Service层调用Mapper接口中定义的一对多查询方法,并传入分页参数,获取查询结果。 这样就可以实现Mybatis一对多查询分页功能。通过配置实体类和映射关系,定义查询方法,并使用分页相关的SQL语句,可以方便地实现一对多关系数据的分页查询Mybatis的灵活性和便捷性使得开发人员可以很方便地操作数据库,减少了大量重复的编码工作,提高了开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值