mybatisPlus实现多表连接分页动态查询方式

 更新时间:2025年12月24日 16:34:42   作者:红颜い笑倾城  
文章主要讲述了Java开发中常用的一些设计模式和代码结构,包括实体类(VO)、Mapper接口、Service实现类(ServiceImpl)等,通过这些组件的合理使用,可以提高代码的可维护性和可扩展性

mybatisPlus多表连接分页动态查询

实体类

package com.byx.communitycontrol.common.entity.baseinfo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;

/**
 * 点位信息
 **/
@Data
@TableName(value = "T_DWXX")
public class PointInfo implements Serializable {

    /**
     * 相机编码
     */
    @TableField(value = "CAMERAINDEXCODE")
    private String cameraIndexCode;

    /**
     * 点位名称
     */
    @TableField(value = "NAME")
    private String name;

    /**
     * 区域编码
     */
    @TableField(value = "UNITINDEXCODE")
    private String unitIndexCode;

    /**
     * 国标编码
     */
    @TableField(value = "GBINDEXCODE")
    private String gbIndexCode;

    /**
     * 设备编码
     */
    @TableField(value = "DEVICEINDEXCODE")
    private String deviceIndexCode;

    /**
     * 纬度
     */
    @TableField(value = "LATITUDE")
    private String latitude;

    /**
     * 经度
     */
    @TableField(value = "LONGITUDE")
    private String longitude;

    /**
     * 高度
     */
    @TableField(value = "ALTITUDE")
    private String altitude;

    /**
     * 像素
     */
    @TableField(value = "PIXEL")
    private Integer pixel;

    /**
     * 相机类别
     */
    @TableField(value = "CAMERATYPE")
    private Integer cameraType;

    /**
     * 安装位置
     */
    @TableField(value = "INSTALLPLACE")
    private String installPlace;

    /**
     * 矩阵编号
     */
    @TableField(value = "MATRIXCODE")
    private String matrixCode;

    /**
     * 频道号
     */
    @TableField(value = "CHANNUM")
    private Integer chanNum;

    /**
     * 查看棚
     */
    @TableField(value = "VIEWSHED")
    private String viewShed;

    /**
     * 能力集
     */
    @TableField(value = "CAPABILITYSET")
    private String capabilitySet;

    /**
     * 智能套装
     */
    @TableField(value = "INTELLIGENTSET")
    private String intelligentSet;


    /**
     * 记录位置
     */
    @TableField(value = "RECORDLOCATION")
    private String recordLocation;

    /**
     * 云台控制
     */
    @TableField(value = "PTZCONTROLLER")
    private String ptzController;

    /**
     * 设备资源类型
     */
    @TableField(value = "DEVICERESOURCETYPE")
    private String deviceResourceType;

    /**
     * 信道类型
     */
    @TableField(value = "CHANNELTYPE")
    private String channelType;

    /**
     * 转换类型
     */
    @TableField(value = "TRANSTYPE")
    private Integer transType;


    /**
     * 更新时间
     */
    @TableField(value = "UPDATETIME")
    private String updateTime;

    /**
     * 创建时间
     */
    @TableField(value = "CREATETIME")
    private String createTime;

    /**
     * 状态
     */
    @TableField(value = "STATUS")
    private Integer status;

    /**
     * 相机类型名称
     */
    @TableField(value = "CAMERATYPENAME")
    private String cameraTypeName;

    /**
     * 能力集名称
     */
    @TableField(value = "CAPABILITYSETNAME")
    private String capabilitySetName;

    /**
     * 智能设置名称
     */
    @TableField(value = "INTELLIGENTSETNAME")
    private String intelligentSetName;

    /**
     * 记录位置名称
     */
    @TableField(value = "RECORDLOCATIONNAME")
    private String recordLocationName;

    /**
     * 云台控制名称
     */
    @TableField(value = "PTZCONTROLLERNAME")
    private String ptzControllerName;

    /**
     * 设备资源类型名称
     */
    @TableField(value = "DEVICERESOURCETYPENAME")
    private String deviceResourceTypeName;

    /**
     *
     * 频道类型名称
     */
    @TableField(value = "CHANNELTYPENAME")
    private String channelTypeName;
    /**
     * 转换类型名称
     */
    @TableField(value = "TRANSTYPENAME")
    private String transTypeName;
    /**
     * 条约类型
     */
    @TableField(value = "TREATYTYPE")
    private String treatyType;
    /**
     * 条约类型名称
     */
    @TableField(value = "TREATYTYPENAME")
    private String treatyTypeName;
    /**
     * 状态名称
     */
    @TableField(value = "STATUSNAME")
    private String statusName;
}

VO类

package com.byx.communitycontrol.common.vo;

import com.byx.communitycontrol.common.entity.baseinfo.PointInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;

@Data
@EqualsAndHashCode(callSuper = true)
public class PointInfoVo extends PointInfo implements Serializable {

    /**
     * 相机名称
     */
    private String cameraName;

    /**
     * 区域名称
     */
    private String qyName;

    /**
     * IP
     */
    private String complexIp;

    /**
     * 上级IP
     */
    private String parentIp;

}

mapper接口

package com.byx.communitycontrol.gm.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.byx.communitycontrol.common.entity.baseinfo.PointInfo;
import com.byx.communitycontrol.common.vo.PointInfoVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;


@Mapper
public interface PointInfoMapper extends BaseMapper<PointInfo> {


    
    //常规写法
    @Select("SELECT\n" +
            "\td.CAMERAINDEXCODE,\n" +
            "\td.NAME,\n" +
            "\td.UNITINDEXCODE,\n" +
            "\td.GBINDEXCODE,\n" +
            "\td.DEVICEINDEXCODE,\n" +
            "\tqd.CAMERANAME,\n" +
            "\tqx.NAME AS qyname,\n" +
            "\td.STATUS,\n" +
            "\td.STATUSNAME,\n" +
            "\td.LATITUDE,\n" +
            "\td.LONGITUDE,\n" +
            "\td.ALTITUDE,\n" +
            "\ti.COMPLEXIP,\n" +
            "\ti.PARENTIP,\n" +
            "\td.CREATETIME,\n" +
            "\td.UPDATETIME \n" +
            "FROM\n" +
            "\tT_DWXX d\n" +
            "\tLEFT JOIN T_DWXXIP i ON d.CAMERAINDEXCODE = i.CAMERAINDEXCODE\n" +
            "\tLEFT JOIN T_QY_DW qd ON d.CAMERAINDEXCODE = qd.CAMERAINDEXCODE\n" +
            "\tLEFT JOIN T_QYXX qx ON d.UNITINDEXCODE = qx.INDEXCODE \n" +
            "${ew.customSqlSegment} " +
            "ORDER BY\n" +
            "\td.UPDATETIME DESC")
    IPage<PointInfoVo> getPointInfoPageList(Page<?> page, @Param("ew") Wrapper wrapper);

    //可返回一个List集合,之后再用page.setRecords()方法将集合set进去
    @Select("SELECT\n" +
            "\td.CAMERAINDEXCODE,\n" +
            "\td.NAME,\n" +
            "\td.UNITINDEXCODE,\n" +
            "\td.GBINDEXCODE,\n" +
            "\td.DEVICEINDEXCODE,\n" +
            "\tqd.CAMERANAME,\n" +
            "\tqx.NAME AS qyname,\n" +
            "\td.STATUS,\n" +
            "\td.STATUSNAME,\n" +
            "\td.LATITUDE,\n" +
            "\td.LONGITUDE,\n" +
            "\td.ALTITUDE,\n" +
            "\ti.COMPLEXIP,\n" +
            "\ti.PARENTIP,\n" +
            "\td.CREATETIME,\n" +
            "\td.UPDATETIME \n" +
            "FROM\n" +
            "\tT_DWXX d\n" +
            "\tLEFT JOIN T_DWXXIP i ON d.CAMERAINDEXCODE = i.CAMERAINDEXCODE\n" +
            "\tLEFT JOIN T_QY_DW qd ON d.CAMERAINDEXCODE = qd.CAMERAINDEXCODE\n" +
            "\tLEFT JOIN T_QYXX qx ON d.UNITINDEXCODE = qx.INDEXCODE \n" +
            "${ew.customSqlSegment} " +
            "ORDER BY\n" +
            "\td.UPDATETIME DESC")
    List<PointInfoVo> getPointInfoPageList(Page<?> page, @Param("ew") Wrapper wrapper);


    //可用实体属性代替查询元素
    @Select("SELECT\n" +
            "\td.*,\n" +
            "\tqd.cameraName,\n" +
            "\tqx.name AS qyName,\n" +
            "\ti.complexIp,\n" +
            "\ti.parentIp \n" +
            "FROM\n" +
            "\tT_DWXX d\n" +
            "\tLEFT JOIN T_DWXXIP i ON d.cameraIndexCode = i.cameraIndexCode\n" +
            "\tLEFT JOIN T_QY_DW qd ON d.cameraIndexCode = qd.cameraIndexCode\n" +
            "\tLEFT JOIN T_QYXX qx ON d.unitIndexCode = qx.indexCode \n" +
            "${ew.customSqlSegment} " +
            "ORDER BY\n" +
            "\td.updateTime DESC")
    IPage<PointInfoVo> getPointInfoPageList(Page<?> page, @Param("ew") Wrapper wrapper);
}

serviceImpl类

package com.byx.communitycontrol.gm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.byx.communitycontrol.common.entity.AppPage;
import com.byx.communitycontrol.common.entity.baseinfo.PointInfo;
import com.byx.communitycontrol.common.request.PointInfoPageReq;
import com.byx.communitycontrol.common.vo.PointInfoVo;
import com.byx.communitycontrol.context.helper.MyBatisPlusPageImpl;
import com.byx.communitycontrol.gm.mapper.PointInfoMapper;
import com.byx.communitycontrol.gm.service.IPointInfoService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;

@Service
public class PointInfoServiceImpl extends ServiceImpl<PointInfoMapper, PointInfo> implements IPointInfoService {

    @Resource
    private PointInfoMapper pointInfoMapper;

    @Override
    public AppPage<PointInfoVo> findListByPageCondition(PointInfoPageReq request) {
        Page<PointInfoVo> page = new Page(request.getCurrentPage(), request.getPageSize());

        //方法一:
        QueryWrapper<PointInfoVo> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.hasText(request.getDwName()), "name", request.getDwName());
        queryWrapper.like(StringUtils.hasText(request.getQyName()), "qyName", request.getQyName());
        queryWrapper.eq(request.getStatus() != null, "status", request.getStatus());
        List<PointInfoVo> pointInfoPageList = pointInfoMapper.getPointInfoPageList(page, queryWrapper);
        Page<PointInfoVo> pointInfoVoPage = page.setRecords(pointInfoPageList);

        //方法二:
        QueryWrapper<PointInfoVo> eq = Wrappers.query(new PointInfoVo()).like(StringUtils.hasText(request.getDwName()),
                "d.name",
                request.getDwName()).like(StringUtils.hasText(request.getQyName()), "qx.name",
                request.getQyName()).eq(request.getStatus() != null, "d.status", request.getStatus());
        IPage<PointInfoVo> pointInfoPageList = pointInfoMapper.getPointInfoPageList(page, eq);

        方法三:可将 Wrappers.query(new PointInfoVo()).like(...)... 换成 Wrappers.lambdaQuery(PointInfoVo.class).like(StringUtils.hasText(request.getDwName()),PointInfoVo::getName,
                request.getDwName())...

        return new MyBatisPlusPageImpl<>(pointInfoPageList);
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中参数传递方式详解

    java中参数传递方式详解

    这篇文章主要介绍了java中参数传递方式详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java Swing树状组件JTree用法实例详解

    Java Swing树状组件JTree用法实例详解

    这篇文章主要介绍了Java Swing树状组件JTree用法,结合具体实例形式分析了Swing组件JTree构成树状列表的节点设置与事件响应,以及自定义图形节点的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • lombok @Accessors用法详解

    lombok @Accessors用法详解

    这篇文章主要介绍了lombok @Accessors用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • springboot结合mybatis-plus快速生成项目模板的方法

    springboot结合mybatis-plus快速生成项目模板的方法

    Mybatis-Plus是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生,接下来通过本文给大家分享springboot结合mybatis-plus快速生成项目模板的方法,感兴趣的朋友一起看看吧
    2021-06-06
  • MyBatis的五种批量查询实例总结

    MyBatis的五种批量查询实例总结

    为了提高代码的执行效率,我们有时需要采用批量查询的查询方法,下面这篇文章主要给大家介绍了关于MyBatis的五种批量查询的相关资料,需要的朋友可以参考下
    2023-02-02
  • SSL证书部署+SpringBoot实现HTTPS安全访问的操作方法

    SSL证书部署+SpringBoot实现HTTPS安全访问的操作方法

    文章介绍了SSL和HTTPS的工作原理,包括握手阶段和安全数据传输阶段,通过模拟HTTPS请求,展示了如何生成自签名证书并配置Spring Boot应用程序以支持HTTPS,总结指出,SSL和HTTPS对于保护网络安全至关重要,感兴趣的朋友一起看看吧
    2025-02-02
  • Spring Boot面试题总结

    Spring Boot面试题总结

    这篇文章主要介绍了Spring Boot面试题总结,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 浅析JAVA_HOME,CLASSPATH和PATH的作用

    浅析JAVA_HOME,CLASSPATH和PATH的作用

    以下是对JAVA_HOME,CLASSPATH和PATH的作用进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • MyBatis参数绑定中参数名不一致导致的错误问题解决方法

    MyBatis参数绑定中参数名不一致导致的错误问题解决方法

    作为一名Java开发者,我在实际项目中曾多次遇到MyBatis参数绑定的问题,其中最常见的一种情况是MyBatis参数绑定中参数名不一致导致的错误,这类问题看似简单,但若不深入理解MyBatis的参数绑定机制,极易陷入误区,本文将带大家一起探讨解决方案,需要的朋友可以参考下
    2025-06-06
  • 解析Java线程同步锁的选择方法

    解析Java线程同步锁的选择方法

    本篇文章是对Java线程同步锁的选择方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论