mybatis-plus分页查询
首先创建一个数据库表
如下图所示:

创建一个spring boot项目
pom.xml和配置如下:
<?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>org.kaven</groupid>
<artifactid>mybatis-plus</artifactid>
<version>1.0-snapshot</version>
<parent>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-parent</artifactid>
<version>2.3.4.release</version>
<relativepath/>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-webflux</artifactid>
</dependency>
<dependency>
<groupid>com.baomidou</groupid>
<artifactid>mybatis-plus-boot-starter</artifactid>
<version>3.4.0</version>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>5.1.49</version>
</dependency>
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-maven-plugin</artifactid>
</plugin>
</plugins>
</build>
</project>spring:
application:
name: mybatis-plus
datasource:
driver-class-name: com.mysql.jdbc.driver
username: root
password: itkaven@123
url: jdbc:mysql://127.0.0.1:3306/test?characterencoding=utf-8&usessl=false
server:
port: 8085
logging:
level:
root: warn
com.kaven.mybatisplus.dao: trace
pattern:
console: '%p%m%n'
mybatis-plus:
mapper-locations: classpath:mappers/*.xml实体类user
package com.kaven.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.tablefield;
import com.baomidou.mybatisplus.annotation.tableid;
import com.baomidou.mybatisplus.annotation.tablename;
import lombok.data;
@tablename("user")
@data
public class user {
@tableid
private string id;
@tablefield("username")
private string username;
@tablefield("password")
private string password;
@tablefield("age")
private integer age;
/**
* 使用 @tablefield(exist = false) ,表示该字段在数据库中不存在 ,所以不会插入数据库中
* 使用 transient 、 static 修饰属性也不会插入数据库中
*/
@tablefield(exist = false)
private string phone;
}
mapper接口usermapper
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.mapper.basemapper;
import com.kaven.mybatisplus.entity.user;
import org.springframework.stereotype.component;
@component
public interface usermapper extends basemapper<user> {}
启动类
package com.kaven.mybatisplus;
import org.mybatis.spring.annotation.mapperscan;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
@springbootapplication
@mapperscan(basepackages = "com.kaven.mybatisplus.dao")
public class apprun {
public static void main(string[] args) {
springapplication.run(apprun.class , args);
}
}
@mapperscan(basepackages = "com.kaven.mybatisplus.dao")这个一定要加上。
我们先在数据库中添加几行数据,方便演示。

为了使用mybatis-plus来实现分页查询
还需要一些配置。
package com.kaven.mybatisplus.config;
import com.baomidou.mybatisplus.annotation.dbtype;
import com.baomidou.mybatisplus.autoconfigure.configurationcustomizer;
import com.baomidou.mybatisplus.extension.plugins.mybatisplusinterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.paginationinnerinterceptor;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
@configuration
public class mybatisplusconfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 mybatisconfiguration#usedeprecatedexecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@bean
public mybatisplusinterceptor mybatisplusinterceptor() {
mybatisplusinterceptor interceptor = new mybatisplusinterceptor();
paginationinnerinterceptor paginationinnerinterceptor = new paginationinnerinterceptor();
paginationinnerinterceptor.setdbtype(dbtype.mysql);
paginationinnerinterceptor.setoverflow(true);
interceptor.addinnerinterceptor(paginationinnerinterceptor);
return interceptor;
}
@bean
public configurationcustomizer configurationcustomizer() {
return configuration -> configuration.setusedeprecatedexecutor(false);
}
}
项目结构如下图:

现在来使用一下分页查询方法selectpage()。
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.lambdaquerywrapper;
import com.baomidou.mybatisplus.core.metadata.ipage;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
@runwith(springrunner.class)
@springboottest
public class usermapperpagetest {
@autowired
private usermapper usermapper;
@test
public void selectpage(){
lambdaquerywrapper<user> userlambdaquerywrapper = wrappers.lambdaquery();
userlambdaquerywrapper.like(user::getusername , "k");
page<user> userpage = new page<>(1 , 2);
ipage<user> useripage = usermapper.selectpage(userpage , userlambdaquerywrapper);
system.out.println("总页数: "+useripage.getpages());
system.out.println("总记录数: "+useripage.gettotal());
useripage.getrecords().foreach(system.out::println);
}
}
结果如下:

