Java MySQL 分页查询实现指南
在Java应用中实现MySQL分页查询通常需要结合JDBC或ORM框架(如MyBatis、Hibernate),以下是几种常见的实现方式:

使用原生JDBC实现
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PaginationExample {
private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database";
private static final String USER = "username";
private static final String PASS = "password";
public static void main(String[] args) {
int page = 1; // 当前页码
int pageSize = 10; // 每页记录数
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM your_table ORDER BY id LIMIT ? OFFSET ?")) {
// 设置参数
stmt.setInt(1, pageSize);
stmt.setInt(2, (page - 1) * pageSize);
ResultSet rs = stmt.executeQuery();
// 处理结果集
while (rs.next()) {
// 获取数据并处理
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用MyBatis实现
Mapper接口
public interface UserMapper {
@Select("SELECT * FROM users ORDER BY id LIMIT #{pageSize} OFFSET #{offset}")
List<User> selectUsersByPage(@Param("offset") int offset, @Param("pageSize") int pageSize);
}
Service层调用
public class UserService {
@Autowired
private UserMapper userMapper;
public PageInfo<User> getUsersByPage(int pageNum, int pageSize) {
int offset = (pageNum - 1) * pageSize;
List<User> users = userMapper.selectUsersByPage(offset, pageSize);
// 可以使用PageHelper等分页插件
return new PageInfo<>(users);
}
}
使用Hibernate实现
HQL分页查询
public List<User> getUsersByPage(int page, int pageSize) {
int firstResult = (page - 1) * pageSize;
return entityManager.createQuery("FROM User ORDER BY id")
.setFirstResult(firstResult)
.setMaxResults(pageSize)
.getResultList();
}
使用Spring Data JPA实现
Repository接口
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u ORDER BY u.id")
Page<User> findAllUsers(Pageable pageable);
}
Service层调用
public Page<User> getUsersByPage(int page, int size) {
Pageable pageable = PageRequest.of(page, size);
return userRepository.findAllUsers(pageable);
}
使用PageHelper插件(MyBatis分页插件)
添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
使用示例
public List<User> getUsersByPage(int pageNum, int pageSize) {
// 开始分页
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAllUsers();
// 获取分页信息
PageInfo<User> pageInfo = new PageInfo<>(users);
return users;
}
注意事项
- 分页参数计算:
offset = (page - 1) * pageSize - 排序:分页查询通常需要配合排序,否则结果可能不稳定
- 大数据量性能:对于大数据量表,考虑使用索引优化
- 边界处理:处理最后一页可能记录不足的情况
- SQL注入:始终使用参数化查询防止SQL注入
高级优化
对于超大数据表的分页,可以考虑使用"延迟关联"技术:
SELECT * FROM users u JOIN (SELECT id FROM users ORDER BY id LIMIT 100000, 10) tmp ON u.id = tmp.id
这样可以避免查询大量不必要的数据。

