解決Mybatis-Plus操作分頁(yè)后數(shù)據(jù)失效問(wèn)題
業(yè)務(wù)場(chǎng)景
我們知道在使用PageHelper分頁(yè)插件時(shí),會(huì)對(duì)執(zhí)行PageHelper.startPage(pageNum, pageSize);方法后的第一條查詢(xún)語(yǔ)句進(jìn)行分頁(yè)操作。在開(kāi)發(fā)中總會(huì)遇到這樣的業(yè)務(wù)情景,在進(jìn)行分頁(yè)查詢(xún)后,需要對(duì)獲得的列表數(shù)據(jù)包裝成另一種類(lèi)型,此時(shí)需要對(duì)新類(lèi)型的列表進(jìn)行分頁(yè),然而由于PageInfo<T>因?yàn)榉盒偷脑?,?dǎo)致處理后的列表不能加入到該類(lèi)中。
如,我在數(shù)據(jù)庫(kù)分頁(yè)后查詢(xún)到的類(lèi)為PageInfo<User>,此時(shí)改類(lèi)中的list屬性為User,在當(dāng)前的業(yè)務(wù)場(chǎng)景下,我需要將User類(lèi)型替換為UserVo類(lèi)型。
當(dāng)我們對(duì)list屬性進(jìn)行操作時(shí),會(huì)同時(shí)導(dǎo)致PageInfo類(lèi)中的其他屬性發(fā)生改變,如total等。
解決方法
//從數(shù)據(jù)庫(kù)獲得的Users分頁(yè)列表 //當(dāng)我們打印users時(shí),會(huì)發(fā)現(xiàn)打印出來(lái)的數(shù)據(jù)除了列表數(shù)據(jù)還有分頁(yè)屬性 List<User> users = this.list(); //操作users獲得的需要的列表 List<UserVo> userVos = this.list2(users); //創(chuàng)建User的info類(lèi),此時(shí)page中的屬性已生成 PageInfo<User> userPage = new PageInfo<>(users); //創(chuàng)建UserVo的info類(lèi) PageInfo<UserVo> userVoPage= new PageInfo<>(userVos ); //將userPage中除看list外的其他屬性復(fù)制到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
想使用秀一點(diǎn)的方法,結(jié)果能力有限,沒(méi)有成功,只能使用這種笨方法,如果有更好的方法,歡迎各位指導(dǎo)。
補(bǔ)充知識(shí):mybatis-plus分頁(yè)無(wú)效, total=0問(wèn)題(springmvc)
前言
項(xiàng)目中(springmvc)分頁(yè)采用mybatis-plus, 頭一回用, 就遇到了如題問(wèn)題
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>{
// 這里代碼沒(méi)用, 查詢(xún)采用的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();// 總記錄數(shù)
long pages = userPoIPage.getPages();// 查詢(xún)結(jié)果數(shù)
long pageNo = userPoIPage.getCurrent();// 當(dāng)前頁(yè)
long pageSize = userPoIPage.getSize();// 每頁(yè)條數(shù)
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;
}
結(jié)果分頁(yè)并沒(méi)有生效, 于是添加攔截器
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();
// 設(shè)置請(qǐng)求的頁(yè)面大于最大頁(yè)后操作, true調(diào)回到首頁(yè),false 繼續(xù)請(qǐng)求 默認(rèn)false
paginationInterceptor.setOverflow(true);
// 設(shè)置最大單頁(yè)限制數(shù)量,默認(rèn) 500 條,-1 不受限制
paginationInterceptor.setLimit(100);
// 開(kāi)啟 count 的 join 優(yōu)化,只針對(duì)部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
paginationInterceptor.setDialectType("mysql");
return paginationInterceptor;
}
}
還是沒(méi)生效
最后找到解決方案, 在數(shù)據(jù)源配置中顯式添加分頁(yè)插件
@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 數(shù)據(jù)源配置
**/
@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;
}
}
問(wèn)題解決!
以上這篇解決Mybatis-Plus操作分頁(yè)后數(shù)據(jù)失效問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis批量修改時(shí)出現(xiàn)報(bào)錯(cuò)問(wèn)題解決方案
這篇文章主要介紹了Mybatis批量修改時(shí)出現(xiàn)報(bào)錯(cuò)問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Java調(diào)用明華RF讀寫(xiě)器DLL文件過(guò)程解析
這篇文章主要介紹了Java調(diào)用明華RF讀寫(xiě)器DLL文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
logback StatusListener的定義方法源碼解讀
這篇文章主要為大家介紹了logback StatusListener的定義方法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):循環(huán)鏈表和棧
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表、棧的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java數(shù)據(jù)結(jié)構(gòu)中循環(huán)鏈表、棧、的功能、定義及使用方法,需要的朋友可以參考下2021-08-08
解決spring-cloud-config 多服務(wù)共享公共配置的問(wèn)題
這篇文章主要介紹了解決spring-cloud-config 多服務(wù)共享公共配置的問(wèn)題,本文通過(guò)多種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
springboot多文件上傳實(shí)現(xiàn)使用postman測(cè)試多文件上傳接口
這篇文章主要介紹了springboot多文件上傳實(shí)現(xiàn)使用postman測(cè)試多文件上傳接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Mybatis之通用Mapper動(dòng)態(tài)表名及其原理分析
這篇文章主要介紹了Mybatis之通用Mapper動(dòng)態(tài)表名及其原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Java 使用 HttpClient 發(fā)送 GET請(qǐng)求和 POST請(qǐng)求
本文主要介紹了Java 使用 HttpClient 發(fā)送 GET請(qǐng)求和 POST請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

