文章目录
limit n,m 从第n个开始,往后取m个(注 不包括第n个数据)OFFSET n ROWS FETCH NEXT m ROWS ONLY 从第n行开始,往后取m行(注 不包括第n行数据)先说结论:
mysql写法:
SELECT * FROM user2
LIMIT (#{pageNum} - 1) * #{pageSize}, #{pageSize}
oracle写法:
SELECT * FROM user2
OFFSET (#{pageNum} - 1) * #{pageSize} ROWS FETCH NEXT #{pageSize} ROWS ONLY
直接看代码:
@Mapper
public interface PageTestDao {
// 查数据
// start:从第几条开始,向后要数据
// pageSize:一页多少条数据
List<UserEntity> getUserInfoByParams(@Param("nameParam") String name,
@Param("start") int start,
@Param("pageSize") int pageSize);
// 返回总条数
int getCountByParams(@Param("nameParam") String name);
}
<?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.csdn2.page_test.dao.PageTestDao">
<sql id="nameCondition">
<where>
<if test="nameParam != null and nameParam != ''">
name like CONCAT('%', #{nameParam}, '%')
</if>
</where>
</sql>
<select id="getUserInfoByParams" resultType="com.example.csdn2.page_test.entity.UserEntity">
SELECT * FROM user2
<include refid="nameCondition" />
LIMIT #{start}, #{pageSize}
</select>
<select id="getCountByParams" resultType="int">
SELECT COUNT(*) FROM user2
<include refid="nameCondition" />
</select>
</mapper>
@Service
@RequiredArgsConstructor
public class PageTestService {
private final PageTestDao pageTestDao;
public PageResponse<UserEntity> getPageTest(UserRequest userRequest) {
final List<UserEntity> userEntityList = pageTestDao.getUserInfoByParams(userRequest.getNameParam(),
userRequest.getStart(), userRequest.getPageSize());
final int total = pageTestDao.getCountByParams(userRequest.getNameParam());
return new PageResponse<>(userEntityList, total);
}
}
// 若分页的需求很多,可把分页相关的参数抽出来
@Data
public class PageRequest {
// 第几页
private int pageNum;
// 每页几行数据
private int pageSize;
// 计算从第几行开始
// 无论是limit、还是fetch 都是从某一行数据开始,向后取 pageSize 条数据
public int getStart() {
if (pageNum <= 0) {
return 0;
}
return (pageNum - 1) * pageSize;
}
}
// 入参
@EqualsAndHashCode(callSuper = true)
@Data
public class UserRequest extends PageRequest {
// 搜索参数
private String nameParam;
}
// 返回实体类,因为分页需要返回总条数,前端好做下标第几页
@Data
@AllArgsConstructor
public class PageResponse<T> {
private List<T> data;
// 总条数
private int total;
}
@RestController
@RequiredArgsConstructor
public class PageTestController {
private final PageTestService pageTestService;
@PostMapping("/page-test")
public PageResponse<UserEntity> getPageTest(@RequestBody UserRequest userRequest){
return pageTestService.getPageTest(userRequest);
}
}

先看一下List的截取
// 从第几个下标,到第几个下标
List<E> subList(int fromIndex, int toIndex);
public void test_ListSub() {
// 创建模拟数据,字符串 0-9的集合
final List<String> list = IntStream.range(0, 10)
.mapToObj(i -> i + "")
.collect(Collectors.toList());
System.out.println(list);
// 截取从下标0到5的数据
System.out.println(list.subList(0, 5));
// 截取从下标3到5的数据
System.out.println(list.subList(3, 5));
}

回归上述分页例子,代码改成如下:
dao层 不加 limit 条件
SELECT * FROM user2
name like CONCAT('%', #{nameParam}, '%')
server层:
public PageResponse<UserEntity> getPageTestByListSub(UserRequest userRequest) {
final List<UserEntity> allData = pageTestDao.getUserInfoByParamsNoLimit(userRequest.getNameParam());
// 下标开始
final int start = userRequest.getStart();
// 下标结束
final int end = start + userRequest.getPageSize();
// 截取数据
final List<UserEntity> userEntityList = allData.subList(start, end);
final int total = pageTestDao.getCountByParams(userRequest.getNameParam());
return new PageResponse<>(userEntityList, total);
}
其实PageHelper官网中有详细的文档以及例子:https://pagehelper.github.io/docs/howtouse/
下面例子只是讲其与springboot结合的核心内容,即快速开发:
引入相关jar包坐标到pom.xml中
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
dao层的sql不需要加 Limit 条件(因为PageHelper会自动帮忙加的)
SELECT * FROM user2
name like CONCAT('%', #{nameParam}, '%')
service层修改如下:
public PageInfo<UserEntity> getPageTest(UserRequest userRequest) {
// 告诉PageHelper数据要从第几页,每页多少条数据
// 注:一定要在select查询语句之前使用该方法,否则无效
PageHelper.startPage(userRequest.getPageNum(), userRequest.getPageSize());
// 查询sql
final List<UserEntity> userEntityList = pageTestDao.getUserInfoByParamsNotLimit(userRequest.getNameParam());
// 返回dto,使用插件自带的PageInfo
return new PageInfo<>(userEntityList);
// 上述逻辑还可以简写为:
// return PageHelper.startPage(userRequest.getPageNum(), userRequest.getPageSize())
// .doSelectPageInfo(() -> pageTestDao.getUserInfoByParamsNotLimit(userRequest.getNameParam()));
}
结果如下(与之前查询结果一致,没问题):
{
"total": 9,
"list": [
{
"name": "4a",
"pwd": "D"
},
{
"name": "5a",
"pwd": "E"
},
{
"name": "6a",
"pwd": "F"
}
],
"pageNum": 2,
"pageSize": 3,
"size": 3,
"startRow": 4,
"endRow": 6,
"pages": 3,
"prePage": 1,
"nextPage": 3,
"isFirstPage": false,
"isLastPage": false,
"hasPreviousPage": true,
"hasNextPage": true,
"navigatePages": 8,
"navigatepageNums": [
1,
2,
3
],
"navigateFirstPage": 1,
"navigateLastPage": 3
}
为什么说该插件很优秀呢,查看PageInfo的返回参数,核心内容:
// 当前页
private int pageNum;
// 每页的数量
private int pageSize;
// 当前页的数量
private int size;
// 总记录数
private long total;
// 总页数
private int pages;
// 结果集
private List<T> list;
// 以下内容都是其自动帮生成的
// 对于前端来说极其友好,前端分页功能的全部参数都包含了
// 前一页的页码
private int prePage;
// 下一页的页码
private int nextPage;
// 是否为第一页
private boolean isFirstPage = false;
// 是否为最后一页
private boolean isLastPage = false;
// 是否有前一页
private boolean hasPreviousPage = false;
// 是否有下一页
private boolean hasNextPage = false;
// 导航条上的第一页的页码
private int navigateFirstPage;
// 导航条上的第一页的页码
private int navigateLastPage;
查看PageHelper执行了什么sql语句

我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我需要在RubyonRails中实现无向图G=(V,E)并考虑构建一个Vertex和一个Edge模型,其中Vertex有_多条边。由于边恰好连接两个顶点,您将如何在Rails中执行此操作?您是否知道任何有助于实现此类图表的gem或库(对重新发明轮子不感兴趣;-))? 最佳答案 不知道有任何现有库在ActiveRecord之上提供图形逻辑。您可能必须实现自己的Vertex、EdgeActiveRecord支持的模型(请参阅Rails安装的rails/activerecord中的vertex.rb和edge.rb/test/fixtur
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht