杰瑞科技汇

Java MySQL分页查询如何优化?

Java MySQL 分页查询实现指南

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

Java MySQL分页查询如何优化?-图1
(图片来源网络,侵删)

使用原生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;
}

注意事项

  1. 分页参数计算offset = (page - 1) * pageSize
  2. 排序:分页查询通常需要配合排序,否则结果可能不稳定
  3. 大数据量性能:对于大数据量表,考虑使用索引优化
  4. 边界处理:处理最后一页可能记录不足的情况
  5. SQL注入:始终使用参数化查询防止SQL注入

高级优化

对于超大数据表的分页,可以考虑使用"延迟关联"技术:

SELECT * FROM users u 
JOIN (SELECT id FROM users ORDER BY id LIMIT 100000, 10) tmp ON u.id = tmp.id

这样可以避免查询大量不必要的数据。

Java MySQL分页查询如何优化?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