在开发中我们进发现很多需求是让我们把查到的数据进行分页显示,
1、使用sql分页
我们可以使用limit关键字来对sql语句进行实现分页查询。
select * from 表名 limit [位移偏移量,] 显示行数
偏移量:相当于我们在浏览网页时选择的页数。
显示行数:每页显示的行数。
实例:通过对student表操作,显示不容的页,每页显示行数为10行
select * from student limit 0 , 10 ; //显示第一页的10行数据
select * from student limit 1 , 10 ; //显示第二页的10行数据
select * from student limit 2 , 10 ; //显示第三页的10行数据
select * from student limit 3 , 10 ; //显示第四页的10行数据
select * from student limit (n-1)*10 , 10 ; //显示第n页的10行数据
可以发现在使用sql实现分页查询时,我们是可以通过表达式来指定不同页数显示不同的行数。
接下来就在idea中使用java语言和mybatis框架来实现一下实现sql分页。
先创建一个student表,并插入几条数据
创建项目、导入依赖、核心配置类,数据库连接数据文件db.properties、我就不多说了。
创建实体类Student类(为了方便我在引入依赖坐标是加了一个lombok,可以省去实体类的get、set等代码)
package com.ltc.pojo;
import lombok.Data;
@Data
public class Student {
private Integer id;
private String sno;
private String sname;
private Integer age;
private String sex;
}
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
创建StudentDao接口(使用注解开发)
package com.ltc.dao;
import com.ltc.pojo.Student;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface StudentDao {
@Select("select * from student limit #{page},#{pageSize}")
List<Student> findStudentPaging(@Param("page") Integer page,@Param("pageSize") Integer pageSize);
}
测试:
import com.ltc.dao.StudentDao;
import com.ltc.pojo.Student;
import com.ltc.util.SqlSessionUtil;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class StudentTest {
@Test
public void findStudentPagingTest(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
int page=2; //简单的给一个页数
List<Student> students = studentDao.findStudentPaging((page-1)*10, 10);
for (Student student :students) {
System.out.println(student);
}
sqlSession.close();
}
}
测试结果
第一页数据
第二页数据
分页查询的好处
约束返回结果的数量可以减少数据表的网络传输量,也可以 提升查询效率 。如果我们知道返回结果只有1 条,就可以使用 LIMIT 1 ,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。