示例
首先先从代码上看一下我在框架中是如何使用的分页:
注: 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
标签:private,page,video,联表,import,Mybatis,plus,type,id From: https://www.cnblogs.com/fps2tao/p/17438999.html