目录
前言
示例
分页查询的几种方式
联表查询
在 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方法:
通过入参中包含一个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;
/**
*
* 视频表
*
*
* @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 {
List page(@Param("page") IPage page,
@Param(Constants.WRAPPER) Wrapper queryWrapper);
}
其中省略条件sql语句一行如果看不明白的话,可以看我的另一篇博客,教你怎么省略条件查询语句:https://blog.csdn.net/shenshaoming/article/details/101099246。
至此大功告成。