解決Mybatis-Plus操作分頁後資料失效問題
阿新 • • 發佈:2020-12-01
業務場景
我們知道在使用PageHelper分頁外掛時,會對執行PageHelper.startPage(pageNum,pageSize);方法後的第一條查詢語句進行分頁操作。在開發中總會遇到這樣的業務情景,在進行分頁查詢後,需要對獲得的列表資料包裝成另一種型別,此時需要對新型別的列表進行分頁,然而由於PageInfo<T>因為泛型的原因,導致處理後的列表不能加入到該類中。
如,我在資料庫分頁後查詢到的類為PageInfo<User>,此時改類中的list屬性為User,在當前的業務場景下,我需要將User型別替換為UserVo型別。
當我們對list屬性進行操作時,會同時導致PageInfo類中的其他屬性發生改變,如total等。
解決方法
//從資料庫獲得的Users分頁列表 //當我們列印users時,會發現打印出來的資料除了列表資料還有分頁屬性 List<User> users = this.list(); //操作users獲得的需要的列表 List<UserVo> userVos = this.list2(users); //建立User的info類,此時page中的屬性已生成 PageInfo<User> userPage = new PageInfo<>(users); //建立UserVo的info類 PageInfo<UserVo> 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
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.2.0</version> </dependency>
mapper繼承了BaseMapper
@Repository public interface UserMapper extends BaseMapper<UserPo>{ // 這裡程式碼沒用,查詢採用的BaseMapper中的 IPage<T> selectPage(IPage<T> page,@Param("ew") Wrapper<T> queryWrapper); }
service層
@Override public SysUserVo list(UserQo qo) { QueryWrapper<UserPo> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name",qo.getKeyword()) .or(). like("code",qo.getKeyword()); Page<UserPo> page = new Page<>(qo.getPageNo(),qo.getPageSize()); IPage<UserPo> userPoIPage = userMapper.selectPage(page,queryWrapper); List<UserPo> records = userPoIPage.getRecords(); long total = userPoIPage.getTotal();// 總記錄數 long pages = userPoIPage.getPages();// 查詢結果數 long pageNo = userPoIPage.getCurrent();// 當前頁 long pageSize = userPoIPage.getSize();// 每頁條數 List<UserVo> userVos = Lists.newArrayList(); for (UserPo userPo : records) { Integer userId = userPo.getId(); List<RolePo> 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<String> locations = Arrays.asList(arr); // List<Resource> 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; } }
問題解決!
以上這篇解決Mybatis-Plus操作分頁後資料失效問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。