利用Mybatis-Plus进行分页操作后出现数据失效如何解决
创始人
2024-11-21 03:23:10
0次

解决方法

//从数据库获得的Users分页列表
//当我们打印users时,会发现打印出来的数据除了列表数据还有分页属性
List users = this.list();
//操作users获得的需要的列表
List userVos = this.list2(users);
//创建User的info类,此时page中的属性已生成
PageInfo userPage = new PageInfo<>(users);
//创建UserVo的info类
PageInfo userVoPage= new PageInfo<>(userVos );
//将userPage中除看list外的其他属性复制到userVoPage中
PageInfoUtil pageInfoUtil = new PageInfoUtil();
pageInfo = pageInfoUtil.getPageVo(userPage ,userVoPage);
pageInfoUtil
public class PageInfoUtil {
 public PageInfo getPageVo(PageInfo pageInfoPo,PageInfo pageInfoVo){
  pageInfoVo.setTotal(pageInfoPo.getTotal());
  pageInfoVo.setEndRow(pageInfoPo.getEndRow());
  pageInfoVo.setHasNextPage(pageInfoPo.isHasNextPage());
  pageInfoVo.setHasPreviousPage(pageInfoPo.isHasPreviousPage());
  pageInfoVo.setIsFirstPage(pageInfoPo.isIsFirstPage());
  pageInfoVo.setIsLastPage(pageInfoPo.isIsLastPage());
  pageInfoVo.setNavigateFirstPage(pageInfoPo.getNavigateFirstPage());
  pageInfoVo.setNavigateLastPage(pageInfoPo.getNavigateLastPage());
  pageInfoVo.setNavigatePages(pageInfoPo.getNavigatePages());
  pageInfoVo.setNavigatepageNums(pageInfoPo.getNavigatepageNums());
  pageInfoVo.setNextPage(pageInfoPo.getNextPage());
  pageInfoVo.setPageNum(pageInfoPo.getPageNum());
  pageInfoVo.setPages(pageInfoPo.getPages());
  pageInfoVo.setPageSize(pageInfoPo.getPageSize());
  pageInfoVo.setPrePage(pageInfoPo.getPrePage());
  pageInfoVo.setSize(pageInfoPo.getSize());
  pageInfoVo.setStartRow(pageInfoPo.getStartRow());
  pageInfoVo.setFirstPage(pageInfoPo.getFirstPage());
  pageInfoVo.setLastPage(pageInfoPo.getLastPage());
  return pageInfoVo;
 }
}

End

想使用秀一点的方法,结果能力有限,没有成功,只能使用这种笨方法,如果有更好的方法,欢迎各位指导。

补充知识:mybatis-plus分页无效, total=0问题(springmvc)

前言

项目中(springmvc)分页采用mybatis-plus, 头一回用, 就遇到了如题问题

pom.xml


 com.baomidou
 mybatis-plus
 3.2.0

mapper继承了BaseMapper

@Repository
public interface UserMapper extends BaseMapper{
  // 这里代码没用, 查询采用的BaseMapper中的 IPage selectPage(IPage page, @Param("ew") Wrapper queryWrapper);
}

service层

 @Override
 public SysUserVo list(UserQo qo) {
  QueryWrapper queryWrapper = new QueryWrapper<>();
  queryWrapper.like("name", qo.getKeyword())
    .or().
    like("code", qo.getKeyword());
  Page page = new Page<>(qo.getPageNo(), qo.getPageSize());
  IPage userPoIPage = userMapper.selectPage(page, queryWrapper);
  List records = userPoIPage.getRecords();
  long total = userPoIPage.getTotal();// 总记录数
  long pages = userPoIPage.getPages();// 查询结果数
  long pageNo = userPoIPage.getCurrent();// 当前页
  long pageSize = userPoIPage.getSize();// 每页条数
  List userVos = Lists.newArrayList();
  for (UserPo userPo : records) {
   Integer userId = userPo.getId();
   List roles = userMapper.selectRoles(userId);
   UserVo userVo = UserVo.builder().code(userPo.getCode())
     .name(userPo.getName())
     .rolePo(roles)
     .status(userPo.getStatus())
     .build();
   userVos.add(userVo);
  }
  SysUserVo sysUserVo = SysUserVo.builder()
    .list(userVos)
    .total(total)
    .build();
  return sysUserVo;
 }

结果分页并没有生效, 于是添加拦截器

