项目准备

1.创建用户表

2.使用spring初始化向导快速创建项目,勾选mybatis,web,jdbc,driver
添加lombok插件


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.4.1</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.hao</groupId>
  12. <artifactId>spring-boot-crud-end</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>spring-boot-crud-end</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-jdbc</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.mybatis.spring.boot</groupId>
  30. <artifactId>mybatis-spring-boot-starter</artifactId>
  31. <version>2.1.4</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-test</artifactId>
  36. <scope>test</scope>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.projectlombok</groupId>
  40. <artifactId>lombok</artifactId>
  41. </dependency>
  42. <dependency>
  43. <groupId>mysql</groupId>
  44. <artifactId>mysql-connector-java</artifactId>
  45. </dependency>
  46. </dependencies>
  47. <build>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

一、使用原生Java实现分页

1.UserMapper接口

  1. @Mapper
  2. @Repository
  3. public interface UserMapper {
  4. int selectCount();
  5. List<User> selectUserFindAll();
  6. }

2.整合mybatis(application.yaml)

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.cj.jdbc.Driver
  4. url: jdbc:mysql://localhost:3306/crud?serverTimezone=UTC
  5. username: root
  6. password: hao20001010
  7. mybatis:
  8. mapper-locations: classpath:mapper/*.xml
  9. type-aliases-package: com.hao.springboot.entity

3.测试dao层(成功

  1. @SpringBootTest
  2. class SpringBootCrudEndApplicationTests {
  3. @Autowired
  4. UserMapper userMapper;
  5. @Test
  6. void contextLoads() {
  7. List<User> users = userMapper.selectUserFindAll();
  8. for(User user:users){
  9. System.out.println(user);
  10. }
  11. }
  12. @Test
  13. void contextLoads2(){
  14. }
  15. }

4.编写service层

  1. public interface UserService {
  2. int selectCount();
  3. List<User> selectUserByArray(int currentPage,int pageSize);
  4. }
  1. /**
  2. * @author:抱着鱼睡觉的喵喵
  3. * @date:2020/12/26
  4. * @description:
  5. */
  6. @Service
  7. public class UserServiceImpl implements UserService {
  8. @Autowired
  9. UserMapper userMapper;
  10. @Override
  11. public int selectCount() {
  12. int count = userMapper.selectCount();
  13. return count;
  14. }
  15. /**
  16. * 原始分页逻辑实现
  17. * @param currentPage 当前页
  18. * @param pageSize 每页的数量
  19. * @return
  20. */
  21. @Override
  22. public List<User> selectUserByArray(int currentPage, int pageSize) {
  23. List<User> users = userMapper.selectUserFindAll();
  24. int count=selectCount();
  25. int startCurrentPage=(currentPage-1)*pageSize; //开启的数据
  26. int endCurrentPage=currentPage*pageSize; //结束的数据
  27. int totalPage=count/pageSize; //总页数
  28. if (currentPage>totalPage || currentPage<=0){
  29. return null;
  30. }else{
  31. return users.subList(startCurrentPage,endCurrentPage);
  32. }
  33. }
  34. }

5.controller层

  1. @RestController
  2. public class UserController {
  3. @Autowired
  4. UserService userService;
  5. @GetMapping("/user/{currentPage}/{pageSize}")
  6. public List<User> selectFindPart(@PathVariable("currentPage") int currentPage, @PathVariable("pageSize") int pageSize){
  7. List<User> list = userService.selectUserByArray(currentPage, pageSize);
  8. if (list==null){
  9. throw new UserNotExistException("访问出错!QWQ");
  10. }else{
  11. return list;
  12. }
  13. }
  14. }

6.异常处理

  1. public class UserNotExistException extends RuntimeException{
  2. private static final long serialVersionUID = 1L;
  3. private String msg;
  4. public UserNotExistException(String msg) {
  5. super("user not exist");
  6. this.msg=msg;
  7. }
  8. public String getMsg() {
  9. return msg;
  10. }
  11. public void setMsg(String msg) {
  12. this.msg = msg;
  13. }
  14. }

7.controller异常处理类

  1. /**
  2. * @author:抱着鱼睡觉的喵喵
  3. * @date:2020/12/26
  4. * @description:
  5. */
  6. @ControllerAdvice //处理controller层出现的异常
  7. public class ControllerExceptionHandler {
  8. @ExceptionHandler(UserNotExistException.class)
  9. @ResponseBody
  10. @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) //状态码
  11. public Map<String,Object> handlerUserNotExistException(UserNotExistException ex){
  12. Map<String,Object> result=new HashMap<>();
  13. result.put("msg", ex.getMsg());
  14. result.put("message", ex.getMessage());
  15. return result;
  16. }
  17. }

