java的分頁原理詳解


首先先創建一個Student實體類。

import java.io.Serializable;
import java.util.Map;

public class Student implements Serializable {
    //實現序列化接口,用於對象的持久化
    private static final long serialVersionUID = -7476381137287496245L;
    //學生記錄id
    private int id; 
    //學生姓名
    private String stuName;
    //學生年齡
    private int age; 
    //學生性別
    private int gender; 
    //學生住址
    private String address;
    //空構造器
    public Student() {
        super();
    }
/**
 * 構造器
 * @param id  學生記錄id
 * @param stuName 學生姓名
 * @param age 學生年齡
 * @param gender 學生性別
 * @param address 學生住址
 */
    public Student(int id, String stuName, int age, int gender, String address) {
        super();
        this.id = id;
        this.stuName = stuName;
        this.age = age;
        this.gender = gender;
        this.address = address;
    }
/**
 *     該構造器用於將Map中的數據封裝到Student類中,
 *  在構造器中傳入Map參數。
 * @param map 
 */
    public Student(Map<String, Object> map){
        this.id = (Integer)map.get("id");
        this.stuName = (String)map.get("stu_name");
        this.age = (Integer)map.get("age");
        this.gender = (Integer)map.get("gender");
        this.address = (String)map.get("address");
    }
    /*
     * Getter Setter方法
     */
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
/*
 * 重寫toString方法
 * @see java.lang.Object#toString()
 */
    @Override
    public String toString() {
        return "Student [id=" + id + ", stuName=" + stuName + ", age=" + age
                + ", gender=" + gender + ", address=" + address + "]";
    }
    
}

創建Pager類

import java.io.Serializable;
import java.util.List;

public class Pager<T> implements Serializable {
    //實現序列化接口用於對象持久化
    private static final long serialVersionUID = -8741766802354222579L;
     // 每頁顯示多少條記錄
    private int pageSize;
    //當前第幾頁數據
    private int currentPage; 
    // 一共多少條記錄
    private int totalRecord; 
    // 一共多少頁記錄
    private int totalPage; 
    //要顯示的數據
    private List<T> dataList; 
    //構造函數
    public Pager(int pageNum, int pageSize, List<T> sourceList){
        //如果數據源為空 跳出該構造方法
        if(sourceList == null || sourceList.isEmpty()){
            return;
        }
        
        // 總記錄條數等於數據源的長度
        this.totalRecord = sourceList.size();
        
        // 每頁顯示多少條記錄
        this.pageSize = pageSize;
        
        //獲取最大頁數  所有記錄除以每頁顯示的條數
        this.totalPage = this.totalRecord / this.pageSize;
        if(this.totalRecord % this.pageSize !=0){
            this.totalPage = this.totalPage + 1;
        }
        
        // 當前第幾頁數據  如果參數pageNum超過最大頁數
        this.currentPage = this.totalPage < pageNum ?  this.totalPage : pageNum;
                
        // 起始索引  
        int fromIndex    = this.pageSize * (this.currentPage -1);
        
        // 結束索引
        int toIndex  = this.pageSize * this.currentPage > this.totalRecord ? this.totalRecord : this.pageSize * this.currentPage;
                
        this.dataList = sourceList.subList(fromIndex, toIndex);
    }
    //空構造器
    public Pager(){
        
    }
    //構造器
    public Pager(int pageSize, int currentPage, int totalRecord, int totalPage,
            List<T> dataList) {
        super();
        this.pageSize = pageSize;
        this.currentPage = currentPage;
        this.totalRecord = totalRecord;
        this.totalPage = totalPage;
        this.dataList = dataList;
    }
    /*
     * Getter 和  Setter 方法
     */
    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public int getTotalRecord() {
        return totalRecord;
    }

    public void setTotalRecord(int totalRecord) {
        this.totalRecord = totalRecord;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public List<T> getDataList() {
        return dataList;
    }

    public void setDataList(List<T> dataList) {
        this.dataList = dataList;
    }

}

創建一個常量Constant類

public class Constant {

    /**
     * 男性
     */
    public static final int GENDER_MALE = 1;
    
    /**
     * 女性
     */
    public static final int GENDER_FEMALE = 2;
    
    /**
     * 默認每頁顯示多少條記錄
     */
    public static final int DEFAULT_PAGE_SIZE = 5;
    
    /**
     * 默認顯示第幾頁記錄
     */
    public static final int DEFAULT_PAGE_NUM = 1;
    
    /**
     * 默認學生性別
     */
    public static final int DEFAULT_GENDER = 0;
}

 

 

創建StudentDAO類

public interface StudentDao {
    
    /**
     * 根據查詢條件,查詢學生分頁信息
     * 
     * @param searchModel
     *            封裝查詢條件
     * @param pageNum
     *            查詢第幾頁數據
     * @param pageSize
     *            每頁顯示多少條記錄
     * @return 查詢結果
     */
    public Pager<Student> findStudent(Student searchModel, int pageNum,
            int pageSize);
}

 創建一個JdbcUtil工具類

public class JdbcUtil {

    // 表示定義數據庫的用戶名
    private static String USERNAME ;

