使用Batis-Plus分页难道不香吗❓
🍎 题记
爱工作,爱生活,奥利给!!!
人生短短几个秋,不醉不罢休!
时间匆匆,转眼间来到了八月份,时间过的真快!!!感叹时间的流逝,也感叹自己半年多来的碌碌无为!
不知道掘友们,你们这多半年过的怎样呢?是飞黄腾达?是一马平川?还是一言难尽?还是 . . . . . .
🍏 主题
最近一直负责项目上小程序后台接口开发的工作,还要负责接口的测试和接口文档编写的工作。说的是8月15号要交工,但是由于好多资料还没准备好,导致服务器、小程序啥的都还没有申请,岂不是很牵强的,确实有点难搞呦!🐞
再者说,工作嘛?就那样,主打一个开心就好。
还是说项目吧,项目核心框架是 SpringBoot+MyBatis-Plus
,也是当下比较主流的。框架这块不做过多的描述,大家应该都是很了解的,网上的教程、资料啥的都很多。
早期的项目用的是 SSM 框架,后面转成了 Springboot+Mybatis ,最后转成了 Springboot+Mybatis-plus 。在使用过程中,添加、修改、删除直接使用了 Mybatis-plus 自带的方法,除非特殊情况。但是在查询列表分页这块还沿用之前Mybatis中的方法,需要写两个方法,一个查询数量的,一个查询列表的,开始写的时候感觉还行,越到后面感觉还是不爽,感觉还是有点麻烦。心想着还是用 Mybatis-plus 中的分页功能吧,肯定会比当下的写法能方便一点,效率还是会提升的。
接下来,我们就开始使用 Springboot 集成 Mybatis-plus 进行实现列表分页功能。
🍊 开搞
💴 数据准备
一如既往的还是使用我们之前一直使用过的 user
表
/*Table structure for table `user1` */
DROP TABLE IF EXISTS `user1`;
CREATE TABLE `user1` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '用户id',
`name` varchar(64) DEFAULT NULL COMMENT '用户名称',
`phone` varchar(64) DEFAULT NULL COMMENT '用户电话',
`age` int DEFAULT NULL COMMENT '用户年龄',
`address` varchar(128) DEFAULT NULL COMMENT '用户地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='用户表';
/*Data for the table `user1` */
insert into `user1`(`id`,`name`,`phone`,`age`,`address`) values
(1,'孙一','13800138002',27,'西安市雁塔区'),
(2,'黄二','13900139002',31,'青岛市市南区'),
(3,'张三','13800138000',30,'北京市海淀区'),
(4,'李四','13900139000',25,'上海市浦东新区'),
(5,'王五','13600136000',35,'广州市天河区'),
(6,'赵六','13700137000',28,'深圳市南山区'),
(7,'陈七','13800138001',22,'杭州市西湖区'),
(8,'周八','13900139001',32,'南京市鼓楼区'),
(9,'吴九','13600136001',40,'成都市武侯区'),
(10,'郑十','13700137001',33,'武汉市江汉区');
💵 配置
📄 pom引入
<!-- mybatis-plus-boot -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
📃 application.yml 配置
spring:
datasource:
# 数据源基本配置
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
druid:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
#mybatis-plus
mybatis-plus:
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapper-locations: classpath*:mapper/*Mapper.xml
# 搜索指定包别名
typeAliasesPackage: org.example.pojo
global-config:
db-config:
id-type: auto
configuration:
call-setters-on-nulls: true
map-underscore-to-camel-case: true
object-wrapper-factory: com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory
📑 MybatisPlusConfig
@Configuration
public class MybatisPlusConfig {
/**
* 新的插件配置
* PaginationInnerInterceptor分页一缓和二缓遵循mybatis的规则 PaginationInnerInterceptor
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 配置分页插件
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
paginationInnerInterceptor.setOverflow(true);
paginationInnerInterceptor.setMaxLimit(1000L);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
💷 编码
Service 与 Mapper 中的代码就不放了,那个也就继承下 BaseService 与 BaseMapper 就行,核心就在ServiceImpl 里面。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Resource
private UserMapper userMapper;
//获取用户分页
@Override
public IPage<User> getUserPage() {
//构建分页模型,拼装参数(第一页,每一页5条数据)
Page page = new Page<>(1, 5);
//执行分页查询,返回对应实体类分页
return userMapper.selectPage(page,new LambdaQueryWrapper<>());
}
//获取用户分页Map
@Override
public IPage<Map<String, Object>> getUserPageMap() {
//构建分页模型,拼装参数(第一页,每一页5条数据)
Page page = new Page<>(1, 5);
//定义查询LambdaQueryWrapper
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//设置只查询的参数,并设置排序
lambdaQueryWrapper.select(User::getName,User::getPhone)
.orderByDesc(User::getId);
//执行分页查询,返回Map分页
return userMapper.selectMapsPage(page,lambdaQueryWrapper);
}
}
📄 执行对应查询的Sql语句
获取用户分页(getUserPage):
获取用户分页Map(getUserPageMap):
💶 备注
简单说明一下IPage里面的一些常用的参数,其他可以自行了解。
常用字段 | 备注信息 |
---|---|
records | 分页记录列表(列表中所包含的数据信息) |
total | 总条数 |
size | 每页显示的条数 |
current | 当前页 |
pages | 总页数 |
💳 总结
在调用 selectPage 与 selectMapsPage
时,就会进行数量与列表的查询,这一点就在一定意义上就提升了效率。
也可以自己进一步封装分页返回的数据格式,比如:有些分页插件只需要总条数和记录、有些全都需要、有些只要其中几个,这个根据情况可自行封装处理。
有好多种实现的方式,就看你喜欢哪种就用哪种,让自己快乐才是真的快乐,其他的一切随缘。哈哈😍
🍋 展望
人呢,还是需要忙起来,可以去学习,可以去旅游,可以去考研、考证 . . . . . .
学会思考,学会总结,学会调整。
人活着就是为了让自己快乐起来!!!
转载自:https://juejin.cn/post/7398150089557082124