8.访问http://localhost:8080/user/5/10出现如下

{“msg”:“访问出错!QWQ”,“message”:“user not exist”}

9.访问http://localhost:8080/user/2/3 出现如下

[{“id”:4,“userName”:“sky”,“password”:“789”},{“id”:5,“userName”:“nulls”,“password”:“tom”},{“id”:6,“userName”:“zsh”,“password”:“zsh”}]

总结:
缺点:数据库查询并返回所有的数据,而我们需要的只是极少数符合要求的数据。当数据量少时,还可以接受。当数据库数据量过大时,每次查询对数据库和程序的性能都会产生极大的影响。


二、通过sql语句进行分页操作

1.在UserMapper接口中新增一个方法

  1. @Mapper
  2. @Repository
  3. public interface UserMapper {
  4. //原生分页
  5. int selectCount();
  6. List<User> selectUserFindAll();
  7. //通过sql语句进行分页
  8. List<User> selectBySql(Map<String,Object> map);
  9. }

2.UserService接口中新增方法,以及UserServiceImpl类中进行重写

  1. public interface UserService {
  2. int selectCount();
  3. /**
  4. * 原生分页
  5. * @param currentPage
  6. * @param pageSize
  7. * @return
  8. */
  9. List<User> selectUserByArray(int currentPage,int pageSize);
  10. /**
  11. * 通过sql分页
  12. * @param currentPage
  13. * @param pageSize
  14. * @return
  15. */
  16. List<User> selectUserBySql(int currentPage,int pageSize);
  17. }
  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. UserMapper userMapper;
  5. @Override
  6. public int selectCount() {
  7. int count = userMapper.selectCount();
  8. return count;
  9. }
  10. /**
  11. * 原始分页逻辑实现
  12. * @param currentPage
  13. * @param pageSize
  14. * @return
  15. */
  16. @Override
  17. public List<User> selectUserByArray(int currentPage, int pageSize) {
  18. List<User> users = userMapper.selectUserFindAll();
  19. int count=selectCount();
  20. int startCurrentPage=(currentPage-1)*pageSize; //从第几个数据开始
  21. int endCurrentPage=currentPage*pageSize; //结束的数据
  22. int totalPage=count/pageSize; //总页数
  23. if (currentPage>totalPage || currentPage<=0){
  24. return null;
  25. }else{
  26. return users.subList(startCurrentPage,endCurrentPage);
  27. }
  28. }
  29. /**
  30. *通过sql语句进行分页
  31. */
  32. @Override
  33. public List<User> selectUserBySql(int currentPage, int pageSize) {
  34. Map<String,Object> map=new HashMap<>();
  35. int startCurrentPage=(currentPage-1)*pageSize; //从第几个数据开始
  36. int count=selectCount();
  37. int totalPage=count/pageSize; //总页数
  38. if (currentPage>totalPage || currentPage<=0){
  39. return null;
  40. }else{
  41. map.put("currentPage",startCurrentPage);
  42. map.put("pageSize",pageSize);
  43. List<User> list = userMapper.selectBySql(map);
  44. return list;
  45. }
  46. }
  47. }

3.controller层编写

  1. @RestController
  2. public class UserController {
  3. @Autowired
  4. UserService userService;
  5. //Java原生实现分页模块
  6. @GetMapping("/user/{currentPage}/{pageSize}")
  7. public List<User> selectFindByJava(@PathVariable("currentPage") int currentPage, @PathVariable("pageSize") int pageSize){
  8. List<User> list = userService.selectUserByArray(currentPage, pageSize);
  9. if (list==null){
  10. throw new UserNotExistException("访问出错!QWQ");
  11. }else{
  12. return list;
  13. }
  14. }
  15. //sql分页方法模块
  16. @GetMapping("/user2/{currentPage}/{pageSize}")
  17. public List<User> selectFindBySql(@PathVariable("currentPage") int currentPage, @PathVariable("pageSize") int pageSize){
  18. List<User> list = userService.selectUserBySql(currentPage,pageSize);
  19. if (list==null){
  20. throw new UserNotExistException("访问出错!QWQ");
  21. }else{
  22. return list;
  23. }
  24. }
  25. }

