Java实现分页功能常见的⼏种⽅法⽬录
⼀、limit关键字
通过mybatis的limit关键字分页,然后查询的List<Student>再封装进分页对象PageInfo⾥,包含分页数据等等。cotroller层
@Controller
public class StudentController {
@Resource
private StudentService studentService;
@Override
public PageInfo selectAllStudent(String province, Integer offset, Integer limit) {
List<Student> studentList = studentDao.selectAll(province,offset,limit);
PageInfo pageResult = new PageInfo(studentList);
return pageResult;
}
}
service层
@Service
@Transactional
public class ImplStudentService implements StudentService {
@Resource
private StudentDao studentDao;
@Override
public List<Student> selectAllStudent(String province, Integer offset, Integer limit) {
return studentDao.selectAll(province,offset,limit);
}
}
sql语句
select * from student where province = #{province} limit #{offset},#{limit}
⼆、hibernate分页
hibernate太⽼了,省略
三、截取List查询结果分页(简单粗暴)
...
List<StudentEnroll> students = AllStudents();
int count = 0;
if(studentEnrolls != null && studentEnrolls.size() > 0) {
count = studentEnrolls.size();
int fromIndex = pageNo * pageSize;
int toIndex = (pageNo + 1) * pageSize;
if(toIndex > count) {
toIndex = count;
}
List<StudentEnroll> pageList = studentEnrolls.subList(fromIndex, toIndex);
...
四、mybatis框架pageHelper插件分页
Spring整合:导⼊l
<!-- mvnrepository/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
配置项⽬配置⽂件(我在spring和mybatis整合的配置⽂件中配置的,如果在mybatis核⼼配置⽂件中配置,百度⼀下)
<bean id="sqlSessionFactory" class="batis.spring.SqlSessionFactoryBean">
<!-- 依赖数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 注册加载myBatis映射⽂件 -->
<property name="mapperLocations">
<array>
<value>classpath*:com/yyz/mapper/*l</value>
</array>
</property>
<!-- PageHelper分页配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使⽤下⾯的⽅式配置参数,⼀⾏配置⼀个,后⾯会有所有的参数介绍 -->
<value>
<!--helperDialect属性来指定分页插件使⽤哪种⽅⾔。-->
helperDialect=mysql
<!--分页合理化参数,设置为true时,pageNum<=0时会查询第⼀页,pageNum>pages(超过总数时),会查询最后⼀页。--> reasonable=true
<!--为了⽀持startPage(Object params)⽅法,增加了该参数来配置参数映射,⽤于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable-->
params=count=countSql
<!--⽀持通过Mapper接⼝参数来传递分页参数,默认值false,分页插件会从查询⽅法的参数值中,⾃动根据上⾯ params 配置的字段中取值,查到合适的值时就会⾃动分页。-->
supportMethodsArguments=true
<!--默认值为 false。设置为 true 时,允许在运⾏时根据多数据源⾃动识别对应⽅⾔的分页-->
autoRuntimeDialect=true
</value>
</property>
</bean>
</array>
</property>
<!-- 给数据库实体起别名 -->
<property name="typeAliasesPackage" value="ity;"/>
</bean>
SpringBoot整合:
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
配置项⽬l⽂件
#bybatis分页插件配置
pagehelper:
helper-dialect: mysql #数据库
reasonable: true
support-methods-arguments: true
params: count=countSql
标题分页插件参数:
分页插件提供了多个可选参数,这些参数使⽤时,按照上⾯配置⽅式中的⽰例配置即可。
分页插件可选参数如下:
dialect:默认情况下会使⽤ PageHelper ⽅式进⾏分页,如果想要实现⾃⼰的分页逻辑,可以实现
Dialect(com.github.pagehelper.Dialect) 接⼝,然后配置该属性为实现类的全限定名称。 使⽤⾃定义
dialect 实现时,下⾯的参数没有任何作⽤。
helperDialect:分页插件会⾃动检测当前的数据库链接,⾃动选择合适的分页⽅式。
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使⽤ SqlServer2012 数据库时,需要⼿动指定为 sqlserver2012,否则会使⽤ SqlServer2005
的⽅式进⾏分页。
offsetAsPageNum:默认值为 false,该参数对使⽤ RowBounds 作为分页参数时有效。 当该参数设置为 true
时,会将 RowBounds 中的 offset 参数当成 pageNum 使⽤,可以⽤页码和页⾯⼤⼩两个参数进⾏分页。
rowBoundsWithCount:默认值为false,该参数对使⽤ RowBounds 作为分页参数时有效。
当该参数设置为true时,使⽤ RowBounds 分页会进⾏ count 查询。
pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者
RowBounds.limit = 0 就会查询出全部的结果(相当于没有执⾏分页查询,但是返回结果仍然是 Page 类型)。
reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0
时会查询第⼀页,pageNum>pages(超过总数时),会查询最后⼀页。默认false 时,直接根据参数进⾏查询。
params:为了⽀持startPage(Object params)⽅法,增加了该参数来配置参数映射,⽤于从对象中根据属性名取值,
可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的⽤默认值,
默认值为
pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
supportMethodsArguments:⽀持通过 Mapper
接⼝参数来传递分页参数,默认值false,分页插件会从查询⽅法的参数值中,⾃动根据上⾯ params
配置的字段中取值,查到合适的值时就会⾃动分页。
aggregateFunctions:默认为所有常见数据库的聚合函数,允许⼿动添加聚合函数(影响⾏数),所有以聚合函数开头的函数,在进⾏
count 转换时,会套⼀层。其他函数和列会被替换为 count(0),其中count列可以⾃⼰配置。
重要提⽰:
当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使⽤PageHelper.startPage ⽅法不受影响。
service层
@Override
public ResponseResult selectAllStudent(Integer pageNum, Integer pageSize) {
Map<String,Object> map = new HashMap<>();
PageHelper.startPage(pageNum,pageSize);
List<Student> students = studentMapper.selectAllStudents();
PageInfo pageInfo = new PageInfo(students);
long total = Total();
map.put("result",pageInfo);
map.put("count",total);
return ResponseResultUtil.success(map);
}
详细请看 SpringBoot集成MyBatis的分页插件PageHelper
五、springData分页
service层
...
Sort.Order travelDate = new Sort.Order(Sort.Direction.DESC, "travelDate");
Sort.Order createdTime = new Sort.Order(Sort.Direction.DESC, "createdTime");
Sort sort = new Sort(travelDate, createdTime);
Pageable pageable = new PageRequest(page, pageSize, sort);
List<TravelItem> items = null;
try {
items = TravelItemsByTravelDateBetweenAndUserId(theStartDate, theEndDate, openId, pageable); } catch (Exception e) {
分页查询插件throw new DatabaseRelatedException("TravelRepository异常");
}
...
dao层:接⼝继承的是PagingAndSortingRepository接⼝,注意要加@Repository注解
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论