    // 定義數據庫的密碼
    private static String PASSWORD;

    // 定義數據庫的驅動信息
    private static String DRIVER;

    // 定義訪問數據庫的地址
    private static String URL;

    // 定義數據庫的鏈接
    private Connection connection;

    // 定義sql語句的執行對象
    private PreparedStatement pstmt;

    // 定義查詢返回的結果集合
    private ResultSet resultSet;
    
    static{
        //加載數據庫配置信息,並給相關的屬性賦值
        loadConfig();
    }

    /**
     * 加載數據庫配置信息,並給相關的屬性賦值
     * 從項目的jdbc.properties文件讀取信息
     * 然后設置連接參數
     */
    public static void loadConfig() {
        try {
            InputStream inStream = JdbcUtil.class
                    .getResourceAsStream("/jdbc.properties");
            Properties prop = new Properties();
            prop.load(inStream);
            USERNAME = prop.getProperty("jdbc.username");
            PASSWORD = prop.getProperty("jdbc.password");
            DRIVER= prop.getProperty("jdbc.driver");
            URL = prop.getProperty("jdbc.url");
        } catch (Exception e) {
            throw new RuntimeException("讀取數據庫配置文件異常!", e);
        }
    }

    public JdbcUtil() {

    }

    /**
     * 獲取數據庫連接
     * 
     * @return 數據庫連接
     */
    public Connection getConnection() {
        try {
            Class.forName(DRIVER); // 注冊驅動
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); // 獲取連接
        } catch (Exception e) {
            throw new RuntimeException("get connection error!", e);
        }
        return connection;
    }

    /**
     * 執行更新操作
     * 
     * @param sql
     *            sql語句
     * @param params
     *            執行參數
     * @return 執行結果
     * @throws SQLException
     */
    public boolean updateByPreparedStatement(String sql, List<?> params)
            throws SQLException {
        boolean flag = false;
        int result = -1;// 表示當用戶執行添加刪除和修改的時候所影響數據庫的行數
        pstmt = connection.prepareStatement(sql);
        int index = 1;
        // 填充sql語句中的占位符  依次填入預處理語句所需的參數
        if (params != null && !params.isEmpty()) {
            for (int i = 0; i < params.size(); i++) {
                pstmt.setObject(index++, params.get(i));
            }
        }
        result = pstmt.executeUpdate();
        flag = result > 0 ? true : false;
        return flag;
    }

    /**
     * 執行查詢操作
     * 
     * @param sql
     *            sql語句
     * @param params
     *            執行參數
     * @return
     * @throws SQLException
     */
    public List<Map<String, Object>> findResult(String sql, List<?> params)
            throws SQLException {
        //創建泛型為Map類型的List
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        //預處理語句參數索引
        int index = 1;
        pstmt = connection.prepareStatement(sql);
        //依次填入參數
        if (params != null && !params.isEmpty()) {
            for (int i = 0; i < params.size(); i++) {
                pstmt.setObject(index++, params.get(i));
            }
        }
        //執行預處理語句 獲得結果集
        resultSet = pstmt.executeQuery();
        //獲取源數據
        ResultSetMetaData metaData = resultSet.getMetaData();
        //獲取源數據的條數
        int cols_len = metaData.getColumnCount();
        //遍歷resultSet將數據放入map中   再將map放入list中
        while (resultSet.next()) {
            Map<String, Object> map = new HashMap<String, Object>();
            for (int i = 0; i < cols_len; i++) {
                String cols_name = metaData.getColumnName(i + 1);
                Object cols_value = resultSet.getObject(cols_name);
                if (cols_value == null) {
                    cols_value = "";
                }
                map.put(cols_name, cols_value);
            }
            list.add(map);
        }
        return list;
    }

