首先先創建一個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(); } }