4.UserMapper.xml添加查询条件,使用limit进行分页

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.hao.springboot.mapper.UserMapper">
  6. <resultMap id="user" type="com.hao.springboot.entity.User">
  7. <result column="user_name" property="userName"/>
  8. <result column="password" property="password"/>
  9. </resultMap>
  10. <select id="selectUserFindAll" resultMap="user">
  11. select * from user
  12. </select>
  13. <select id="selectCount" resultType="integer">
  14. select count(*) from user
  15. </select>
  16. <select id="selectBySql" parameterType="map" resultType="com.hao.springboot.entity.User">
  17. select * from user limit #{currentPage} , #{pageSize}
  18. </select>
  19. </mapper>

5.启动访问http://localhost:8080/user2/5/10 出现如下

{“msg”:“访问出错!QWQ”,“message”:“user not exist”}

接着正确访问http://localhost:8080/user2/2/2

[{“id”:3,“userName”:“tom”,“password”:“456”},{“id”:4,“userName”:“sky”,“password”:“789”}]

总结:
缺点:虽然这里实现了按需查找,每次检索得到的是指定的数据。但是每次在分页的时候都需要去编写limit语句,很冗余。而且不方便统一管理,维护性较差。所以我们希望能够有一种更方便的分页实现。


三、拦截器实现分页

springboot+mybatis实现数据分页(三种方式)的更多相关文章

  1. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  2. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  3. Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式

    Linux就这个范儿 第18章  这里也是鼓乐笙箫  Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read  ,write方式会在用户空间和内核空间不断拷贝数据, ...

  4. MATLAB 显示输出数据的三种方式

    MATLAB 显示输出数据的三种方式 ,转载 https://blog.csdn.net/qq_35318838/article/details/78780412 1.改变数据格式 当数据重复再命令行 ...

  5. ajax数据提交数据的三种方式和jquery的事件委托

    ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...

  6. Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)

    一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  7. iOS --- UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIM ...

  8. android sqlite使用之模糊查询数据库数据的三种方式

    android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sqlite的模糊查询方式,直接上代码把: package com.e ...

  9. jQuery中通过JSONP来跨域获取数据的三种方式

    第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ...

随机推荐

  1. Linux内存泄漏

    0 什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 1 常见的造成内 ...

  2. 《前端运维》一、Linux基础--07Shell函数

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...

  3. 女朋友问我深浅copy到底是什么?

    深浅拷贝 列表存放值的时候,是先申请一块内存空间,存放索引和内存地址的对应关系,其实通俗的来说列表内不存真正的值,是一种间接存放的对应关系: 列表内存不可变类型的数据 就比如说,如果现在将L列表索引0 ...

  4. Arch Linux 安装 Anbox

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 Anbox 介绍 Anbox 是一个可以在 GNU/Linux 发行版上运行 Android App 的容器,是一个开源兼容层. 其工作原理是在 ...

  5. 5月28日 python学习总结 CSS学习(一)

    1. CSS是什么 层叠样式表 --> 给HTML添加样式的 2. CSS的语法 选择器 { 属性1:值1; 属性2:值2; } 3. CSS引入方式 1. 直接写在HTMl标签里面 <p ...

  6. springboot通过maven下载依赖失败解决

    公司直接用不了内网遇到的好的坑.导入网上的springboot项目的启动入口一致有报错,如:Cannot resolve symbol 'SpringApplication' maven配置设置都做了 ...

  7. 内网渗透----Linux信息收集整理

    一.基础信息收集 1.查看系统类型 cat /etc/issue cat /etc/*-release cat /etc/lsb-release cat /etc/redhat-release 2.内 ...

  8. Apache HBase MTTR 优化实践

    HBase介绍 HBase是Hadoop Database的简称,是建立在Hadoop文件系统之上的分布式面向列的数据库,它具有高可靠.高性能.面向列和可伸缩的特性,提供快速随机访问海量数据能力. H ...

  9. 初识$router和$route

    初识\(router和\)route 一.前言 ​ vue框架中单页面富应用可以说是其最大的优点功能之一了,应用起来简单直观,说起单页面富应用那就必须得联想到\(router**,但是在项目开发过程中 ...

  10. 有序全排列c++实现(递归)

    1 #include <iostream> 2 #include <algorithm> 3 #include <iterator> 4 #include < ...