    /**
     * 釋放資源
     */
    public void releaseConn() {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

創建JdbcSqlStudentDaoImpl類

/**
 * 使用mysql數據庫limit關鍵字實現分頁
 * 
 *
 * 
 */
public class JdbcSqlStudentDaoImpl implements StudentDao {
    //實現查詢的方法
    @Override
    public Pager<Student> findStudent(Student searchModel, int pageNum,
            int pageSize) {
        //存放獲取的數據
        Pager<Student> result = null;
        // 存放查詢參數
        List<Object> paramList = new ArrayList<Object>();
        //獲取查詢參數Name
        String stuName = searchModel.getStuName();
        //獲取查詢參數gender
        int gender = searchModel.getGender();
        //創建查詢語句
        StringBuilder sql = new StringBuilder(
                "select * from t_student where 1=1");
        //得到所有的記錄條數
        StringBuilder countSql = new StringBuilder(
                "select count(id) as totalRecord from t_student where 1=1 ");
        //如果stuName存在且不為空的話 在兩條sql語句后面加上查詢條件
        if (stuName != null && !stuName.equals("")) {
            sql.append(" and stu_name like ?");
            countSql.append(" and stu_name like ?");
            //查詢條件放入 查詢參數集合中
            paramList.add("%" + stuName + "%");
        }
        //如果gender的值 等於兩個常量中的其中一個時
        if (gender == Constant.GENDER_FEMALE || gender == Constant.GENDER_MALE) {
            sql.append(" and gender = ?");
            countSql.append(" and gender = ?");
            paramList.add(gender);
        }
        
        // 起始索引
        int fromIndex    = pageSize * (pageNum -1);
        
        // 使用limit關鍵字,實現分頁
        sql.append(" limit " + fromIndex + ", " + pageSize );
        
        // 存放所有查詢出的學生對象
        List<Student> studentList = new ArrayList<Student>();
        //創建JDBC工具類
        JdbcUtil jdbcUtil = null;
        try {
            jdbcUtil = new JdbcUtil();
            // 獲取數據庫鏈接
            jdbcUtil.getConnection(); 
            
            // 獲取總記錄數
            List<Map<String, Object>> countResult = jdbcUtil.findResult(countSql.toString(), paramList);
            //獲取List中的第一個Map
            Map<String, Object> countMap = countResult.get(0);
            //獲取Map中的鍵值為totalRecord的值
            int totalRecord = ((Number)countMap.get("totalRecord")).intValue();
            
            // 獲取查詢的學生記錄
            List<Map<String, Object>> studentResult = jdbcUtil.findResult(sql.toString(), paramList);
            //將Map中的數據遍歷出來封裝成student類 再放入studentlist中去
            if (studentResult != null) {
                for (Map<String, Object> map : studentResult) {
                    Student s = new Student(map);
                    studentList.add(s);
                }
            }
            
            //獲取總頁數
            int totalPage = totalRecord / pageSize;
            if(totalRecord % pageSize !=0){
                totalPage++;
            }
            
            // 組裝pager對象
            result = new Pager<Student>(pageSize, pageNum, 
                            totalRecord, totalPage, studentList);
            
        } catch (SQLException e) {
            throw new RuntimeException("查詢所有數據異常!", e);
        } finally {
            if (jdbcUtil != null) {
                jdbcUtil.releaseConn(); // 一定要釋放資源
            }
        }
        return result;
    }

}

創建service類

public interface StudentService {

    /**
     * 根據查詢條件,查詢學生分頁信息
     * 
     * @param searchModel
     *            封裝查詢條件
     * @param pageNum
     *            查詢第幾頁數據
     * @param pageSize
     *            每頁顯示多少條記錄
     * @return 查詢結果
     */
    public Pager<Student> findStudent(Student searchModel, int pageNum,
            int pageSize);
}

創建Servlet類

public class JdbcSqlServlet extends HttpServlet {
    
    private static final long serialVersionUID = -318134993070614515L;
    
    private StudentService studentService = new JdbcSqlStudentServiceImpl();
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 接收request里的參數
        String stuName = request.getParameter("stuName"); //學生姓名
        
        // 獲取學生性別
        //如果沒有獲取到就賦值為默認數值
        int gender = Constant.DEFAULT_GENDER;
        String genderStr = request.getParameter("gender");
        //如果符合條件就轉化為Int類型
        if(genderStr!=null && !"".equals(genderStr.trim())){
            gender = Integer.parseInt(genderStr);
        }
        
        // 校驗pageNum參數輸入合法性
        String pageNumStr = request.getParameter("pageNum"); 
        //如果頁碼數不是數字的話
        if(pageNumStr !=null && !StringUtil.isNum(pageNumStr)){
            request.setAttribute("errorMsg", "參數傳輸錯誤");
            request.getRequestDispatcher("jdbcSqlStudent.jsp").forward(request, response);
            return;
        }
         //顯示第幾頁數據
        int pageNum = Constant.DEFAULT_PAGE_NUM;
        //獲取頁碼數
        if(pageNumStr!=null && !"".equals(pageNumStr.trim())){
            pageNum = Integer.parseInt(pageNumStr);
        }
        
        int pageSize = Constant.DEFAULT_PAGE_SIZE;  // 每頁顯示多少條記錄
        String pageSizeStr = request.getParameter("pageSize");
        if(pageSizeStr!=null && !"".equals(pageSizeStr.trim())){
            pageSize = Integer.parseInt(pageSizeStr);
        }
        
        // 組裝查詢條件
        Student searchModel = new Student(); 
        searchModel.setStuName(stuName);
        searchModel.setGender(gender);
        
        //調用service 獲取查詢結果
        Pager<Student> result = studentService.findStudent(searchModel, 
                                                                pageNum, pageSize);
        
        // 返回結果到頁面
        request.setAttribute("result", result);
        request.setAttribute("stuName", stuName);
        request.setAttribute("gender", gender);
        
        request.getRequestDispatcher("jdbcSqlStudent.jsp").forward(request, response);
    }

}

加上一個正則工具類用於判斷輸入的參數是否為數字

public class StringUtil {
    
    /**
     * 校驗字符串是否是大於0的數字
     * @param string
     * @return
     */
    public static boolean isNum(String string){
        Pattern pattern = Pattern.compile("[1-9]{1}\\d*");
        Matcher matcher = pattern.matcher(string);
        return matcher.matches();
    }
}

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM