首页 > 编程语言 >Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联查询

Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联查询

时间:2023-05-28 20:46:16浏览次数:73  
标签:queryWrapper 插件 多表 String 自定义 title private Long id

 

Vo:

/**
 * 用来返回给前端展示列表的数据实体
 */
@Data
public class CourseVo implements Serializable {

    private static final long serialVersionUID = 1L;
    private String id;
    private String title;
    private String subjectParentTitle;
    private String subjectTitle;
    private String teacherName;
    private Integer lessonNum;
    private String price;
    private String cover;
    private Long buyCount;
    private Long viewCount;
    private String status;
    private String gmtCreate;
}
/**
 * 专门用来接受课程列表查询参数的实体
 */
@Data
public class CourseQueryVo implements Serializable {

    private static final long serialVersionUID = 1L;

    private String title;
    private String teacherId;
    private String subjectParentId;
    private String subjectId;
}

Controller:

 public R index(
            @ApiParam(value = "当前页码", required = true)
            @PathVariable Long page,

            @ApiParam(value = "每页记录数", required = true)
            @PathVariable Long limit,

            @ApiParam(value = "查询对象")
                    CourseQueryVo courseQueryVo){

        IPage<CourseVo> pageModel = courseService.selectPage(page, limit, courseQueryVo);
        List<CourseVo> records = pageModel.getRecords();
        long total = pageModel.getTotal();
        return  R.ok().data("total", total).data("rows", records);
    }

Service:

IPage<CourseVo> selectPage(Long page, Long limit, CourseQueryVo courseQueryVo);
 public IPage<CourseVo> selectPage(Long page, Long limit, CourseQueryVo courseQueryVo) {
        QueryWrapper<CourseVo> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("c.gmt_create");

        String title = courseQueryVo.getTitle();
        String teacherId = courseQueryVo.getTeacherId();
        String subjectParentId = courseQueryVo.getSubjectParentId();
        String subjectId = courseQueryVo.getSubjectId();

        if (!StringUtils.isEmpty(title)) {
            queryWrapper.like("c.title", title);
        }

        if (!StringUtils.isEmpty(teacherId) ) {
            queryWrapper.eq("c.teacher_id", teacherId);
        }

        if (!StringUtils.isEmpty(subjectParentId)) {
            queryWrapper.eq("c.subject_parent_id", subjectParentId);
        }

        if (!StringUtils.isEmpty(subjectId)) {
            queryWrapper.eq("c.subject_id", subjectId);
        }

        Page<CourseVo> pageParam = new Page<>(page, limit);
        //放入分页参数和查询条件参数,mp会自动组装
        List<CourseVo> records = baseMapper.selectPageByCourseQueryVo(pageParam, queryWrapper);
        pageParam.setRecords(records);
        return pageParam;
    }

Mapper:

List<CourseVo> selectPageByCourseQueryVo(//mp会自动组装分页参数
                                             Page<CourseVo> pageParam,
                                             //mp会自动组装queryWrapper:
                                             //@Param(Constants.WRAPPER) 和 xml文件中的 ${ew.customSqlSegment} 对应
                                             @Param(Constants.WRAPPER) QueryWrapper<CourseVo> queryWrapper);

Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.guli.service.edu.mapper.CourseMapper">
    <sql id="columns">
     c.id,
     c.title,
     c.lesson_num AS lessonNum,
     CONVERT(c.price, DECIMAL(8,2)) AS price,
     c.cover,
     c.buy_count AS buyCount,
     c.view_count AS viewCount,
     c.status,
     c.gmt_create AS gmtCreate,
     t.name AS teacherName,
     s1.title AS subjectParentTitle,
     s2.title AS subjectTitle
    </sql>

    <sql id="tables">
        edu_course c
        LEFT JOIN edu_teacher t ON c.teacher_id = t.id
        LEFT JOIN edu_subject s1 ON c.subject_parent_id = s1.id
        LEFT JOIN edu_subject s2 ON c.subject_id = s2.id
    </sql>

    <select id="selectPageByCourseQueryVo" resultType="com.atguigu.guli.service.edu.entity.vo.CourseVo">
        SELECT
        <include refid="columns" />
        FROM
        <include refid="tables" />
        ${ew.customSqlSegment}
    </select>
</mapper>

重点:
MybatisPlus会将查询参数构成的条件和分页的page及limit自动组装到Sql中
以后进行多表联合查询时,可以使用以下方法来进行数据的查找与筛选
自动组装需要搭配:

 

