文章目录
MyBatis的Mapper接口以及Example的实例函数及详解------条件查询参考博文
拦截器实现分页
Spring boot中利用PageHelper实现分页
1.参数和返回值
1.1参数:int page:当前页,int rows:每页的大小。
1.2响应:int total:总条数。List items:当前页的数据。
@Data
@ToString
public class QueryResult<T> {
//数据列表
private List<T> list;
//数据总数
private long total;
}
2.实现分页的方法
使用SQL语句。
1.起始条目索引从0开始
2.limit子句放在查询语句的最后
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page
2.1SpringBoot+Mybatis+PageHelper–数据库:Mysql
原理:在调用dao的service方法中设置分页参数:PageHelper.startPage(page, size),分页参数会设置在ThreadLocal中PageHelper在mybatis执行sql前进行拦截,从ThreadLocal取出分页参数,修改当前执行的sql语句,添加分页sql。
2.1.1添加依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper‐spring‐boot‐starter</artifactId>
<version>1.2.4</version>
</dependency>
2.1.2配置pageHelper
在application.yml中配置pageHelper操作的数据库类型:
pagehelper:
helper‐dialect: mysql
2.1.3PageHelper测试
(1)定义mapper 接口
@Mapper
public interface CourseMapper {
CourseBase findCourseBaseById(String id);
Page<CourseInfo> findCourseListPage(CourseListRequest courseListRequest);
}
(2)定义mapper.xml映射文件
<select id="findCourseListPage" resultType="com.xuecheng.framework.domain.course.ext.CourseInfo"
parameterType="com.xuecheng.framework.domain.course.request.CourseListRequest">
SELECT
course_base.*,
(SELECT pic FROM course_pic WHERE courseid = course_base.id) pic
FROM
course_base
</select>
(3)测试DAo
//测试分页
@Test
public void testPageHelper(){
PageHelper.startPage(1, 10);//查询第一页,每页显示10条记录
CourseListRequest courseListRequest = new CourseListRequest();
Page<CourseInfo> courseListPage = courseMapper.findCourseListPage(courseListRequest);
List<CourseInfo> result = courseListPage.getResult();
System.out.println(courseListPage);
}
测试前修改日志级别为debug,并跟踪运行日志,发现sql语句中已经包括分页语句.如下图;
2.2Spring Data Mongodb–数据库MongoDB
2.2.1创建Dao
public interface CmsPageRepository extends MongoRepository<CmsPage,String> {
}
2.2.2分页查询
//分页测试
@Test
public void testFindPage() {
int page = 0;//从0开始
int size = 10;//每页记录数
Pageable pageable = PageRequest.of(page,size);
Page<CmsPage> all = cmsPageRepository.findAll(pageable);
System.out.println(all);
}
2.3:学成中多个查询条件的联合分页查询-MongoDb数据库
注意事项:在分页条件判断的时候,后面一定要加page =page-1 ;因为前端page的起始值为1,后端的默认起始值是0。所以这里需要进行一个转换
不然会出现下面的错误:
1.先建立条件值对象
2.确定条件匹配器
3.建立关联
4.进行查询
@Service
public class MediaFileService {
@Autowired
MediaFileRepository mediaFileRepository;
//查询我的媒资列表
public QueryResponseResult<MediaFile> findList(int page, int size, QueryMediaFileRequest queryMediaFileRequest) {
if(queryMediaFileRequest==null){
queryMediaFileRequest = new QueryMediaFileRequest();
}
//1.条件值对象
MediaFile mediaFile = new MediaFile();
if(StringUtils.isNotEmpty(queryMediaFileRequest.getTag())){
mediaFile.setTag(queryMediaFileRequest.getTag());
}
if(StringUtils.isNotEmpty(queryMediaFileRequest.getFileOriginalName())){
mediaFile.setFileOriginalName(queryMediaFileRequest.getFileOriginalName());
}
if(StringUtils.isNotEmpty(queryMediaFileRequest.getProcessStatus())){
mediaFile.setProcessStatus(queryMediaFileRequest.getProcessStatus());
}
//2.条件匹配器
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withMatcher("tag",ExampleMatcher.GenericPropertyMatchers.contains())
.withMatcher("fileOriginalName",ExampleMatcher.GenericPropertyMatchers.contains());
// .withMatcher("processStatus",ExampleMatcher.GenericPropertyMatchers.exact());//如果不设置匹配器默认精确匹配
//3.定义example条件对象
Example<MediaFile> example = Example.of(mediaFile, exampleMatcher);
if(page<=0){
page=1;
}
page = page-1;
if(size<=0){
size=10;
}
Pageable pageable = PageRequest.of(page,size);
//4.分页查询
Page<MediaFile> all = mediaFileRepository.findAll(example, pageable);
//总记录数
long total = all.getTotalElements();
//数据列表
List<MediaFile> content = all.getContent();
//返回的数据集
QueryResult<MediaFile> queryResult = new QueryResult<>();
queryResult.setList(content);
queryResult.setTotal(total);
//返回结果
QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
}
其中
@Data
public class QueryMediaFileRequest extends RequestData {
private String fileOriginalName;
private String processStatus;
private String tag;
}
2.4 实习中的Springboot+ MyBatisPlus
配置
创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。
/**
* @Auther: IT贱男
* @Date: 2019/6/12 15:06
* @Description: MybatisPlus配置类
*/
@Configuration
public class MyBatisPlusConfig {
/**
* 分页插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
1.接口
Page<JmxCaseInfoEntity> getJmxCaseList(Integer pageNum, Integer pageSize, JmxCaseInfoEntity jmxCaseInfoEntity);
2.Service
@Override
public Page<JmxCaseInfoEntity> getJmxCaseList(Integer pageNum, Integer pageSize, JmxCaseInfoEntity jmxCaseInfoEntity) {
Page<JmxCaseInfoEntity> page = new Page<>(pageNum, pageSize);
List<JmxCaseInfoEntity> jmxInfoEntities = this.baseMapper.selectJmxCaseListPage(page, jmxCaseInfoEntity);
return page.setRecords(jmxInfoEntities);
}
3.Controller
public RestResult getJmxCaseList(Integer pageNum, Integer pageSize, JmxCaseInfoEntity jmxCaseInfoEntity) {
return RestResult.fromData(jmxCaseService.getJmxCaseList(pageNum, pageSize, jmxCaseInfoEntity));
}
4.对应的Mapper
@Mapper
public interface JmxCaseDao extends BaseMapper<JmxCaseInfoEntity> {
/**
* 分页查询jmx case 列表
*
* @param page
* @param jmxCaseInfoEntity
* @return
*/
List<JmxCaseInfoEntity> selectJmxCaseListPage(@Param("page") Page<JmxCaseInfoEntity> page, @Param("jmxCaseInfoEntity") JmxCaseInfoEntity jmxCaseInfoEntity);
}