Mybatis-Plus 分页插件

Mybatis-Plus 分页插件

前言

参考文档:https://mp.baomidou.com/guide/page.html

笔者使用的是 SpringBoot 结合 Mybatis-Plus。

如果读者对 SpringBoot 创建项目已经熟悉,或者只想了解分页插件的内容,请直接看章节”使用 Mybatis-Plus 分页插件“。

工程结构

准备

首先,创建 SpringBoot 项目,实现从前端到后台跑通。

创建 Maven 工程

因为我已经创建过了,这里爆红。

修改 POM 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>mybatis-plus-pagination</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--lombok 简化开发插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--springboot 支持的是 jpa,mybatisplus 自己做了启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--spring-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<!--maven 插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

编写 yml 文件

在 resource 文件夹下创建 application.yml

# 端口
server:
port: 8080
# 数据源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springbootdemo?characterEncoding=utf-8&useSSL=false
username: root
password: root
# mybatis-plus 设置
mybatis-plus:
mapper-locations: classpath:mapper/*.xml #mapper.xml 文件位置,如果没有映射文件,请注释掉。

注:这里的数据库名称、用户名和密码记得改成自己的。

useSSL=false,是为了去掉一个检测,不至于控制台报红,不影响运行。

启动类

创建 Application.java

package com.example;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

@MapperScan 用来扫描 Mapper 文件

业务类

这部分内容包扩:实体类、Dao、Service、Controller

实体类

User.java

import java.io.Serializable;
@Data
@TableName("user")
public class User implements Serializable {
@TableId(type = IdType.AUTO, value = "userId") // 自增
private Long userId;
@TableField(value = "userName")
private String userName;
@TableField(value = "password")
private String password;
@TableField(value = "status")
private int status;
}

@Data 为 lombok 注解

@TableName 用来映射数据表名称

@TableId 用来映射主键,value 属性用来映射字段名称

如果不指定,mybatis-plus 会根据属性名自动映射,如“userId”映射为“user_id"。

Result.java 统一的前端返回类型

package com.example.entities;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result implements Serializable {
private boolean success;
private String message;
private Object data;
public Result(boolean success, String message) {
this.success = success;
this.message = message;
}
}

@AllArgsConstructor 全参构造

@NoArgsConstructor 无参构造,它们都是 lombok 的注解

Dao 层

UserMapper.java

package com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entities.User;
public interface UserMapper extends BaseMapper<User> {
}

在之前的 yml 编写中有这么一句:

# mybatis-plus 设置
mybatis-plus:
mapper-locations: classpath:mapper/*.xml #mapper.xml 文件位置,如果没有映射文件,请注释掉。

接下来,我们创建映射的 xml 文件

在 resource 文件夹下,创建 mapper 文件夹,再创建 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="com.example.mapper.UserMapper">
</mapper>

Service 层

首先,创建 UserService 接口。

package com.example.service;
import com.example.entities.User;
import java.util.List;
public interface UserService {
List<User> findList();
}

再创建它的实现类 UserServiceImpl

package com.example.service.impl;
import com.example.entities.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public List<User> findList() {
return userMapper.selectList(null);
}
}

Controller 层

创建 UserController.java

package com.example.controller;
import com.example.entities.Result;
import com.example.entities.User;
import com.example.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class UserController {
@Resource
private UserService userService;
@GetMapping("user/findList")
public Result findList() {
List<User> list = userService.findList();
if (list != null && list.size() > 0) {
return new Result(true, "查询成功", list);
} else {
return new Result(false, "查询失败");
}
}
}

测试

运行启动类 >Application.java

访问:http://localhost:8080/user/findList

访问成功!

使用 Mybatis-Plus 分页插件

在 pom 文件中,导入所需坐标:(这一步,准备中已经做过)

<!--springboot 支持的是 jpa,mybatisplus 自己做了启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>

第一步:编写分页插件配置类

创建 MyBatisPlusConfig 配置类,内容如下:

package com.example.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制
//paginationInterceptor.setLimit(2);
return paginationInterceptor;
}
}

第二步:编写 Dao 层代码

修改 UserMapper.java ,内容如下:

public interface UserMapper extends BaseMapper<User> {
IPage<User> selectPage(Page page);
}

编写对应的 xml 映射文件 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="com.example.mapper.UserMapper">
<select id="selectPage" resultType="com.example.entities.User">
select * FROM user
</select>
</mapper>

编写一个普通 list 查询,mybatis-plus 自动替你分页

加不加 where 取决于你是否携带查询条件

第三步:调用分页方法

修改 UserService 接口:

public interface UserService {
List<User> findList();
IPage<User> selectPage(Page<User> page);
}

修改 UserServiceImpl 实现类:

@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public List<User> findList() {
return userMapper.selectList(null);
}
@Override
public IPage<User> selectPage(Page<User> page) {
return userMapper.selectPage(page);
}
}

第四步:编写 Controller

@RestController
public class UserController {
@Resource
private UserService userService;
@GetMapping("user/findList")
public Result findList() {
List<User> list = userService.findList();
if (list != null && list.size() > 0) {
return new Result(true, "查询成功", list);
} else {
return new Result(false, "查询失败");
}
}
@GetMapping("user/selectPage")
public IPage<User> selectPage() {
/**
* Page(current,size)
* current: 当前页,long 类型
* size: 每页显示的数量,long 类型
* 可参考其构造方法
*/
IPage<User> userIPage = userService.selectPage(new Page<>(1, 5));
return userIPage;
}
}

测试

运行启动类 >Application.java

访问:http://localhost:8080/user/findList

使用浏览器访问:

使用 postman 工具访问:

可以看到,分页插件自动帮助我们实现了分页功能。