前言
因爲學了框架之後,前面知識,也是快忘記差不多了,我覺得框架這些東西你用來用去,還是用的別人的,你說你一直使用框架帶來的便捷,但是你只會使用框架,我感覺不能造出自己的框架,因爲程序員寫原生的寫多了,這些人覺得麻煩纔會去寫個框架用,避免重複造輪子,重複造輪子的意思是:重複造輪子就是指別人都已經寫好了,有現成的可以用,不過那些框架的思想還是可取的,精髓。一直使用別人的框架,我感覺自己會做不出框架給別人用
我在這篇文章表達我的看法
編程這個東西,都是慢慢來的,一步一個腳印走踏實,嗶哩嗶哩上面一些大up主,我看了很多,然後基本都說jsp不用學了,有人跟我說直接學springboot的也有,是這個外面微服務很火,這是事實,但是你的基礎沒打好,我覺得走都沒學會,難道還跑啊,當然這裏只是表達我得個人看法,不會不可怕,可怕得是你不會還不知道去學,這纔是最可怕得,人最大得敵人是自己,本人也是好多從網上學習的資源,我希望能共同進步
效果圖
分頁
爲什麼要分頁,一個頁面就那麼大,如果你的數據有一千條一萬條,用戶是不是得一直往下翻,翻到什麼時候去,對不對,分頁這個場景在項目開發中用得還是比較多得,分頁還有個好處是,減輕服務器的開銷
創建數據庫
數據庫 採用mysql 5.7
打開你的cmd 或者sqlYog,或者Navicat,至於IDEA直接在裏面操作就可以了,eclipse我忘記了,反正都是工具,記起來再說,-u代表 username 用戶名,-p passowrd 密碼
如果你懶得寫,把sql複製,粘貼,運行,我怕小白,所以我還是去演示下吧😀,我還是挺喜歡小白的,本人也不是什麼大佬啊,我只是喜歡記錄自己的學習歷程,當某然一天還能看見自己在博客上寫的代碼,😂,哈哈哈,這篇文章可能有點長
-- 創建一個分頁案列得數據庫
create database pagingcase;
use pagingcase;
-- 創建一個用戶的表 id 主鍵自增長,姓名 不爲空,性別,年齡,地址,郵箱
-- varchar 一個漢字佔兩個字符。英文和數字佔一個字符,int最大長度是11位在mysql中
create table user(
id int primary key auto_increment,
name varchar(20) not null,
sex varchar(5),
age int,
address varchar(32),
email varchar(50)
);
-- 添加測試數據 因爲id,自增長,就不用寫了
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
我這裏就直接原生吧cmd執行 🤪,至於我這個表情怎麼打出來的,用ctrl + Shift +b 就可以了,相信,其他博客主也會弄,或者你是什麼其他輸入法,找到表情就可以了,我是windows自帶的輸入法,沒換過,蠻好用的還🤣
開發
開發工具:eclipseSTS,跟eclipse開不多,只不過就是增加了spring集成插件
環境:tomcat8.5
數據庫:mysql 5.7
前端技術bootstarp
jar包mysql-connector-java-5.1.26,jsp的標籤庫的jar包
管他,三七二十一,既然我沒用SSM和springboot就先創建動態Web項目再說,Dynamic(動態的)
上面的目錄結構你們可能有點不清楚,我也不想去管這些,這個目錄不曉得你們熟悉不,按照這個目錄結構來
目錄結構解釋
- 項目名
- src 存放源代碼,自己寫controller(這裏有人叫Web,反正我喜歡叫controller(視圖層)servlet也可以),service(服務層),utils(工具類),dao(持久層),
- JRE System Library[版本信息jdk.1.8],運行時環境,你把這個remove掉,你會發現你啥玩不了,
我來補充下加上去
Apache Tomcat8.5 是指這個項目所依賴的服務器
Web App Libraries 這個是等下拷貝進來的jar包目錄,是自己導入的項目依賴 jar 包,Web App Libraries 下的所有 jar 包都可以在本地的項目名\WebContent\WEB-INF\lib 中找到。如果你直接在WEB-INF/lib文件夾下,拷貝一個 jar 包,刷新一下,會自動編譯到 Web App Library 中。圖上沒有,我還沒開始幹
build目錄是eclipse新建的 Dynamic web project 默認是將類編譯在 build 文件夾下的。可以在本地的項目路徑\項目要名\build\classes 下查看
WebContent:一般我們用 eclipse 的時候創建一個 Web Project,就會生成 WebContent 文件夾,用 MyEclipse 的時候創建一個 Web Project,就會生成 WebRoot 文件夾,這兩個文件夾作用一樣只是名稱不同而已。WebContent 用來存放 JSP,JS,CSS,圖片等文件,是項目訪問的默認路徑,也是工程的發佈文件夾,發佈時會把該文件夾發佈到 tomcat 的 webapps 裏。
META-INF目錄的出現:META-INF相當於一個信息包,目錄中的文件和目錄獲得Java 2平臺的認可與解釋,用來配置應用程序、擴展程序、類加載器和服務manifest.mf文件,在用jar打包時自動生成。
WEB-INF:WEB-INF 目錄是一個專用區域, 容器不能把此目錄中的內容提供給用戶。這個目錄下的文件只供容器使用,裏面包含不應該由客戶直接下載的資源。Web 容器要求在你的應用程序中必須有 WEB-INF 目錄。WEB-INF 中包含着發佈描述符(也就是 web.xml 文件), 一個 classes 目錄和一個 lib目錄, 以及其它內容。注意: 如果你的 Web 應用程序中沒有包含這個目錄, 它可能將無法工作 ,這個也是一個保護的目錄,不能被直接訪問,web project 網頁放在WEB-INF下面受保護,不能直接訪問,
web.xml:發佈描述符(deployment descriptors)是 J2EE Web 應用程序不可分割的一部分(也就是說是它的最小部分, 必不可缺的一部分)。它們在應用程序發佈之後幫助管理 Web 應用程序的配置。
WEB-INF/classes 目錄,編譯後的 Java類,這個文件夾是可選的。有一些配置文件需要放到 WEB-INF 的 classes 文件夾下,所以,通常的做法是手動在工程的 WEB-INF 文件夾下建立 classes 文件夾。如果不在工程的 WEB-INF 下手動建立 classes,發佈到 tomcat 時 tomcat 裏的WEB-INF 中也會有 classes 文件夾。
WEB-INF/lib 目錄存放jar包
相關文章參考
上面也有我自己的總結
關於mysql-connector的jr包怎麼獲取我已經在文章寫過了,在我的JDBC這篇文章寫了
至於這個jstl的jar包哪裏找呢,我帶你看,這個界面
百度搜索tomcat就可以了
tomcat官方地址
這個界面熟悉吧,taglibs(標籤庫的意思 tag標籤的意思 lib英文翻譯過來可不是庫哦),點擊Download
我覺得還是放下這個,看看,以後也方便自己
jar包放在這個目錄放在這裏,eclipse會幫我們加載上去,如果不想要哪個jar包直接在這裏右鍵delete刪除掉就可以了
不需要去下載兩個jar包standard.jar 和 jstl.jar,只需要其中一個因爲,由於JSTL 1.1已經過時,Apache已將其置於存檔中。選擇jakarta-taglibs-standard-current.zip文件。但是,如果您正在運行Servlet 2.5兼容容器並且web.xml聲明爲至少Servlet 2.5,那麼您應該能夠使用新的JSTL 1.2。需要注意的是JSTL 1.2並沒有要求standard.jar,這裏我上面選擇xml版本得時候 選得很高,Web.xml文件有2.3、2.4、2.5、3.0版本,其中有一個很重要的配置差異:
在Servlet 2.5 版本中可以這樣配置,多個url映射到同一個servlet。具體如下。
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/index</url-pattern>
<url-pattern>/login</url-pattern>
</servlet-mapping>
這些問題我都碰到過,具體得話,我就只能參考,我也說不清楚,反正,也忘記得差不多了,具體得話,可以自己去查下,知識太多了,好了現在jar包也有了,再去弄前端界面,導入前端界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 網頁使用的語言 這裏我直接引入的在線網址 bootstarp的css,js,jq -->
<head>
<!-- 指定字符集 -->
<meta charset="utf-8">
<!-- 使用Edge最新的瀏覽器的渲染方式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--
viewport視口:網頁可以根據設置的寬度自動進行適配,在瀏覽器的內部虛擬一個容器,容器的寬度與設備的寬度相同。
width: 默認寬度與設備的寬度相同
initial-scale: 初始的縮放比,爲1:1
-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3個meta標籤*必須*放在最前面,任何其他內容都*必須*跟隨其後! -->
<title>用戶分頁查詢</title>
<!-- 1. 導入CSS的全局樣式 -->
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css " rel="stylesheet">
<!-- 2.
jQuery導入,建議使用1.9以上的版本
jQuery (Bootstrap 的所有 JavaScript 插件都依賴 jQuery,所以必須放在前邊)
-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<!-- 3. 導入bootstrap的js文件 -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
<style type="text/css">
td, th {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h3 style="text-align: center">用戶信息列表</h3>
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th>編號</th>
<th>姓名</th>
<th>性別</th>
<th>年齡</th>
<th>地址</th>
<th>郵箱</th>
</tr>
<!-- 數據展示 -->
<c:forEach items="${usersPage.list}" var="u">
<tr>
<td>${u.id}</td>
<td>${u.name}</td>
<td>${u.sex}</td>
<td>${u.age}</td>
<td>${u.address}</td>
<td>${u.email}</td>
</tr>
</c:forEach>
</table>
<ul class="pagination">
<!-- 首頁功能 -->
<li>
<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=1&rows=5">
<span>首頁</span>
</a>
</li>
<!-- 首頁禁用和激活狀態 -->
<c:if test="${usersPage.currentPage == 1}">
<li class="disabled">
</c:if>
<c:if test="${usersPage.currentPage != 1}">
<li>
</c:if>
<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.currentPage-1 <= 0 ? 1 :usersPage.currentPage-1}&rows=5" aria-label="Previous" >
<span aria-hidden="true" class="glyphicon glyphicon-minus" style="font-size:20px"></span>
</a>
</li>
<!-- 展示多少頁 -->
<c:forEach begin="1" end="${usersPage.totalPage}" var="i">
<c:if test="${usersPage.currentPage == i}">
<li class="active"><a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${i}&rows=5">${i}</a></li>
</c:if>
<c:if test="${usersPage.currentPage != i}">
<li><a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${i}&rows=5">${i}</a></li>
</c:if>
</c:forEach>
<!-- 尾頁禁用和激活狀態 -->
<c:if test="${usersPage.currentPage == usersPage.totalPage }">
<li class="disabled">
</c:if>
<c:if test="${usersPage.currentPage != usersPage.totalPage}">
<li>
</c:if>
<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.currentPage+1 > usersPage.totalPage ? usersPage.totalPage:usersPage.currentPage+1}&rows=5" aria-label="Previous">
<span aria-hidden="true" class="glyphicon glyphicon-plus" style="font-size:20px"></span>
</a>
</li>
<!-- 點擊跳轉尾頁的功能 -->
<li>
<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.totalPage}&rows=5">
<span>尾頁</span>
</a>
</li>
</ul>
<!-- bootstarp中的清除浮動 -->
<div class="clearfix"></div>
<span class="glyphicon glyphicon-user">總記錄數(${usersPage.totalCount})條<span class="glyphicon glyphicon-minus"></span>共(${usersPage.totalPage})頁</span>
</div>
</body>
</html>
這裏有兩個jsp,因爲我的目的是爲了打開這個界面就有數據,這裏因爲是要直接跳轉到一個servlet,controller調用servce再調用dao去查詢數據庫,查到了保存在request作用域中,然後在轉發進入的頁面就可以獲取到你的值,返回到jsp頁面上
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:forward page="/UserPagingCaseServlet"></jsp:forward>
web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 因爲換了版本 你寫servlet的時候 不會幫你自動創建 顯示項目名稱 對了 xml 的文件第一行註釋不能寫的,有嚴格規範的-->
<display-name>pagingcase</display-name>
<!-- 表示默認打開的頁面,如果找不到,就會報404錯誤 -->
<welcome-file-list>
<welcome-file>my.jsp</welcome-file>
</welcome-file-list>
<!--
這裏的兩個servlet-name名稱
必須相同,不相同的情況我忘記了,你們可以留言,這裏什麼名字可以隨便取
servlet-class 是你寫的servlet 包名
url-pattern 路徑
-->
<servlet>
<servlet-name>UserPagingCaseServlet</servlet-name>
<servlet-class>club.adger.controller.UserPagingCaseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserPagingCaseServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
前端界面有了,jar包也有了,數據庫,庫,表都有了,加上去了,寫代碼咯🙃,開始掉頭髮咯,這裏因爲自己提前寫過了,下面的界面是我提前已經寫好的了,依次來說
這裏,建的包相信都能看懂,MVC設計模式,跟三層架構的概念,我不寫那麼多了,有時間我自己抽時間去寫,簡單一張黑馬的圖,來說明下
MVC開發模式
三層架構
我的第一步,先寫的Utils,這裏爲什麼沒有寫什麼db.properties啥的,我覺得原生的寫更牛點,一點點敲出來,靜態代碼塊,隨着類的的加載而執行,而且只執行一次
package club.adger.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class MyJdbcUtils {
/**
* @author adger
* 因爲是工具類 所以方法 基本爲靜態
* */
private final static String URL = "jdbc:mysql:///pagingcase?useUnicode=true&characterEncoding=utf-8";
private final static String USERNAME = "root";
private final static String PASSWORD = "root";
static{
//加載驅動
try{
Class.forName("com.mysql.jdbc.Driver");
}catch (Exception e) {
e.printStackTrace();
}
}
//獲取連接
public static Connection getConnection(){
//創建連接對象
Connection con = null;
try {
con = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
/**
* 關閉的方法
* */
public static void close(ResultSet res,PreparedStatement ps,Connection con){
try{
if(res != null)
res.close();
if(ps != null)
ps.close();
if(con != null)
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
然後去測試自己,寫的工具類,怎麼樣
package club.adger.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import club.adger.utils.MyJdbcUtils;
public class TestMyJdbcUtils {
/**
* 測試自己MyJdbcUtils能不能用
* */
public static void testMyJdbcUtils(){
Connection con = MyJdbcUtils.getConnection();
System.out.println(con);
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from user";
try {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t\t"+rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
MyJdbcUtils.close(rs, ps, con);
//下面是我調皮 自己搞的
System.out.println("\t\t\t\t\t\t▬▬▬▬.◙.▬▬▬▬\n" +
"\t\t\t\t\t\t ▂▄▄▓▄▄▂\n" +
"\t\t\t\t\t\t◢◤ █▀▀████▄▄▄▄◢◤ \n" +
"\t\t\t\t\t\t█關閉!測試成功!█▀▀▀▀╬ \n" +
"\t\t\t\t\t\t◥██████◤\n" +
"\t\t\t\t\t\t══╩══╩═");
}
}
public static void main(String[] args) {
testMyJdbcUtils();
}
}
ok,😋,能用了,香啊,自己寫的
再去寫實體類,javaBean
package club.adger.entity;
/**
* @author adger
* 這是一個用戶得實體類
* */
public class User {
private Integer id; // 用戶id
private String name;// 用戶名
private String sex; //性別
private Integer age;//年齡
private String address;// 地址
private String email; // 郵箱
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//方便自己去看數據
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + ", address=" + address
+ ", email=" + email + "]";
}
}
接下來就是重點了
這個PageBean是每一個都是關鍵,這裏你要清楚你的思想,然後纔去寫代碼,你要寫分頁功能,對吧,分頁中有什麼功能呢,前端展示的界面已經告送我們了,我框出的功能都是要寫的,這個上面的數據是我沒改的
總共多少多少頁,你是不是隻要sql語句這麼編寫就可以了,查到了16條數據,對吧
select count(*) from user;
那分頁呢,是不是sql語句只要這麼編寫啊,注意這裏索引是從0開始的,不然你查數據就是這麼查的,這個查詢語句只適用於MySQL
select * from user limit 0,5;
-- LIMIT 首行行號,要返回的結果集的最大數目
那如果第二頁呢,第三頁呢
好的,現在清楚了,PageBean應該寫哪幾個屬性,PageBean就是一個模型,到時候分頁的部分看成各個對象,從模型中取出數據就可以了
package club.adger.entity;
import java.util.List;
/**
* 分頁對象
* 這裏 加上泛型 是因爲 當如果 訂單模塊的列表需要去分頁,就可以直接使用放便 比如 List <User>,List <Order>
* */
public class PageBean<T> {
private int totalCount; // 從數據庫 查的總記錄數 select count(*) from user;
private int totalPage; //總頁碼 查的總記錄條數 / 每頁顯示的條數
private List<T> list; // 每頁的數據
private int currentPage; //當前頁碼 select * from limit ?,?; 代表前面的?
private int rows; //每頁顯示的條數 select * from limit ?,?; rows代表後面的?
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
/**
* 方便自己觀察數據,加上一個toString方法
* */
@Override
public String toString() {
return "PageUtils [totalCount=" + totalCount + ", totalPage=" + totalPage + ", list=" + list + ", currentPage="
+ currentPage + ", rows=" + rows + "]";
}
}
然後在逐步分析,我習慣是從控制層(controller)開始寫起,要分頁功能是吧,好的
- 接受用戶穿過來的參數,就是用戶一打開要看到,第一頁的數據啊,幾條呢,不可能,打開就是,第3頁,5條數據,我就不信,用戶能知道我的參數變量,除非研究了
- 調用服務層(service)
- 服務層去調用持久層(dao),就沒了啊
package club.adger.controller;
import java.io.IOException;
import java.util.List;
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 club.adger.entity.PageBean;
import club.adger.entity.User;
import club.adger.service.UserPagingCaseService;
import club.adger.service.impl.UserPagingCaseServiceImpl;
@WebServlet("/UserPagingCaseServlet")
public class UserPagingCaseServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.獲取參數 當前頁碼的參數
String currentPage = request.getParameter("currentPage");
//每頁顯示的條數
String rows = request.getParameter("rows");
if(currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
if(rows == null || "".equals(rows)){
rows = "5";
}
int cp = Integer.parseInt(currentPage);
int nowrows = Integer.parseInt(rows);
//轉換 因爲需要int 類型的
//2.調用service
UserPagingCaseService userService = new UserPagingCaseServiceImpl();
PageBean<User> userPage = userService.findUserByPage(cp,nowrows);
//2.將list存入request域中
request.setAttribute("usersPage", userPage);
//3.轉發到index.jsp 轉發不需要寫虛擬目錄
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
service接口跟實現類
package club.adger.service;
import club.adger.entity.PageBean;
import club.adger.entity.User;
public interface UserPagingCaseService {
/**
* 查詢所有用戶信息
* @return
* */
public PageBean<User> findUserByPage(int currentPage,int rows);
}
實現類
package club.adger.service.impl;
import java.util.ArrayList;
import java.util.List;
import club.adger.dao.UserPagingCaseDao;
import club.adger.dao.impl.UserPagingCaseDaoImpl;
import club.adger.entity.PageBean;
import club.adger.entity.User;
import club.adger.service.UserPagingCaseService;
public class UserPagingCaseServiceImpl implements UserPagingCaseService {
private UserPagingCaseDao userDao = new UserPagingCaseDaoImpl();
@Override
public PageBean<User> findUserByPage(int currentPage,int rows) {
List<User> list = new ArrayList<User>();
System.out.println(list);
//1.創建空的pageBean對象
PageBean<User> page = new PageBean<User>();
//3.調用Dao查詢總記錄數 需要展示總頁碼的數量
int totalCount = userDao.findTotalCount();
page.setTotalCount(totalCount);
//4.調用dao查詢list集合 計算開始記錄索引
int start = (currentPage-1)*rows;
//5.封裝到List集合裏面去
List<User> lis = userDao.findByPage(start,rows);
page.setList(lis);
// 因爲 總記錄條數 / 每頁幾條 如果每頁展示不下 就加 1 條顯示
int totalPage = totalCount % rows == 0 ? totalCount/rows : totalCount/rows + 1;
System.out.println(totalPage+"頁碼數");
page.setTotalPage(totalPage);
System.out.println(page);
page.setCurrentPage(currentPage);
page.setRows(rows);
return page;
}
}
dao的接口跟實現類
package club.adger.dao;
import java.util.List;
import club.adger.entity.User;
/**
* 用戶的dao
* */
public interface UserPagingCaseDao {
/**
* 查詢總記錄數
* */
public int findTotalCount();
/**
* 分頁查詢每頁記錄數
* */
public List<User> findByPage(int start, int rows);
}
impl實現
package club.adger.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import club.adger.dao.UserPagingCaseDao;
import club.adger.entity.User;
import club.adger.utils.MyJdbcUtils;
public class UserPagingCaseDaoImpl implements UserPagingCaseDao {
/**
* 查詢總記錄數
* */
@Override
public int findTotalCount() {
//1.註冊驅動 因爲自己寫的工具類 已經 用靜態代碼塊了 所以不用寫了 調用MyJdbcUtils的時候 就加載了
//2.建立鏈接
//這裏定義個變量 int count 是爲了等下拿數據庫查到的值 放在外面 也好返回
int count = 0;
Connection con = MyJdbcUtils.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
//3.執行SQL語句
String sql = "select count(*) from user";
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
//4.遍歷結果集
if(rs.next()){
count = rs.getInt(1);
System.out.println(count);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//5.關閉數據庫
MyJdbcUtils.close(rs, ps, con);
}
return count;
}
/**
* 分頁查詢每頁記錄數
* */
@Override
public List<User> findByPage(int start, int rows) {
List<User> list = new ArrayList<User>();
Connection con = MyJdbcUtils.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "select * from user limit ?,?";
ps = con.prepareStatement(sql);
ps.setInt(1, start);
ps.setInt(2, rows);
rs = ps.executeQuery();
while(rs.next()){
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setSex(rs.getString("sex"));
u.setAge(rs.getInt("age"));
u.setAddress(rs.getString("address"));
u.setEmail(rs.getString("email"));
System.out.println(u);
list.add(u);
System.out.println(list);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
MyJdbcUtils.close(rs, ps, con);
}
return list;
}
}
因爲,我覺得我的文字解釋,可能沒有就是自己口上說的好,這些代碼我能說出來什麼什麼意思,有一些底層還是不懂得,現在運行吧
效果圖,已經展示了,在這篇文章得開頭
這裏留一個問題,給你們,嘻嘻,就是如果,頁數太多了,那那個是不是得很多頁12345678910 11 12 12 13啥的對不對,其實我也沒看懂,網上說的,就是利用前端插件,bootstarp的分頁插件,等我鑽研出來了再寫吧,我也是回顧下,當然模糊查詢分頁類似差不多,如果這個分頁 有不懂的可以問我,當然我也在學習
歡迎加羣,一起學習交流
有趣的事
這裏換個編輯器,因爲培訓機構的開發工具事,eclipse所以爲了適應,我上面用的eclipse,最近我在github找了一套不錯的博客系統蠻好的源碼,還有第三方接口,短信,微信,QQ
博客系統地址,開源的
博客系統源碼能跑起來
前臺
後臺