package com.cebbank.api.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@MapperScan("com.cebbank.api.mapper")
public class MybatisPlusConfig {
 @Bean
 public PaginationInterceptor paginationInterceptor() {
  PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
  paginationInterceptor.setOverflow(true);
  // 设置最大单页限制数量,默认 500 条,-1 不受限制
  paginationInterceptor.setLimit(100);
  // 开启 count 的 join 优化,只针对部分 left join
  paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
  paginationInterceptor.setDialectType("mysql");
  return paginationInterceptor;
 }
}

还是没生效

最后找到解决方案, 在数据源配置中显式添加分页插件

 @Bean
 public SqlSessionFactory sqlSessionFactory() throws Exception {
  MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
  sqlSessionFactoryBean.setDataSource(dataSource());
  MybatisConfiguration configuration = new MybatisConfiguration();
  configuration.setMapUnderscoreToCamelCase(true);
  configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
  sqlSessionFactoryBean.setConfiguration(configuration);
//  sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations());
  sqlSessionFactoryBean.setPlugins(new Interceptor[]{new PaginationInterceptor()});

  return sqlSessionFactoryBean.getObject();
 }

完整配置

package com.cebbank.api.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


/**
 * @author linyong
 * @date 2020/7/30 16:38
 * @description 数据源配置
 **/
@Configuration
@EnableAspectJAutoProxy
@MapperScan("com.cebbank.api.mapper")
public class DBConfig {

 @Value("${spring.datasource.url}")
 private String url;

 @Value("${spring.datasource.driver-class-name}")
 private String driverClassName;

 @Value("${spring.datasource.username}")
 private String username;

 @Value("${spring.datasource.password}")
 private String password;

 @Value("${spring.datasource.initialSize:5}")
 private Integer initialSize;

 @Value("${spring.datasource.maxActive:50}")
 private Integer maxActive;

 @Value("${spring.datasource.maxWait:60000}")
 private Integer maxWait;

 @Value("${spring.datasource.minIdle:5}")
 private Integer minIdle;

 @Value("${spring.datasource.testWhileIdle:true}")
 private Boolean testWhileIdle;

 @Value("${spring.datasource.testOnBorrow:true}")
 private Boolean testOnBorrow;

 @Value("${spring.datasource.testOnReturn:true}")
 private Boolean testOnReturn;

 @Value("${spring.datasource.validationQuery:select 1}")
 private String validationQuery;

// @Value("${mybatis.mapper-locations}")
// private String mapperLocations;


 @Bean
 public DataSource dataSource(){
  DruidDataSource druidDataSource = new DruidDataSource();
  druidDataSource.setUrl(url);
  druidDataSource.setDriverClassName(driverClassName);
  druidDataSource.setUsername(username);
  druidDataSource.setPassword(password);
  druidDataSource.setInitialSize(initialSize);
  druidDataSource.setMaxActive(maxActive);
  druidDataSource.setMaxWait(maxWait);
  druidDataSource.setMinIdle(minIdle);
  druidDataSource.setTestWhileIdle(testWhileIdle);
  druidDataSource.setTestOnBorrow(testOnBorrow);
  druidDataSource.setTestOnReturn(testOnReturn);
  druidDataSource.setValidationQuery(validationQuery);
  return druidDataSource;
 }

// private Resource[] resolveMapperLocations() {
//  ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
//  String[] arr = mapperLocations.split(",");
//  List locations = Arrays.asList(arr);
//  List resources = new ArrayList();
//  if (locations != null) {
//   for (String mapperLocation : locations) {
//    try {
//     Resource[] mappers = resourceResolver.getResources(mapperLocation);
//     resources.addAll(Arrays.asList(mappers));
//    } catch (IOException e) {
//     // ignore
//    }
//   }
//  }
//  return resources.toArray(new Resource[resources.size()]);
// }

 @Bean
 public SqlSessionFactory sqlSessionFactory() throws Exception {
  MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
  sqlSessionFactoryBean.setDataSource(dataSource());
  MybatisConfiguration configuration = new MybatisConfiguration();
  configuration.setMapUnderscoreToCamelCase(true);
  configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
  sqlSessionFactoryBean.setConfiguration(configuration);
//  sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations());
  sqlSessionFactoryBean.setPlugins(new Interceptor[]{new PaginationInterceptor()});

  return sqlSessionFactoryBean.getObject();
 }


 @Bean
 public DataSourceTransactionManager transactionManager(){
  DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
  transactionManager.setDataSource(dataSource());
  return transactionManager;
 }

}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...