@Param(Constants.WRAPPER) 放置于Mapper层接口的查询参数前,详细见上面代码例子

${ew.customSqlSegment} 将此行代码放置于Mapper文件的语句中,MybatisPlus将会为我们自动将 @Param(Constants.WRAPPER) 注解后的查询参数自动组装到Sql中

 

 

 

 

 

 

 

 

 

转 : https://blog.csdn.net/StartedatAOP/article/details/109645540

标签:queryWrapper,插件,多表,String,自定义,title,private,Long,id
From: https://www.cnblogs.com/fps2tao/p/17438812.html

相关文章

  • Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询
     一、引言MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么今天说说MP怎么自定义sql语句吧。 二、具体实现使用注解实现:在我们Mapper接口中定义自定义方法即可。/***@Date:2019/6/1014:40*@Description</span>:User对象持久层*/p......
  • django多表关联实战
    定义模型类:fromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportUser'''----------Django-ORM多表关联----------''''''需要创建的表:1.书籍表2.出版社表3.作者表4.作者详情表'''�......
  • 普加项目管理中间件示例之三:自定义单元格样式,行样式,以及单元格内容
    通过监听处理"drawcell"事件,可以根据任务信息,设置行、单元格样式,以及自定义单元格Html内容。参考示例demo/DiyDisplay.html。代码如下:project.on("drawcell",function(e){vartask=e.record,column=e.column,field=e.field;//单元格样式if(column.name......
  • 普加项目管理中间件示例之四:自定义单元格可编辑
    通过监听处理"cellbeginedit"事件,可以控制每个行、每个单元格是否可编辑。参考示例:demo/DiyEditable.html代码如下://控制单元格是否可编辑project.on("cellbeginedit",function(e){vartask=e.record,column=e.column,field=e.field;//控制行,摘要任务不可编辑if......
  • 普加项目管理中间件示例之五:自定义条形图外观和提示信息
    可以通过监听drawitem事件来控制右侧条形图的html外观,达到任意的条形图效果。示例地址:demo/DiyDisplayGantt.html代码如下://1)自定义条形图外观显示project.on("drawitem",function(e){varitem=e.item;varleft=e.itemBox.left,top=e.itemBox.top,......
  • 普加项目管理中间件示例之六:自定义右键菜单
    弹出右键菜单时,根据当前选择的行,显示隐藏、启用禁用菜单项。示例地址:demo/DiyMenu.html代码如下://右键菜单弹出varmenu=newProjectMenu();project.setContextMenu(menu);menu.edit.on("click",function(e){ShowTaskWindow(project);});//监听菜单的opening事件,此......
  • FreeSWITCH添加自定义endpoint
    操作系统:CentOS7.6_x64   FreeSWITCH版本:1.10.9 日常开发过程中会遇到需要扩展FreeSWITCH对接其它系统的情况,这里记录下编写FreeSWITCH自定义endpoint的过程。一、模块定义函数使用FreeSWITCH自带的框架来定义模块函数,函数指针及参数列表定义如下(src/include/switc......
  • django中的多表关联
    一、三种关联情况 二、ORM的正向操作和反向操作1.正向操作:一个模型中定义了一个外键,通过该模型对该外键操作的操作叫做正向操作。2.反向操作:被外键所关联的模型,通过该模型对外键所在模型的操作叫做反向操作。  -------------------  关联表的详细使用方式,引用:“ ......
  • wordpress插件:用WP Media Category Management管理媒体库分类
    一,安装插件:搜索WPMediaCategoryManagement点击立即安装 安装完成后,点击启用点击启用后页面会报错,忽略它返回前一个页面,点这里:提示要自动更新,跳过,也可选允许并继续按默认设置,点SaveSettings二,应用插件:1,添加分类2,修改图片所属分类3,从媒体库选择时:......
  • QT显示插件(LinuxFB)及其依赖的驱动(DRM/framebuffer)记录
    关键词:Framebuffer、linuxfb、DRM等等。 QT在Linux中支持多种显示插件,包括EGLFS、LinuxFB、DirectFB、Wayland等。可以通过--platfrom选项指定选择何种插件。比如:./analogclock--platformlinuxfb。QT支持多种显示插件,显示插件打开Linux内核fb设备,Linux内核中GPU/Display驱动......