推荐:MyBatis Plus汇总

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-plusdatasource:driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: ITkaven@123url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=falseserver:port: 8085logging:level:root: warncom.kaven.mybatisplus.dao: tracepattern: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 {@TableIdprivate 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 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();paginationInnerInterceptor.setDbType(DbType.MYSQL);paginationInnerInterceptor.setOverflow(true);interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}@Beanpublic 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 {@Autowiredprivate UserMapper userMapper;@Testpublic 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 {@Autowiredprivate UserMapper userMapper;@Testpublic 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 {@Autowiredprivate UserMapper userMapper;@Testpublic 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 {@Autowiredprivate UserMapper userMapper;@Testpublic 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来实现分页查询还是挺方便的。

写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!

附加

博主看评论区有小伙伴问怎么实现分页?博主花了几个小时去写了一个小栗子,大家可以参考参考。

  • 前端Vue+ElementUI的Pagination分页组件实现分页展示 & 后端Spring Boot +Mybatis Plus实现分页接口

MyBatis-Plus 之分页查询相关推荐

  1. Mybatis最入门---分页查询(逻辑分页与SQL语句分页)

    [一步是咫尺,一步即天涯] 到目前为止,我们介绍的Mybatis种种查询都是一次性的查询出所有结果并返回给上层.但是,在实际开发过程中,在大量数据存在的情况下,是很少这么做的.本文,我们将从逻辑分页, ...

  2. Mybatis+MySQL动态分页查询数据经典案例

    最近在用Mybatis做项目的时候遇到了不少问题,今天我就在这和大家分享一下,稀稀拉拉的研究了两天,终于搞好了! 开发人员:1111 开发软件:Myeclipse 用到的框架技术:Mybatis 数据 ...

  3. Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  4. Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)

    最近在用Mybatis做项目的时候遇到了不少问题,今天我就在这和大家分享一下,稀稀拉拉的研究了两天,终于搞好了! 开发人员:1111 开发软件:Myeclipse 用到的框架技术:Mybatis 数据 ...

  5. Mybatis Plus实现分页查询

    导入maven依赖 <!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId>&l ...

  6. Mybatis一对多分页查询问题

    一.背景引入 Mybatis提供了处理结果集的标签,其中子标签collection可以处理1对多的映射 <resultMap><collection></collecti ...

  7. Mybatis+mysql动态分页查询数据案例——房屋信息的接口(IHouseDao)

    package cn.bdqn.mhouse.dao;import java.util.List;import cn.bdqn.mhouse.entity.House; import cn.bdqn. ...

  8. 基于Spring+SpringMVC+MyBatis框架的分页查询

    前端点击按钮>>>controller层接受QueryVo和前端带过来的数据>>>调用service层产生PageModel对象>>>servic ...

  9. Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC & ...

  10. mybatis的oracle分页查询,Mybatis查询oracle分页

    开发采用spring+struts+ibatis+extjs,数据库用oracle ibtais配置分页 模糊查询 Java代码 bmzdm LIKE '%$objCondition.bmzdm$%' ...

最新文章

  1. Go进阶:反射3定律
  2. RecycleView 与 Elevation
  3. tcpdump抓包分析具体解释
  4. HDOJ 2196
  5. docker集群理解
  6. 4种常用压缩格式在hadoop中的应用
  7. SVPWM算法的推导
  8. 为ramda添加类型
  9. 30段超实用CSS代码
  10. 【最优化导论】一维搜索方法案例
  11. c++读取cfg文件
  12. Paper:LIME之《Why Should I Trust You? Explaining the Predictions of Any Classifier为什么要相信你?解释任何分类器的预测》翻
  13. 批处理解约瑟夫环应用题-shell
  14. JavaScript最常用的55个经典技巧
  15. 邮箱开启授权码(配置邮件客户端)
  16. 【网络技术】(5)身份认证技术与访问控制------数字签名技术
  17. html帧动画效果,HTML5+CSS3从入门到精通之CSS3 animation实现逐帧动画
  18. 新手零基础学PR速成课福利
  19. 开发了一款Linux服务器管理软件,邀请你体验
  20. educoder实训平台python答案课程号wy4br_python实训最后一天

热门文章

  1. 新手如何运营推广微信公众号
  2. 和平精英显示模拟服务器已满,和平精英模拟器注册达到上限? 模拟器注册上限完美解决攻略...
  3. python中用Selenium驱动Edge浏览器的方法
  4. 自定义接口机板KU085-8ADC-3G
  5. 基于FPGA的设计思想之串并转换与流水线
  6. C++11、C++14、C++17、C++20新特性总结(5万字详解)
  7. MFC使用第三方CSpreadSheet
  8. Docker学习之镜像操作
  9. 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作 #华为云·寻找黑马程序员#
  10. Java 全角半角转换工具类