Mybatis-plus做分页和联表查询

目录

前言

示例

分页查询的几种方式

联表查询


前言

在 Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询及分页IPage使用 一文中,我本来是用的别人写的Mybatis Plus分页,不过现在链接失效了,所以就决定自己写一下了.

以下均是在SpringBoot项目中使用MybatisPlus的示例.

另外有人指出没有联表查询,所以更新一下补充上去。

示例

首先先从代码上看一下我在框架中是如何使用的分页:

注: AboutusHomepage是实体类

1.Controller:

    @RequestMapping
    public String index(@RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo,
                        @RequestParam(value = "pageSize", required = false, defaultValue = "20") Integer pageSize,
                        Model model, String updatetimeSpace, AboutusHomepage aboutusHomepage) {
        Page page = new Page<>(pageNo, pageSize);

        //用QueryWrapper做条件查询
        QueryWrapper queryWrapper = new QueryWrapper<>();
        if(!ObjectUtils.isEmpty(aboutusHomepage.getTitle())) {
            queryWrapper = queryWrapper.like("title",aboutusHomepage.getTitle());
         }
        if(!ObjectUtils.isEmpty(aboutusHomepage.getBackgroundPicture())) {
            queryWrapper = queryWrapper.like("background_picture",aboutusHomepage.getBackgroundPicture());
         }
        //使用MybatisPlus自带的page方法做有条件的分页查询
        IPage pageInfo = aboutusHomepageService.page(page, queryWrapper);
        model.addAttribute("updatetimeSpace", updatetimeSpace);
        model.addAttribute("searchInfo", aboutusHomepage);
        model.addAttribute("pageInfo", new PageInfo(pageInfo));
        return prefix+"list";
    }

Controller层接收pageNo(页码)和pageSize(页面显示数量),创建Page(com.baomidou.mybatisplus.extension.plugins.pagination.Page)对象,入参分别为pageNo和pageSize.

2.Service:

public interface IAboutusHomepageService extends IService {

}

继承自mybatisPlus自带的IService类.

3.SerivceImpl:

@Service
public class AboutusHomepageServiceImpl extends ServiceImpl implements IAboutusHomepageService {
}

继承自MybatisPlus提供的ServiceImpl.

4. Dao层

public interface AboutusHomepageMapper extends BaseMapper {

}

继承自mybatisPlus自带的BaseMapper类.

分页查询的几种方式

1.通过MybatisPlus中IService自带的方法做查询

IService中的page方法,有两个重载,分别是page(IPage)和page(IPage, Wrapper).其中,page(IPage)调用的是page(Ipage, Wrappers.emptyWrapper().

2.自己定义新的查询方法

ServiceImpl中:

Mapper中创建newPage方法:

Mybatis-plus做分页和联表查询_第1张图片

通过入参中包含一个IPage对象完成分页查询(不需要自己去写分页语句).不过需要注意的是,返回值是一个List对象,所以在ServicecImpl中要通过调用IPage的setRecords方法,将查询结果放入IPage对象中.

联表查询

MyBatisPlus的联表查询也非常方便,下面我会以一个视频表(t_video)为例,表的结构如下:

Mybatis-plus做分页和联表查询_第2张图片

其中用户id是用户表的主键,type_id是视频类型表的主键。那么这种情况下,单表查询出来的结果是两个id,显然不是我们想要的结果。所以用查询工具创建出来联表的Sql语句如下:

Mybatis-plus做分页和联表查询_第3张图片

SELECT
dict_video_type.`name` AS video_type,
t_video.id,
sys_user.nickname,
t_video.video_path,
t_video.user_id,
t_video.type_id,
t_video.create_time,
t_video.update_time,
t_video.`status`,
t_video.description
FROM
t_video
INNER JOIN sys_user ON sys_user.id = t_video.user_id
INNER JOIN dict_video_type ON t_video.type_id = dict_video_type.id

注意,对于dict_video_type(视频类型)表中的name我用了as,等到了后面就知道为啥了。

接下里是实体类,可以用VO实体或者直接在原有的实体上加属性,以下是我在实体类(Video.java)上直接添加了视频表中不存在的属性:


import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mbyte.easy.common.entity.BaseEntity;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 

* 视频表 *

* * @author 申劭明 * @since 2020-05-06 */ @Data @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) @TableName("t_video") public class Video extends BaseEntity { private static final long serialVersionUID = 1L; /** * 上传用户的id */ private Long userId; /** * 用户昵称 */ // 不太懂的可以看看TableField注解,源码里写的明明白白 @TableField(exist = false) private String nickname; /** * 视频类型id */ private Long typeId; /** * 视频类型 * 因为在类中用的是这个名字,所以我在sql语句里用了as */ @TableField(exist = false) private String videoType; /** * 上传视频路径 */ private String videoPath; /** * 创建时间 */ private LocalDateTime createTime; /** * 更新时间 */ private LocalDateTime updateTime; /** * 是否过审(0为未过审,1为过审,2为违规) */ private Integer status; /** * 视频描述 */ private String description; /** * 点击量 */ private Long pointCount; }

接下来是service,因为它原有的page方法对我而言没用了,所以我选择了重写这个方法。

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.mbyte.easy.video.entity.Video;
import com.mbyte.easy.video.mapper.VideoMapper;
import com.mbyte.easy.video.service.IVideoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * 

* 视频表 服务实现类 *

* * @author 申劭明 * @since 2020-05-06 */ @Service public class VideoServiceImpl extends ServiceImpl implements IVideoService { @Override public IPage

最后是mapper和mapper.xml:

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.mbyte.easy.video.entity.Video;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 

* 视频表 Mapper 接口 *

* * @author 申劭明 * @since 2020-05-06 */ public interface VideoMapper extends BaseMapper

其中省略条件sql语句一行如果看不明白的话,可以看我的另一篇博客,教你怎么省略条件查询语句:https://blog.csdn.net/shenshaoming/article/details/101099246。

至此大功告成。

你可能感兴趣的:(Java)