mysql jdbc 分页查询_JDBC与MySQL实现分页查询技术
由于通過ResultSet的光標實現數據分頁存在占用大量資源等性能方便的缺陷,所以,在實際開發中,通過采用數據庫的分頁機制來實現分頁查詢功能更為上上之策。
下面我就通過MySQL數據庫提供的分頁機制來作為案例。
創建Product類,用于封裝商品信息。該類是商品信息的JavaBean。
package bean;
import java.math.BigDecimal;
public class Product {
public static final int PAGE_SIZE = 2;//每頁記錄數
private int p_id;//編號
private String p_name;//名稱
private BigDecimal p_price;//價格
public int getP_id() {
return p_id;
}
public void setP_id(int p_id) {
this.p_id = p_id;
}
public String getP_name() {
return p_name;
}
public void setP_name(String p_name) {
this.p_name = p_name;
}
public BigDecimal getP_price() {
return p_price;
}
public void setP_price(BigDecimal p_price) {
this.p_price = p_price;
}
}
在Product類中,主要封裝了商品對象的基本信息。除此之外,我還定義了分頁的每頁記錄數。
創建ProductDao類,主要用于封裝商品對象的數據庫相關操作。該類是商品信息的Dao層。
package dao;
import bean.Product;
import util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class ProductDao {
/**
* 分頁查詢所有商品信息
*
* @param page 頁數
* @return List
*/
public List findAllProduct(int page) {
List productList = new ArrayList<>();//實例化List對象
Connection conn = null;//數據庫連接
PreparedStatement pstmt = null;//PreparedStatement
ResultSet rs = null;//結果集
//limit arg0,arg1 指定查詢起始位置,指定查詢數據所返回的記錄數
String sql = "select p_id,p_name,p_price from product order by p_id limit ?,?";//分頁查詢的SQL語句
try {
conn = DBUtil.getCon();//獲取數據庫連接
pstmt = conn.prepareStatement(sql);//獲取PreparedStatement
pstmt.setInt(1, (page - 1) * Product.PAGE_SIZE);//對SQL語句第一個參數賦值
pstmt.setInt(2, Product.PAGE_SIZE);//對SQL語句第二個參數賦值
rs = pstmt.executeQuery();//執行查詢操作
while (rs.next()) {
Product product = new Product();
product.setP_id(rs.getInt("p_id"));//對p_id屬性賦值
product.setP_name(rs.getString("p_name"));//對p_name屬性賦值
product.setP_price(rs.getBigDecimal("p_price"));//對p_price屬性賦值
productList.add(product);//將Product對象添加到List集合中
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, pstmt, conn);//關閉進行回收資源
}
return productList;
}
/**
* 查詢總記錄數
*
* @return count總記錄數
*/
public int findAllProductCount() {
int count = 0;//總記錄數
Connection conn = null;//數據庫連接
PreparedStatement pstmt = null;//PreparedStatement
ResultSet rs = null;//結果集
String sql = "select count(*) from product";//查詢總記錄數的SQL語句
try {
conn = DBUtil.getCon();//獲取數據庫連接
pstmt = conn.prepareStatement(sql);//獲取PreparedStatement
rs = pstmt.executeQuery();//執行查詢操作
if (rs.next()) {//光標向后移動,并判斷是否有效
count = rs.getInt(1);//對總記錄數賦值
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, pstmt, conn);//關閉回收資源
}
return count;//返回總記錄數
}
}
findAllProduct(int page) ;方法,用來查詢指定頁數的商品。page參數,用來指定頁數。
findAllProductCount();方法,用來查詢總記錄數。這樣一次查詢,即可知道總記錄數。
缺點在于,一旦有新的記錄產生,在下一次查詢后,有一些記錄不會被查詢到,因此待優化。
創建FindAllProduct類,該類是分頁查詢商品信息的Servlet對象。在doGet()方法中,對分頁請求進行處理。
package servlet;
import bean.Product;
import dao.ProductDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/FindAllProduct")
public class FindAllProduct extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int currPage = 1;//當前頁碼
if (request.getParameter("page") != null) {//判斷傳遞頁面是否有效
currPage = Integer.parseInt(request.getParameter("page"));//對當前頁碼賦值
}
ProductDao dao = new ProductDao();//實例化ProductDao
List productList = dao.findAllProduct(currPage);//查詢所有商品的信息
request.setAttribute("productList", productList);//將list放置到request中
int pages;//總頁數
int count = dao.findAllProductCount();//查詢總記錄數
if (count % Product.PAGE_SIZE == 0) {
pages = count / Product.PAGE_SIZE;//對總頁數賦值
} else {
pages = count / Product.PAGE_SIZE + 1;//對總頁數賦值
}
StringBuilder sb = new StringBuilder();//實例化StringBuffer
for (int i = 1; i <= pages; i++) {
if (i == currPage) {
sb.append("[").append(i).append("]");//構建分頁條
} else {
sb.append("").append(i).append("");//構建分頁條
}
}
sb.append(" ");//構建分頁條
request.setAttribute("bar", sb.toString());//將分頁條的字符串放置到request中
request.getRequestDispatcher("product.jsp").forward(request, response);//將請求轉發到product.jsp頁面中
}
}
FindAllProduct類主要做兩件事,獲取分頁查詢結果集和構造分頁條對象。
分頁查詢結果集的實現,通過調用ProductDao類的findAllProduct(page)方法。
構造分頁條對象是通過拼接html字符串進行構造,然后使用Servlet中的HttpServletRequest對象,將請求轉發至product.jsp頁面做出展示。
創建product.jsp頁面,該頁面通過EL表達式和JavaAPI獲取查詢的結果集與分頁條來分頁顯示商品信息數據。
Created by IntelliJ IDEA.
User: wen
Date: 2019/1/20
Time: 15:43
To change this template use File | Settings | File Templates.
--%>
商品展示商品信息展示 | ||||
| ID | 商品名稱 | 價格 | ||
| ${item.p_id} | ${item.p_name} | ${item.p_price} | ||
最后附上我封裝的JDBC連接數據庫的工具類DBUtil
package util;
/**
* 連接數據庫
*/
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
/**
* 獲取連接
*
* @return Connection
* @throws Exception 異常
*/
public static Connection getCon() throws Exception {
//數據庫驅動名字
String jdbcName = "com.mysql.jdbc.Driver";
Class.forName(jdbcName);
//數據庫協議地址
String dbUrl = "jdbc:mysql://129.204.104.108:3306/guowenrui?useUnicode=true&characterEncoding=UTF-8";
//數據庫用戶名
String dbUser = "guowenrui";
//數據庫密碼
String dbPassword = "gwr123";
Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
return conn;
}
/**
* 關閉連接
*
* @param stmt Statement
* @param conn Connection
* @throws Exception 異常
*/
public static void close(Statement stmt, Connection conn) throws Exception {
if (stmt != null) {
stmt.close();
if (conn != null) {
conn.close();
}
}
}
/**
* 關閉連接
*
* @param cstmt CallableStatement
* @param conn Connection
* @throws Exception 異常
*/
public static void close(CallableStatement cstmt, Connection conn) throws Exception {
if (cstmt != null) {
cstmt.close();
if (conn != null) {
conn.close();
}
}
}
/**
* 關閉連接
*
* @param pstmt PreparedStatement
* @param conn Connection
* @throws SQLException SQL異常
*/
public static void close(PreparedStatement pstmt, Connection conn) {
if (pstmt != null) {
try {
pstmt.close();
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 重載關閉方法
*
* @param pstmt PreparedStatement
* @param conn Connection
* @throws Exception 異常
*/
public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
if (rs != null) {
try {
rs.close();
if (pstmt != null) {
pstmt.close();
if (conn != null) {
conn.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
展示效果圖如下:
總結
以上是生活随笔為你收集整理的mysql jdbc 分页查询_JDBC与MySQL实现分页查询技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android ble 助手源码_[源码
- 下一篇: 阿里云安装mysql5.6_yum安装m