JSP實現資料庫表資料分頁顯示並新增模糊匹配查詢
阿新 • • 發佈:2019-02-18
一、JSP實現資料庫表資料分頁顯示大致有兩種方式:
- 取出符合條件的資料,放在資料結構或記憶體中,然後按頁數和每頁顯示的數量進行瀏覽。舉個栗子,假如當前有50條資料,我們需要檢視第二頁,每頁顯示20條資料,則我們需要檢視的是50條資料中第 (2 - 1) * 20 + 1 條到第 2 * 20 條資料,這個比較好理解;
- 需要多少資料取多少資料,在查詢資料庫時僅查詢當前頁數需要顯示的資料,可以利用SQL語句如 limit 來實現。舉個栗子,假如我們需要檢視第二頁,每頁顯示20條資料,則使用的SQL語句應該是 SELECT * FROM table LIMIT 21, 20;
二、實現模糊匹配查詢:
- 使用MySQL中的LOCATE語句實現模糊匹配查詢功能;
如下程式碼使用了第一種方式實現分頁功能以及模糊匹配查詢功能:
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2018/8/7 Time: 16:38 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <%@ page import="java.sql.*" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.nio.charset.StandardCharsets" %> <html> <head> <title>Fisherman 的主頁</title> </head> <body> <h1>使用 JSP 分頁列出 emp 表資料</h1> <%! class Employee { private int empno; private String ename; private String job; private String hiredate; private float sal; private float comm; Employee(int empno, String ename, String job, String hiredate, float sal, float comm) { this.empno = empno; this.ename = ename; this.job = job; this.hiredate = hiredate; this.sal = sal; this.comm = comm; } int getEmpno() { return empno; } String getEname() { return ename; } String getJob() { return job; } String getHiredate() { return hiredate; } float getSal() { return sal; } float getComm() { return comm; } } %> <% String URL = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimeZone=UTC"; String USERNAME = "root"; String PASSWORD = "Root1234"; String DRIVER = "com.mysql.jdbc.Driver"; %> <% Connection conn = null; Statement stat = null; ResultSet rs = null; %> <% try { Class.forName(DRIVER); conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); stat = conn.createStatement(); // get query name from request String rawString = request.getParameter("ename"); String rawQuery; StringBuilder sql = new StringBuilder(); if (rawString == null || rawString.equals("")) { sql.append("SELECT * FROM emp"); rawQuery = "page_list_emp.jsp?"; } else { String queryName = new String(rawString.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); sql.append("SELECT * FROM emp WHERE LOCATE(").append("'").append(queryName).append("'").append(", ename) > 0"); rawQuery = "page_list_emp.jsp?ename=" + queryName + "&"; } rs = stat.executeQuery(sql.toString()); %> <% List employeeList = new ArrayList(); while (rs.next()) { int empno = rs.getInt(1); String ename = rs.getString(2); String job = rs.getString(3); Date hiredate = rs.getDate(4); float sal = rs.getFloat(5); float comm = rs.getFloat(6); employeeList.add(new Employee(empno, ename, job, hiredate.toString(), sal, comm)); } %> <% int pageNum = employeeList.size(); int pageSize = 5; String strNum = request.getParameter("pageNum"); // get current page number int number; if (strNum == null || strNum.equals("0")) { number = 1; } else { number = Integer.parseInt(strNum); } int maxPage; if (pageNum % 5 == 0) { maxPage = pageNum / 5; } else { maxPage = pageNum / 5 + 1; } if (number > maxPage) { number = maxPage; } int start = (number - 1) * pageSize; int end = number * pageSize; if (end > pageNum) { end = pageNum; } %> <table border="1" width="80%"> <tr align="center" valign="top"> <td colspan="6"> 共<%=maxPage%>頁 共<%=pageNum%>條記錄 當前是第<%=number%>頁 <a href="<%=rawQuery%>pageNum=0">首頁</a> <a href="<%=rawQuery%>pageNum=<%=number - 1%>">上一頁</a> <a href="<%=rawQuery%>pageNum=<%=number + 1%>">下一頁</a> <a href="<%=rawQuery%>pageNum=<%=maxPage%>">末頁</a> </td> </tr> <tr align="center"> <td colspan="6"> <form action="page_list_emp.jsp" method="get"> 僱員姓名:<input type="text" name="ename" title=""/><input type="submit" value="查詢"/> </form> </td> </tr> <tr> <td>僱員編號</td> <td>僱員姓名</td> <td>僱員職務</td> <td>僱員工資</td> <td>僱用日期</td> <td>僱員獎金</td> </tr> <% for (int j = start; j < end; j++) { Employee emp = (Employee) employeeList.get(j); %> <tr> <td><%=emp.getEmpno()%></td> <td><%=emp.getEname()%></td> <td><%=emp.getJob()%></td> <td><%=emp.getSal()%></td> <td><%=emp.getHiredate()%></td> <td><%=emp.getComm()%></td> </tr> <% } %> </table> <% } catch (Exception ex) { ex.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (conn != null) { conn.close(); } if (stat != null) { stat.close(); } } catch (SQLException e) { e.printStackTrace(); } } %> </body> </html>
建立表的SQL指令碼:
CREATE TABLE emp (
empno INT AUTO INCREMENT NOT NULL PRIMARY KEY,
ename VARCHAR(10) NOT NULL,
job VARCHAR(9) NOT NULL,
hiredate DATE NOT NULL,
sal FLOAT NOT NULL,
comm FLOAT NOT NULL
) ENGINE=INNODB CHARSET=UTF8;