1. 程式人生 > >JSP實現資料庫表資料分頁顯示並新增模糊匹配查詢

JSP實現資料庫表資料分頁顯示並新增模糊匹配查詢

一、JSP實現資料庫表資料分頁顯示大致有兩種方式:

  1. 取出符合條件的資料,放在資料結構或記憶體中,然後按頁數和每頁顯示的數量進行瀏覽。舉個栗子,假如當前有50條資料,我們需要檢視第二頁,每頁顯示20條資料,則我們需要檢視的是50條資料中第 (2 - 1) * 20 + 1 條到第 2 * 20 條資料,這個比較好理解;
  2. 需要多少資料取多少資料,在查詢資料庫時僅查詢當前頁數需要顯示的資料,可以利用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%>頁&nbsp;共<%=pageNum%>條記錄&nbsp;當前是第<%=number%>頁&nbsp;
            <a href="<%=rawQuery%>pageNum=0">首頁</a>&nbsp;
            <a href="<%=rawQuery%>pageNum=<%=number - 1%>">上一頁</a>&nbsp;
            <a href="<%=rawQuery%>pageNum=<%=number + 1%>">下一頁</a>&nbsp;
            <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;