Springboot 注解方式下mybatis分页,动态sql
背景:在开发restful API 接口时,考虑结果太多,引入分页。有时筛选条件有好几个,但访问的是同一个数据库,筛选的有无影响结果,不想为每个条件开发单独接口,此时动态sql派上用场。本帖子涉及分页(使用插件PageHelper),动态sql
1. spring的配置文件中配上PageHelper相关属性,如下
#pagehelper分页插件 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql pagehelper.row-bounds-with-count=true pageSizeZero=true
2. 加入依赖 pom
<!-- 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency>
3.单独编写 mapper 接口,和其他mapper分离,后面需要编写实现类。
// LogMetaAndLogDetailListRequest 请求参数,自行设计修改
@Mapper
@Repository
public interface PageMapper {
@Select("<script>"
+ "SELECT * FROM dte_log_meta"
+ "<where>"
+ "<if test=request!=null and request.type != null and request.type != ""> AND type=#{request.type}</if>"
+ "<if test=request!=null and request.clusterId > 0> AND clusterId=#{request.clusterId}</if>"
+ "<if test=request!=null and request.logMetaId > 0> AND id=#{request.logMetaId}</if>"
+ "<if test=request!=null and request.operator != null and request.operator != ""> AND operator=#{request.operator}</if>"
+ "<if test=request!=null and request.frequency != null and request.frequency != ""> AND frequency=#{request.frequency}</if>"
+ "</where>"
+ "</script>")
List<LogMeta> selectAllWithPageFromLogMeta(
@Param("request") LogMetaAndLogDetailListRequest request);
}
动态sql必须包含在<script>标签下,if test用于测试条件,判空串时需使用 "" 注意and大小写
3. 编写类实现mapper接口
@Service
public class PageMapperService {
@Autowired private PageMapper pageMapper;
public List<LogMeta> selectAllWithPageFromLogMeta(LogMetaAndLogDetailListRequest request) {
PageHelper.startPage(request.getPageNum(), request.getPageSize());
return pageMapper.selectAllWithPageFromLogMeta(request);
}
}
只需调用 startPage方法,设置页和页大小
4. api接口方法
// LogMeta 数据库相对的 POJO 类
@RestController
@CrossOrigin
@RequestMapping("/api")
public class APIController {
// ...
@Autowired private PageMapperService pageMapperService;
@ApiOperation(value = "数据源及任务信息")
@ApiImplicitParam(
name = "request",
value = "参数",
required = true,
dataType = "LogMetaAndLogDetailListRequest")
@RequestMapping(value = "/dte/list/logMetaAndLogDetails", method = equestMethod.POST, produces = {"application/json;charset=UTF-8"})
public ResponseEntity<LogMetaAndLogDetailListResponse> listLogMetaAndLogDetails(
@RequestBody LogMetaAndLogDetailListRequest request) {
List<LogMeta> logMetaList = pageMapperService.selectAllWithPageFromLogMeta(request);
}
// ...
}
至此,大功告成。实际中,可能会因为各自使用的 springboot,mybatis版本不同有差异
参考文献
