首页 > 其他分享 >SpringBoot整合MyBatisPlus(十四)

SpringBoot整合MyBatisPlus(十四)

时间:2022-11-10 15:31:47浏览次数:77  
标签:MyBatisPlus SpringBoot void List param User 十四 public user


二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。

上一章简单介绍了SpringBoot整合Thymeleaf(十三),如果没有看过,​​请观看上一章​​

一. MyBatisPlus 的简介

MyBatisPlus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

官网地址是: ​​https://baomidou.com/​

官网文档地址是: ​​https://baomidou.com/guide/​

本文章是在老蝴蝶写的系列文章 ​​SpringBoot整合MyBatis(七)​​ 进行改进的.

二. SpringBoot 整合 MyBatisPlus

使用 MyBatisPlus 最常见的用法有四种:

  1. 简单的 CRUD 处理
  2. 创建时间和修改时间的自动插入和修改
  3. 逻辑删除的处理
  4. 分页处理

接下来,老蝴蝶和大家一起学习一下 SpringBoot 整合 MyBatisPlus 的用法。

项目的目录结构:

SpringBoot整合MyBatisPlus(十四)_spring

二.一 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 字段值

SpringBoot整合MyBatisPlus(十四)_mysql_02

四.四.二 修改时,自动更新 updateTime 字段值

SpringBoot整合MyBatisPlus(十四)_spring_03

五. 逻辑删除

通常,在一个表里面,删除时,并不是真正物理删除这条数据,而是逻辑删除数据。

常常用 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());
}
}

五.二.三 新增,修改,删除验证

五.二.三.一 新增

SpringBoot整合MyBatisPlus(十四)_mysql_04

五.二.三.二 修改

SpringBoot整合MyBatisPlus(十四)_spring boot_05

五.二.三.三 删除

SpringBoot整合MyBatisPlus(十四)_封装_06

变成了逻辑删除, 令 flag=0

五.二.三.四 全部查询 findAllTest

SpringBoot整合MyBatisPlus(十四)_java_07

查询时,都会带上条件, 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());
}
}

五.三.四 添加,修改,删除测试

SpringBoot整合MyBatisPlus(十四)_mysql_08

添加,修改,删除,查询均与 五.二.三.四 部分相同。 这儿,老蝴蝶只给出一个插入的打印信息。

六. 分页展示

当数据量过多时,会进行分页展示。 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));
}

SpringBoot整合MyBatisPlus(十四)_spring_09

可以进行分页的. 具体的分页后的数据,可以查询 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));
}

SpringBoot整合MyBatisPlus(十四)_封装_10

分页是可以的。

本章节的代码放置在 github 上:

​https://github.com/yuejianli/springboot/tree/develop/SpringBoot_MyBatisPlus​

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!


标签:MyBatisPlus,SpringBoot,void,List,param,User,十四,public,user
From: https://blog.51cto.com/u_13420484/5841800

相关文章

  • SpringBoot系统启动任务(三十二)的方式
    当我们离开世界的时候,那些人,知道我们来过就好.上一章简单介绍了SpringBoot通过Cors解决跨域问题(三十一),如果没有看过,​​请观看上一章​​本章节参考江南一点雨大神的文......
  • Springboot项目部署到docker
    Manve项目部署到docker第一步:将springboot项目打包Maven打包SpringBoot项目报错(repackagefailed:Unabletofindmainclass),排除寻找Main方法,一般用于被依赖的公用......
  • SpringBoot启动报错The APR based Apache Tomcat Native..
    SpringBoot项目启动报错TheAPRbasedApacheTomcatNativel...一、报错信息2022-11-1009:50:53org.apache.catalina.core.AprLifecycleListenerinit信息:TheAP......
  • 记录一次springboot 集成 openfeign 实现模块间调用异常
    记录一次springboot集成openfeign实现模块间调用异常 问题背景product 服务作为服务端,提供了一个对外通信Fegin接口ProductClient,放在了com.imooc.product.clie......
  • springboot整合项目-商城项目展示购物车勾选到支付页面并展示功能
    显示勾选的购物车数据1.持久层1.规划sql语句用户在购物车列表页面通过随机勾选相关的商品,在点击结算俺就后,跳转到结算页面,在这个页面需要展示用户在上个页面说勾选的购......
  • springboot启动直接退出显示Process finished with exit code 1
    SprintBoot项目启动后直接退出(未打印有关SP的日志)一、解决思路尝试在main方法前面加了一行打印语句:System.out.println(“SpringBootStart…”);//正常运行的打印......
  • 基于Docker部署Springboot工程
    主要参考文章:https://blog.csdn.net/qq_33285112/article/details/109726538https://www.cnblogs.com/linnuo/p/15699121.html一、首先基于Alpine构建Java最小运行环境......
  • springboot文件上传大小限制设置
    一般的web系统基本都会有文件上传功能,文件上传必然涉及到一个问题,就是文件大小,太大的文件不仅传输速度慢,而且对服务器压力巨大,后期的下载和保存都是一种考验。所以有了文......
  • MybatisPlus实现插入或更新数据时自动生成时间戳
    MybatisPlus实现插入或更新数据时,自动生成时间戳功能数据库表对应字段的类型应该是DateTime或者timestamp我需要在插入或更新数据时,为create_time字段自动生成时间戳......
  • 01-SpringBoot注解
    SpringBoot注解Spring常用注解配置注解含义@Configuration定义一个类是Spring配置类@Bean配置自定义的Bean,如DruidDataSource@Componen......