二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。
上一章简单介绍了SpringBoot整合Thymeleaf(十三),如果没有看过,请观看上一章
一. MyBatisPlus 的简介
MyBatisPlus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网地址是: https://baomidou.com/
官网文档地址是: https://baomidou.com/guide/
本文章是在老蝴蝶写的系列文章 SpringBoot整合MyBatis(七) 进行改进的.
二. SpringBoot 整合 MyBatisPlus
使用 MyBatisPlus 最常见的用法有四种:
- 简单的 CRUD 处理
- 创建时间和修改时间的自动插入和修改
- 逻辑删除的处理
- 分页处理
接下来,老蝴蝶和大家一起学习一下 SpringBoot 整合 MyBatisPlus 的用法。
项目的目录结构:
二.一 pom.xml 添加依赖
<!--引入MySql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--引入springboot与mybatis-plus整合的依赖。 去掉mybatis的依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
我们使用的是 3.3.2 的版本。(MybatisPlus的版本不同,处理方式有些地方会有所不同)
引入 mybatis-plus-boot-starter 依赖时,要注意,去掉 MyBatis 的依赖信息。
<!--去掉 springboot与mybatis整合的依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- 去掉 pagehelper分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
二.二 application.yml 配置信息配置
# 引入 数据库的相关配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true
username: root
password: abc123
type: com.alibaba.druid.pool.DruidDataSource
#整合mybatis时使用的。 去掉整合 MyBatis的配置信息
mybatis-plus:
# 配置 mapper文件的位置
mapper-locations: classpath:mybatis/mapper/**/*.xml
# 配置日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true # 配置数据库表的列别名设置
global-config:
db-config:
table-underline: true # 驼峰方式转换
二.三 数据库准备信息
目前 springboot数据库下有一张表 user
-- 创建员工 user 表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
`age` int(6) DEFAULT NULL,
`description` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
二.四 其他主要代码信息
二.四.一 User.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
/**
* @param id id编号
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @param description 描述
*/
private Integer id;
private String name;
private String sex;
private Integer age;
private String description;
}
三. 基础的 CRUD 配置
三.一 配置实体 User.java 中添加相关的配置信息
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("user")
public class User implements Serializable {
/**
* @param id id编号
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @param description 描述
*/
@TableId(value="id",type = IdType.AUTO)
private Integer id;
@TableField(value="name")
private String name;
@TableField(value="sex")
private String sex;
@TableField(value="age")
private Integer age;
@TableField(value="description")
private String description;
}
通过注解,将实体类与数据库表产生关联。
在类名上添加 @TableName 注解,指定表名。
在Id 主键属性上添加 @TableId 注解, 指定该列主键列, type 指定主键生成策略. AUTO 表示自动生成.
在其他属性上添加 @TableField 注解,指定对应的是数据表的哪个列信息。
三.二 UserMapper 接口
Mapper 需要继承 MyBatisPlus 提供的 BaseMapper 接口(里面定义了好多接口), 类似于 Jpa里面的 JpaRepository 接口一样.
**
* Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
* <p>这个 Mapper 支持 id 泛型</p>
*
* @author hubin
* @since 2016-01-23
*/
public interface BaseMapper<T> extends Mapper<T> {
/**
* 插入一条记录
*
* @param entity 实体对象
*/
int insert(T entity);
/**
* 根据 ID 删除
*
* @param id 主键ID
*/
int deleteById(Serializable id);
/**
* 根据 columnMap 条件,删除记录
*
* @param columnMap 表字段 map 对象
*/
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,删除记录
*
* @param wrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
/**
* 删除(根据ID 批量删除)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 根据 ID 修改
*
* @param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根据 whereEntity 条件,更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
/**
* 根据 ID 查询
*
* @param id 主键ID
*/
T selectById(Serializable id);
/**
* 查询(根据ID 批量查询)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 查询(根据 columnMap 条件)
*
* @param columnMap 表字段 map 对象
*/
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,查询一条记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询总记录数
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
编写 UserMapper 文件
public interface UserMapper extends BaseMapper<User> {
// 没有的方法, 在这里面进行自定义添加即可。
void batchAdd(@Param("userList") List<User> userList);
void batchUpdate(@Param("userList") List<User> userList);
void batchDeleteByIds(@Param("ids") List<Integer> ids);
}
三.三 编写 UserMapper.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.yueshushu.learn.mapper.UserMapper">
<insert id="batchAdd">
insert into user(name,sex,age,description) values
<foreach collection="userList" item="user" open="" close="" separator=",">
(#{user.name},#{user.sex},#{user.age},#{user.description})
</foreach>
</insert>
<update id="batchUpdate">
<foreach collection="userList" item="user" open="" close="" separator=";">
update user set name=#{user.name},sex=#{user.sex},
age=#{user.age},description=#{user.description}
where id=#{user.id}
</foreach>
</update>
<delete id="batchDeleteByIds">
delete from user where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
</mapper>
三.四 修改 Service 和对应的实现类
定义的方法,与 Mybatis 项目时的方法,基本一致。
UserService.java 接口
public interface UserService {
void addUser(User user);
void updateUser(User user);
void deleteUser(int id);
void saveUser(User user);
void batchAddUser(List<User> userList);
void batchUpdateUser(List<User> userList);
void batchDeleteByIds(List<Integer> ids);
User findById(int id);
List<User> findAll();
List<User> findAllByIds(List<Integer> ids);
Long count();
List<User> findByNameSexAndDesc(User user);
}
UserServiceImpl 实现类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void addUser(User user) {
userMapper.insert(user);
}
@Override
public void updateUser(User user) {
userMapper.updateById(user);
}
@Override
public void deleteUser(int id) {
userMapper.deleteById(id);
}
@Override
public void saveUser(User user) {
userMapper.insert(user);
}
@Override
public void batchAddUser(List<User> userList) {
userMapper.batchAdd(userList);
}
@Override
public void batchUpdateUser(List<User> userList) {
userMapper.batchUpdate(userList);
}
@Override
public void batchDeleteByIds(List<Integer> ids) {
userMapper.batchDeleteByIds(ids);
}
@Override
public User findById(int id) {
return userMapper.selectById(id);
}
@Override
public List<User> findAll() {
return userMapper.selectList(null);
}
@Override
public List<User> findAllByIds(List<Integer> ids) {
return userMapper.selectBatchIds(ids);
}
@Override
public Long count() {
return Long.valueOf(userMapper.selectCount(null));
}
@Override
public List<User> findByNameSexAndDesc(User user) {
// 注意查询的方式,用的是 QueryWrapper 接口
QueryWrapper<User> queryWrapper=new QueryWrapper<User>();
queryWrapper.like(!StringUtils.isEmpty(user.getName()),"name",user.getName());
queryWrapper.eq(!StringUtils.isEmpty(user.getSex()),"sex",user.getSex());
queryWrapper.eq(!StringUtils.isEmpty(user.getDescription()),"description",
user.getDescription());
return userMapper.selectList(queryWrapper);
}
}
三.五 MyBatisTests 测试实现
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@Log4j2
public class MyBatisTests {
@Autowired
private UserService userService;
@Test
public void insertTest(){
//1. 构建对象
User user=new User();
user.setName("欢欢");
user.setAge(22);
user.setSex("女");
user.setDescription("一个非常可爱的女孩纸");
//2. 添加方法
userService.addUser(user);
log.info("添加成功,{}",user);
}
@Test
public void updateTest(){
//1. 构建对象
User user=new User();
user.setId(1); //id不存在,会添加
user.setName("欢欢");
user.setDescription("岳泽霖最好的朋友");
//2. 修改方法
userService.updateUser(user);
log.info("修改成功,{}",user);
}
@Test
public void deleteTest(){
userService.deleteUser(16);
}
// 批量添加,批量修改操作。
@Test
public void saveTest(){
//1. 构建对象
User user=new User();
user.setId(2);
user.setName("欢欢A");
user.setDescription("岳泽霖最好的朋友");
//2. 修改方法
userService.saveUser(user);
log.info("添加或者修改成功,{}",user);
}
@Test
public void batchAddTest(){
//1. 构建对象
User user=new User();
user.setName("小欢欢");
user.setAge(22);
user.setSex("女");
user.setDescription("一个小坏蛋");
User user1=new User();
user1.setName("小泽霖");
user1.setAge(25);
user1.setSex("男");
user1.setDescription("一个大坏蛋");
//这是修改的操作,id=2已经存在这条记录了。
User user2=new User();
user2.setName("岳泽霖");
user2.setAge(25);
user2.setSex("男性");
user2.setDescription("一个快乐的程序员");
//2. 放置到集合里面
List<User> userList=new ArrayList<>();
userList.add(user);
userList.add(user1);
userList.add(user2);
userService.batchAddUser(userList);
}
@Test
public void batchUpdateTest(){
//1. 构建对象
User user=new User();
user.setId(2);
user.setName("小欢欢A");
user.setAge(22);
user.setSex("女");
user.setDescription("一个小坏蛋");
User user1=new User();
user1.setId(3);
user1.setName("小泽霖A");
user1.setAge(25);
user1.setSex("男");
user1.setDescription("一个大坏蛋");
//
User user2=new User();
user2.setId(4);
user2.setName("岳泽霖A");
user2.setAge(25);
user2.setSex("男性");
user2.setDescription("一个快乐的程序员");
//2. 放置到集合里面
List<User> userList=new ArrayList<>();
userList.add(user);
userList.add(user1);
userList.add(user2);
userService.batchUpdateUser(userList);
}
@Test
public void batchDeleteTest(){
List<Integer> ids= Arrays.asList(3,4,6);
userService.batchDeleteByIds(ids);
}
@Test
public void findByIdTest(){
User user=userService.findById(2);
log.info(user);
}
@Test
public void findAllTest(){
List<User> userList=userService.findAll();
userList.forEach(n->log.info(n));
}
@Test
public void findByIdsTest(){
List<Integer> ids= Arrays.asList(2,4,6);
List<User> userList=userService.findAllByIds(ids);
userList.forEach(n->log.info(n));
}
@Test
public void countTest(){
Long count=userService.count();
log.info("总数目{}",count);
}
@Test
public void nameAndSexAndDescTest(){
User user=new User();
user.setName("小欢欢A");
user.setSex("女");
user.setAge(27);
user.setDescription("小坏蛋");
List<User> userList=userService.findByNameSexAndDesc(user);
userList.forEach(n->log.info(n));
}
}
这些方法,是可以运行的,数据库表里面的数据也会同步进行更新。
基础的 Crud 功能实现完成
四. 自动填充 创建时间和修改时间功能
在公司业务里面,每一个表都有 创建时间,修改时间。 希望这两个字段 create_time, update_time 可以由系统进行处理,并不是由调用者进行手动处理。
四.一 数据库表 user 添加相应字段
-- 添加开始时间和修改时间字段, 用于验证自动插入
-- 修改数据库中表结构
ALTER TABLE user ADD column create_time TIMESTAMP null COMMENT '记录插入时间';
ALTER TABLE user ADD column update_time TIMESTAMP null COMMENT '记录修改时间';
-- 更新所有表中数据
UPDATE user SET create_time=NOW();
UPDATE user SET update_time=NOW();
四.二 User.java 添加属性
public class User implements Serializable {
/**
* @param id id编号
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @param description 描述
*/
@TableId(value="id",type = IdType.AUTO)
private Integer id;
@TableField(value="name")
private String name;
@TableField(value="sex")
private String sex;
@TableField(value="age")
private Integer age;
@TableField(value="description")
private String description;
/*处理自动插入创建时间,自动更新修改时间*/
@TableField(value="create_time",fill = FieldFill.INSERT)
private Date createTime;
@TableField(value="update_time",fill = FieldFill.UPDATE)
private Date updateTime;
}
createTime 和 updateTime 上面 的注解 @TableField 注解上面,添加 fill 属性,
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
四.三 实现元对象 MetaObject 处理器
@Component
@Log4j2
public class FillDateHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("createTime 字段插入开始日期");
//3.3.0 及其以上的写法。 createTime 对应的是类中属性名称,所以创建时间的那个字段要想自动填入,必须是 createTime
// 可以会多个字段设置自动填充值。
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("updateTime 字段更新修改日期");
//3.3.0 及其以上的写法。 updateTime 对应的是类中属性名称,所以创建时间的那个字段要想自动填入,必须是 updateTime
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
四.四 添加/修改 验证
四.四.一 添加时,自动填充 createTime 字段值
四.四.二 修改时,自动更新 updateTime 字段值
五. 逻辑删除
通常,在一个表里面,删除时,并不是真正物理删除这条数据,而是逻辑删除数据。
常常用 flag, write_status 等字段来表示. 为1 时表示正常状态, 为0时,表示删除状态。
设置时,有两种, 一种是单个表设置,一种是全局性配置。
五.一 数据表 user 添加 flag 字段
-- 修改数据库中表结构, 添加一个字段作为标记
ALTER TABLE user ADD column flag TINYINT COMMENT '0表示删除,1表示正常';
-- 更新表中所有数据, 全部设置为未删除
UPDATE user SET flag=1;
五.二 单个表设置逻辑删除
五.二.一 User.java 添加flag属性和配置
@TableField(value="flag",fill = FieldFill.INSERT)
@TableLogic(value = "1",delval = "0")
private Integer flag;
用 @TableLogic 注解放置在属性上, value表示正常的状态, delval 表示删除时的值信息。
五.二.二 处理自动插入 flag
@Component
@Log4j2
public class FillDateHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("createTime 字段插入开始日期");
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
//处理 flag 逻辑删除位。
this.strictInsertFill(metaObject, "flag", Integer.class, 1);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("updateTime 字段更新修改日期");
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
五.二.三 新增,修改,删除验证
五.二.三.一 新增
五.二.三.二 修改
五.二.三.三 删除
变成了逻辑删除, 令 flag=0
五.二.三.四 全部查询 findAllTest
查询时,都会带上条件, flag=1 进行查询, 避免已经逻辑删除的数据被查询到。
五.三 全局配置逻辑删除
当表过多时,不应该每一个表对应的类都进行配置 逻辑删除的数据,希望全局性进行配置,便于维护.
五.三.一 application.yml 全局配置
#整合mybatis时使用的
mybatis-plus:
# 配置 mapper文件的位置
mapper-locations: classpath:mybatis/mapper/**/*.xml
# 配置日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true # 配置数据库表的列别名设置
global-config:
db-config:
logic-delete-field: flag # 逻辑删除的字段
logic-not-delete-value: 1 # 正常状态下,该字段的值
logic-delete-value: 0 # 删除后,该字段的值
table-underline: true # 驼峰方式转换
五.三.二 User.java 配置 flag 属性
/*处理标识位*/
//@TableField(value="flag",fill = FieldFill.INSERT)
//@TableLogic(value = "1",delval = "0")
@TableField(value="flag",fill = FieldFill.INSERT)
@TableLogic
private Integer flag;
五.三.三 处理自动插入 flag
@Component
@Log4j2
public class FillDateHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("createTime 字段插入开始日期");
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
//处理 flag 逻辑删除位。
this.strictInsertFill(metaObject, "flag", Integer.class, 1);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("updateTime 字段更新修改日期");
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
五.三.四 添加,修改,删除测试
添加,修改,删除,查询均与 五.二.三.四 部分相同。 这儿,老蝴蝶只给出一个插入的打印信息。
六. 分页展示
当数据量过多时,会进行分页展示。 MyBatis-Plus 自带分页处理,也支持 pagehelper-spring-boot-starter 进行分页处理.
六.一 MyBatisPlus 自带的分页 PaginationInterceptor
六.一.一 配置 PageConfig
@Component
//配置扫描哪些 mapper
@MapperScan(value="top.yueshushu.learn.mapper")
public class PageConfig {
/**
* 对分页进行配置
* @return
*/
@Bean
public PaginationInterceptor getPaginationInterceptor(){
return new PaginationInterceptor();
}
}
六.一.二 分页处理 接口和实现类
UserService.java
Page pageUser(Integer pageNumber, Integer pageSize);
UserServiceImpl.java
@Override
public Page pageUser(Integer pageNumber, Integer pageSize) {
//开启分页
Page userPage=new Page(pageNumber,pageSize);
//正常的查询
userMapper.selectPage(userPage,null);
return userPage;
}
六.一.三 测试
@Test
public void pageTest(){
Integer pageNumber=2;
Integer pageSize=3;
Page pageInfo=userService.pageUser(pageNumber,pageSize);
log.info("总数:"+pageInfo.getTotal());
List<User> userList=pageInfo.getRecords();
userList.forEach(n->log.info(n));
}
可以进行分页的. 具体的分页后的数据,可以查询 Page 类
六.二 分页 pagehelper-spring-boot-starter
六.二.一 pom.xml 中添加依赖
<!-- 引入pagehelper分页插件 注意版本号要与 mybatis-plus 进行匹配到 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
注意依赖的版本号, 要与 mybatis-plus 的版本号适配。
六.二.二 application.yml 配置
#分页插件
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
六.二.三 去掉 PaginationInterceptor 的分页
//@Component
//配置扫描哪些 mapper
@MapperScan(value="top.yueshushu.learn.mapper")
public class PageConfig {
/**
* 对分页进行配置
* @return
*/
//@Bean
public PaginationInterceptor getPaginationInterceptor(){
return new PaginationInterceptor();
}
}
六.二.四 分页
UserService.java
PageInfo githubPageUser(Integer pageNumber, Integer pageSize);
UserServiceImpl.java
@Override
public PageInfo githubPageUser(Integer pageNumber, Integer pageSize) {
//开启分页
PageHelper.startPage(pageNumber,pageSize);
//正常的查询
List<User> userList=userMapper.selectList(null);
//将结果转换成PageInfo对象。
PageInfo pageInfo=new PageInfo(userList);
return pageInfo;
}
六.二.五 分页测试
@Test
public void githubPageTest(){
Integer pageNumber=2;
Integer pageSize=3;
PageInfo pageInfo=userService.githubPageUser(pageNumber,pageSize);
log.info("总数:"+pageInfo.getTotal());
List<User> userList=pageInfo.getList();
userList.forEach(n->log.info(n));
}
分页是可以的。
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/SpringBoot_MyBatisPlus
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!