解决Mybatis-Plus操作分页后数据失效问题
作者:李金泉 发布时间:2023-11-25 11:31:55
标签:Mybatis-Plus,分页,数据
业务场景
我们知道在使用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;
}
}
问题解决!
来源:https://blog.csdn.net/Acceleactor/article/details/88237620
0
投稿
猜你喜欢
- 一、简介在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,
- SharedPreferences介绍:SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置
- 本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参考,对于Join的用法说明如下:语法:publ
- 前言直接使用项目或直接复制libs中的so库到项目中即可(当前只构建了armeabi),需要其他ABI可检下项目另外使用CMake构建即可。
- 小编对微信开发颇感兴趣,查阅了网上相关文章进行整理,方便大家一起学习。1、注册帐号--填写服务器配置在https://mp.weixin.q
- /** * 冒泡排序估计是每本算法书籍都会提到的排序方法。 * 它的基本思路是对长度为N的序列,用N趟来将其排成有序序列。 * 第1趟
- Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型。Java中的基本数据类型名称大小取值范围byte型 (字节)8bit-12
- 在上篇文章给大家介绍了使用XSD校验Mybatis的SqlMapper配置文件的方法(1),需要的朋友可以参考下。编写好XSD文件,然后来看
- 本文实例讲述了JAVA中AES加密方法。分享给大家供大家参考。具体如下:java代码:KeyGenerator kg = KeyGenera
- 一、代码先上代码(以下这段代码会有多种执行结果)@Testpublic void test_interrupted_thread() thr
- 一、回传协议接口和TCP方式实现:1.接口:import java.nio.channels.SelectionKey; import ja
- 此处项目环境为简单的springboot+mybatis环境。可查看到上一篇文章搭建的简单springboot+mybatis的项目想要控制
- WPF 实现筛选下拉多选控件框架使用.NET4 至 .NET6;Visual Studio 2022;创建 MultiSelect
- 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过注解@PostConstruct 和 @
- OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截
- 本文中所有效果通过ItemDecoration实现,通过此实现的可以与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性u
- 使用淘宝ip地址库的api查询ip地址信息。TaobaoIPHelper.csusing System;using System.Coll
- 创建一个列表消息卡片到目前为止,我们只有一个消息的卡片,看上去有点单调,所以让我们来改善它,让它拥有多条信息。我们需要创建一个能够显示多条消
- springboot aop里的@Pointcut()的配置@Pointcut("execution(public * com.w
- 项目里头需要做一个判断用户输入的号码是否是正确的手机号码,正确的手机号码应该是11位的,这里我们需要用一个正则表达式来进行判断,