结果是正确的,可以看到该方法执行了两条sql,一条是查询总记录数,一条是查询我们需要的数据。
如果我们并不需要总记录数,查询总记录数就完全没有必要,因为它也需要耗时,其实可以设置不查询总记录数。
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.lambdaquerywrapper;
import com.baomidou.mybatisplus.core.metadata.ipage;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
@runwith(springrunner.class)
@springboottest
public class usermapperpagetest {
@autowired
private usermapper usermapper;
@test
public void selectpage(){
lambdaquerywrapper<user> userlambdaquerywrapper = wrappers.lambdaquery();
userlambdaquerywrapper.like(user::getusername , "k");
page<user> userpage = new page<>(1 , 2 , false);
ipage<user> useripage = usermapper.selectpage(userpage , userlambdaquerywrapper);
system.out.println("总页数: "+useripage.getpages());
system.out.println("总记录数: "+useripage.gettotal());
useripage.getrecords().foreach(system.out::println);
}
}
page<user> userpage = new page<>(1 , 2 , false);在这里设置为false即可。
结果如下:

从上图可以看到只有一条sql,总页数和总记录数都为0,因为我们设置了不需要去查询这些信息。
再来演示一下selectmapspage()的用法。
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.lambdaquerywrapper;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.metadata.ipage;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.lambdaquerychainwrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermapperpagetest {
@autowired
private usermapper usermapper;
@test
public void selectmapspage(){
lambdaquerywrapper<user> userlambdaquerywrapper = wrappers.lambdaquery();
userlambdaquerywrapper.select(user::getusername).like(user::getusername , "k");
page<map<string , object>> mappage = new page<>(1 , 2 , false);
ipage<map<string , object>> mapipage = usermapper.selectmapspage(mappage , userlambdaquerywrapper);
system.out.println("总页数: "+mapipage.getpages());
system.out.println("总记录数: "+mapipage.gettotal());
mapipage.getrecords().foreach(system.out::println);
}
}
结果如下:

结果也是正确的,从用法上也可以看出应用场景。
基于可扩展性,mybatis-plus还可以使用自定义sql的方法来实现分页查询,这样便于多表等复杂条件。
修改usermapper接口:
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.wrapper;
import com.baomidou.mybatisplus.core.mapper.basemapper;
import com.baomidou.mybatisplus.core.metadata.ipage;
import com.baomidou.mybatisplus.core.toolkit.constants;
import com.kaven.mybatisplus.entity.user;
import org.apache.ibatis.annotations.param;
import org.springframework.stereotype.component;
import java.util.list;
@component
public interface usermapper extends basemapper<user> {
ipage<user> selectbypage(ipage<user> userpage , @param(constants.wrapper) wrapper<user> userwrapper);
}
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.kaven.mybatisplus.dao.usermapper">
<select id="selectbypage" resulttype="com.kaven.mybatisplus.entity.user">
select * from user ${ew.customsqlsegment}
</select>
</mapper>也可以使用mybatis的注解来代替xml配置文件(如@select)。
测试代码:
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.lambdaquerywrapper;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.metadata.ipage;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.lambdaquerychainwrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermapperpagetest {
@autowired
private usermapper usermapper;
@test
public void selectbypage(){
lambdaquerywrapper<user> userlambdaquerywrapper = wrappers.lambdaquery();
userlambdaquerywrapper.like(user::getusername , "k");
page<user> mappage = new page<>(1 , 2 , false);
ipage<user> mapipage = usermapper.selectbypage(mappage , userlambdaquerywrapper);
system.out.println("总页数: "+mapipage.getpages());
system.out.println("总记录数: "+mapipage.gettotal());
mapipage.getrecords().foreach(system.out::println);
}
}
结果如下:

结果也是正确的。
使用mybatis-plus来实现分页查询还是挺方便的。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论