Mybatis-plus做分页和联表查询

发布时间 2023-05-28 22:24:59作者: 与f

示例

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

注: 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<AboutusHomepage> page = new Page<>(pageNo, pageSize);
 
        //用QueryWrapper做条件查询
        QueryWrapper<AboutusHomepage> 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<AboutusHomepage> 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   继承自mybatisPlus自带的IService类.

public interface IAboutusHomepageService extends IService<AboutusHomepage> {
 
}

3.SerivceImpl   继承自MybatisPlus提供的ServiceImpl.

@Service
public class AboutusHomepageServiceImpl extends ServiceImpl<AboutusHomepageMapper, AboutusHomepage> implements IAboutusHomepageService {
}

4. Dao层   继承自mybatisPlus自带的BaseMapper类. 

public interface AboutusHomepageMapper extends BaseMapper<AboutusHomepage> {
 
}

 

分页查询的几种方式

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

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

 

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

ServiceImpl中:

 Mapper中创建newPage方法:

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

 

 

联表查询

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

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

 

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;
 
/**
 * <p>
 * 视频表
 * </p>
 *
 * @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;
 
 
}

最后是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;
 
/**
 * <p>
 * 视频表 Mapper 接口
 * </p>
 *
 * @author 申劭明
 * @since 2020-05-06
 */
public interface VideoMapper extends BaseMapper<Video> {
 
 
    List<Video> page(@Param("page") IPage<Video> page, 
                     @Param(Constants.WRAPPER) Wrapper<Video> queryWrapper);
}
<select id="page" resultType="com.mbyte.easy.video.entity.Video">
    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
    <!-- 省略条件sql语句 -->
    ${ew.customSqlSegment}
 </select>

 

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

 

 

转: https://blog.csdn.net/shenshaoming/article/details/104342373