本文例程下载:https://files.cnblogs.com/files/xiandedanteng/agumaster20200430-1.zip

之前的分页方案有点小瑕疵,这回修正了一下。

控制类:

package com.ufo.hy.agumaster.ctrl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import com.ufo.hy.agumaster.dao.StockMapper;
import com.ufo.hy.agumaster.entity.Stock; @Controller
public class ActionController {
@Autowired
private StockMapper stockMapper=null; /**
*
* @param m:model
* @param pageNo:page number
* @param pageSize:how many records in a page
* @param keyword:key word
* @return
*/
@RequestMapping("/liststock")
public String liststock(Model m,@RequestParam(value="pageNo",defaultValue="0") int pageNo,
@RequestParam(value="pageSize",defaultValue="20") int pageSize,
@RequestParam(value="keyword",defaultValue="") String keyword) { int start=pageNo*pageSize;
int end=start+pageSize;
List<Stock> list=stockMapper.pagedSearch(start, end,keyword);
m.addAttribute("list", list); int count=stockMapper.getPagedSearchCount(keyword);
int pageCount=count/pageSize;
m.addAttribute("pageCount", pageCount); m.addAttribute("pageNo", pageNo); return "liststock";
}
}

Mapper类:

package com.ufo.hy.agumaster.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider; import com.ufo.hy.agumaster.entity.Stock; @Mapper
public interface StockMapper { /**
* Paged search stocks
* @param start:Start line
* @param end: End line
* @param keyword: Search keyword
* @return
*/
@SelectProvider(type=StockSql.class,method="pagedSearch")
List<Stock> pagedSearch(int start,int end,String keyword); /**
* get all records' count of pagedSearch
* @param keyword
* @return
*/
@Select("select count(*) from hy_stock where name like '%${keyword}%' or code like '%${keyword}%' ")
int getPagedSearchCount(@Param("keyword") String keyword);
}

分页SQL:

package com.ufo.hy.agumaster.dao;

public class StockSql {
public String pagedSearch(int start,int end,String keyword) {
StringBuilder sb = new StringBuilder(); sb.append(" select b.* from ");
sb.append(" (select a.*,rownum as rn from ");
sb.append(" (select * from hy_stock where name like '%"+keyword+"%' or code like '%"+keyword+"%' order by id) a ");
sb.append(" where rownum<="+end+") b ");
sb.append(" where b.rn>"+start+" "); return sb.toString();
}
}

页面:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>List Stocks</title>
</head>
<body>
<div>
共:<span th:text="${pageCount}">pageCount</span>页
当前第:<span th:text="${pageNo}">pageIndex</span>页
</div> <table border="0px" width="160px">
<tr><td colspan="10"><input type="text" /></td></tr>
<tr>
<td><a th:href="@{/liststock?pageNo=1&pageSize=20}">首页</a></td>
<td><a th:href="'/liststock?pageNo=' + ${pageCount} +'&pageSize=20' ">末页</a></td>
<td>
<a th:if="${pageNo ne 1}" th:href="'/liststock?pageNo=' + ${pageNo - 1} +'&pageSize=20' ">上页</a>
<span th:if="${pageNo eq 1}">上页</span>
</td>
<td>
<a th:if="${pageNo ne pageCount}" th:href="'/liststock?pageNo=' + ${pageNo + 1} +'&pageSize=20' ">下页</a>
<span th:if="${pageNo eq pageCount}">下页</span>
</td>
</tr>
</table> <table border="1px" width="160px">
<caption>All Stocks</caption>
<thead>
<tr><th>id</th><th>code</th><th>name</th></tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td th:text="${item.id}">id</td>
<td th:text="${item.code}">name</td>
<td th:text="${item.name}">salary</td>
</tr>
</tbody>
</table>
</body>
</html>

结果:

本例还增加了热启动部署:

        <!-- Hot deployment -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

另外将 application.properties 中内容改为:

spring.profiles.active=oracle

而增加了文件application-oracle.properties,其中内容是:

spring.profiles.active=oracle

spring.datasource.url=jdbc:oracle:thin:@dev-dm-XXXXX1z.dev.jp.local:2050/SV_TRTMSAPDB
spring.datasource.username=RTMXXXXMIN2
spring.datasource.password=teXXXXXX01
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver logging.level.com.ufo.hy.agumaster.dao.StockMapper=debug
logging.config=classpath:logback.xml

这是为了未来迁移到MySQL数据库做准备,届时再增加一个application-mysql.properties,再将application.properties 中spring.profiles.active改为mysql即可。

--2020-04-30--

agumaster 分页方案的更多相关文章

  1. ES 分页方案

    ES 中,存在三种常见的分页方案: FROM, SIZE Search-After Scroll 下面将依次比较三种方案之间的 trede-off,并给出相应建议的应用场景. 常见分页,FROM, S ...

  2. mysql高效分页方案及原理

    很久以前的一次面试中,被面试官问到这个问题,由于平时用到的分页方法不多,只从索引.分表.使用子查询精准定位偏移以外,没有使用到其它方法. 后来在看其它博客看到了一些不同的方案,也一直没有整理.今天有时 ...

  3. Vue Element Tabe Pager 分页方案

    表格和分页分离的,但是使用中,却是结合在一起的. 分析 有以下方式触发查询: mounted 加载数据. 查询按钮 加载数据. pager 变化加载数据 加载数据函数: loadData 问题 mou ...

  4. Mysql 千万级快速查询|分页方案

    1.简单的 直接查主键id SELECT id FROM tblist WHERE LIMIT 500000,10 2对于有where 条件,又想走索引用limit的,必须创建一个索引,将where  ...

  5. SQL分页语句三方案

    方法一: SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ...

  6. MongoDB 分页查询的方法及性能

    最近有点忙,本来有好多东西可以总结,Redis系列其实还应该有四.五.六...不过<Redis in Action>还没读完,等读完再来总结,不然太水,对不起读者. 自从上次Redis之后 ...

  7. 浅谈SQL Server数据库分页

    数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...

  8. oracle,mysql,SqlServer三种数据库的分页查询的实例。

    MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如 ...

  9. SQL分页语句

    有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活.先看看单条 SQL ...

随机推荐

  1. JS 执行机制笔记

        js同步和异步同步 前一个任务结束以后再执行下面一个任务,程序的执行顺序与任务的排列顺序是一致的 同步任务都在主线程上执行,形成一个执行线 异步 前一个任务没结束之前程序还可以执行别的任务 j ...

  2. 利用maven的MyBatis Generator 插件自动创建代码

    1.首先创建Maven工程 2.修改pom.xml文件代码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...

  3. ALGEBRA-1 向量空间

    向量空间对加法封闭 对数乘封闭 直和:表示的唯一性

  4. C#开发笔记之03-为什么选择IsNotXXX方法而不是IsXXX方法?

    C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/959 访问. 为什么有时候要选择IsNotXXX方法而 ...

  5. JSONP跨域和CORS跨域的区别

    跨域: 由于浏览器中的javascript的同源策略,同源策略会阻止一个域的JavaScript脚本和另一个域的内容进行交互. 同源:协议,域名,端口,三者有一个不同即为跨域. 解决跨域有以下多种方法 ...

  6. Jmeter(二十一) - 从入门到精通 - JMeter断言 - 上篇(详解教程)

    1.简介 最近由于宏哥在搭建自己的个人博客可能更新的有点慢.断言组件用来对服务器的响应数据做验证,常用的断言是响应断言,其支持正则表达式.虽然我们的通过响应断言能够完成绝大多数的结果验证工作,但是JM ...

  7. c++知识点 2006-10-14 12:59

    这是自己开发一个简易的监控系统时的所用到的知识点. 第一个问题 在网络传输数据时可以传int,float,doule,char,等包括结构体类型但是除类类型外. 在调试中要常用merry寄存器. 应用 ...

  8. [源码解析] 当 Java Stream 遇见 Flink

    [源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...

  9. 汇编in和out实例解析

    直接看例子: IN AL,21H 从21H端口读取一字节数据到AL IN AX,21H 从端口地址21H读取1字节数据到AL,从端口地址22H读取1字节到AH MOV DX,379HIN AL,DX ...

  10. 【小白学AI】随机森林 全解 (从bagging到variance)

    文章转自公众号[机器学习炼丹术],关注回复"炼丹"即可获得海量免费学习资料哦! 目录 1 随机森林 2 bagging 3 神秘的63.2% 4 随机森林 vs bagging 5 ...