依赖方面使用的是baomidou的mp插件
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
因为业务需要,遂寻找mybatis-plus下自定义分页方法的编写。下面是查询返回的类的对象信息,简单说就是双表联查综合得到的信息。
@Data
public class BookBorrowLogQueryVo {
/**
* 借阅id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 书籍id
*/
@ApiModelProperty(value = "借阅书籍的ID")
@TableField("book_ID")
private Long bookId;
@ApiModelProperty(value = "借阅书籍名")
@TableField("book_name")
private String bookName;
/**
* 借阅人姓名
*/
@ApiModelProperty(value = "读者姓名")
@TableField("reader_name")
private String readerName;
/**
* 借阅人电话
*/
@ApiModelProperty(value = "读者电话")
@TableField("reader_phone")
private String readerPhone;
/**
* 借阅人科室
*/
@ApiModelProperty(value = "读者科室")
@TableField("reader_dept")
private String readerDept;
/**
* 还书日期
*/
@ApiModelProperty(value = "还书日期")
@TableField("return_time")
private LocalDateTime returnTime;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
//位置
private String position;
private String total;
}
controller的书写方式,主要是Page对象的泛型要写查询对应返回的实际对象类型,wrapper的泛型只要是条件对应的那张表明即可。
@ApiOperation("条件查询分页")
@GetMapping("{page}/{limit}")
public Result pageQueryRole(@PathVariable Long page, @PathVariable Long limit, BorrowLogQueryVo borrowLogQueryVo) {
Page<BookBorrowLogQueryVo> borrowLogPage = new Page<>(page, limit);
LambdaQueryWrapper<BookBorrowLog> wrapper = new LambdaQueryWrapper();
//是否传入借阅人姓名
if(!StringUtils.isEmpty(borrowLogQueryVo.getReaderName())){
String readerName = borrowLogQueryVo.getReaderName();
wrapper.like(BookBorrowLog::getReaderName, readerName);
}
wrapper.eq(BookBorrowLog::getIsReturned,borrowLogQueryVo.getIsReturned());
//对借阅记录按照还书时间进行排序
wrapper.orderByAsc(BookBorrowLog::getReturnTime);
IPage<BookBorrowLogQueryVo> pageModel = borrowLogService.borrowLogVo(borrowLogPage, wrapper);
Map map=new HashMap<>();
map.put("pageModel", pageModel);
return Result.ok(map);
}
Service接口写法
IPage<BookBorrowLogQueryVo> borrowLogVo(Page<BookBorrowLogQueryVo> pageParam, LambdaQueryWrapper<BookBorrowLog> wrapper);
ServiceImpl写法,可以发现主要还是依赖了basemapper内的方法,我们进行Override
@Override
public IPage<BookBorrowLogQueryVo> borrowLogVo(Page<BookBorrowLogQueryVo> pageParam, LambdaQueryWrapper<BookBorrowLog> wrapper) {
IPage<BookBorrowLogQueryVo> page = baseMapper.borrowLogVo(pageParam, wrapper);
return page;
}
Mapper类的写法需要注意了,一是在wrapper参数前加上,@Param(Constants.WRAPPER)注解。二是在sql语句块内书写查询条件的地方加上 e w . c u s t o m S q l S e g m e n t 注解,这样才能把我们实现定义的查询条件在程序执行的时候带入查询。还有一点需要注意 {ew.customSqlSegment} 注解,这样才能把我们实现定义的查询条件在程序执行的时候带入查询。还有一点需要注意 ew.customSqlSegment注解,这样才能把我们实现定义的查询条件在程序执行的时候带入查询。还有一点需要注意{ew.customSqlSegment},我这里用的是$而不是#,因为如果是#{参数名}的方式,编译出来会变成"内容",会带上双引号,这样就不对了。
@Select("SELECT a.*,b.position from book_borrow_log a inner join book b on a.book_ID = b.id ${ew.customSqlSegment} ")
IPage<BookBorrowLogQueryVo> borrowLogVo(Page<BookBorrowLogQueryVo> pageParam,@Param(Constants.WRAPPER) LambdaQueryWrapper<BookBorrowLog> wrapper);