第14章WEB14-JDBC案例篇
阿新 • • 發佈:2018-04-13
javaweb JDBC案例篇 今日任務
? 使用JDBC技術完成對商品的添加修改查詢及分頁的操作
教學導航
教學目標
掌握JDBC的CRUD的操作
掌握JDBC的分頁操作
教學方法
案例驅動法
1.1 上次課內容回顧:
JSP的模式:
? 使用JDBC技術完成對商品的添加修改查詢及分頁的操作
教學導航
教學目標
掌握JDBC的CRUD的操作
掌握JDBC的分頁操作
教學方法
案例驅動法
1.1 上次課內容回顧:
JSP的模式:
- JSP的設計模式:
- JSP的模式一:JSP + JavaBean設計模式:
- JSP的模式二:JSP + Servlet + JavaBean設計模式:MVC設計模式.
- M:Model
- V:View
- C:Controller
- MVC和EE開發三層結構的關系:
- 反射:(*****)
- 獲得類的字節碼對象:Class對象.三種獲得的方式.
- 類名.class;
- 類的實例.getClass();
- Class.forName();
- 獲得構造器:Constructor
- 獲得屬性:Field
- 獲得方法:Method
JDBC的事務管理:
- 獲得類的字節碼對象:Class對象.三種獲得的方式.
- 事務的概念:指的是邏輯上的一組操作,要麽一起成功,要麽一起失敗.
- 事務的特性:
- 原子性:事務的不可分割
- 一致性:事務執行的前後,數據完整性保持一致.
- 隔離性:一個事務的執行不應該受到另一個事務的幹擾
- 持久性:事務一旦結束,將會永久修改到數據庫.
- 如果不考慮隔離性:
- 臟讀 :一個事務讀到另一個未提交的數據.
- 不可重復讀 :一個事務讀到另一個事務已經提交的update的數據,導致多次的查詢結果不一致.
- 虛讀 :一個事務讀到另一個事務已經提交的insert的數據,導致多次的查詢結果不一致.
- 解決讀問題:
- 未提交讀:以上情況都能發生.
- 已提交讀:解決臟讀,但是不可重復讀和虛讀有可能發生
- 重復讀:解決臟讀和不可重復讀,但是虛讀有可能發生.
- 串行化:可以解決以上的所有情況.
- JDBC進行事務的管理:
- Connection:
- setAutoCommit(boolean flag);
- commit();
- rollback();
- Connection:
- DBUtils進行的事務的管理:
1.2 完成對商品的CRUD的操作,進行條件查詢,分頁查詢.1.2.1 需求:
購物的網站中需要顯示商品的信息,在商品信息的顯示中,如果商品的信息比較多.需要將比較多的商品進行分頁的顯示.進行條件查詢.同時對商品進行修改,插入,刪除.
1.2.2 分析:1.2.2.1 技術分析:
使用MVC設計模式JSP + Servlet + JavaBean + JDBC實現商品信息的CRUD的操作.
1.2.2.2 步驟分析:
【步驟一】:創建數據庫和表
- create database web_14;
- use web_14;
- create table
product
(pid
varchar (96),pname
varchar (150),market_price
double ,shop_price
double ,pimage
varchar (600),pdate
date ,is_hot
double ,pdesc
varchar (765),pflag
double ,cid
varchar (96)
);
【步驟二】:創建工程導入jar包. - msysql驅動
- c3p0的包
- dbutils的包
- beanUtils的包:兩個.
- JSTL的包:兩個
【步驟三】:創建包結構.
【步驟四】:創建一個首頁:
<h1>歡迎來到商品信息管理平臺</h1>
<h3><a href="${ pageContext.request.contextPath }/ProductFindAllServlet">查詢所有商品</a></h3>
1.2.3 代碼實現:1.2.3.1 商品的查詢的功能:
在首頁上點擊【查詢所有商品】鏈接:
提交到Servlet中:- 調用業務層-->調用DAO:
- 將商品列表保存到request域中:
- 轉發到商品列表頁面:
在商品列表的頁面中顯示商品:
1.2.3.2 商品的添加的功能:
在首頁點擊【添加】鏈接:跳轉到添加頁面.
在添加頁面中輸入信息:點擊【提交】提交到Servlet
在Servlet中: - 接收數據:
- 封裝數據:
- 調用業務層:
- 頁面跳轉
- 重復提交的問題:
- 添加完商品之後,轉發到一個頁面,刷新該頁面.
- 網速很慢,點擊提交的按鈕,其實已經在提交了但是網速慢,不停的點擊提交.
- 解決重復提交的根本解決辦法:令牌機制(一次性).
- 生成隨機的令牌保存在session中.
- 在表單的提交的時候,將隨機的令牌放入到表單的隱藏字段中.
- 在Servlet中獲得session中和表單中的令牌是否一致.
- 如果一致執行插入操作,不一致跳轉到其他頁面.將令牌銷毀.
- 代碼實現:
// 判斷是否是重復提交:
String token1 = (String)request.getSession().getAttribute("token");
String token2 = request.getParameter("token");
// 清空session中的令牌:
request.getSession().removeAttribute("token");
if(!token2.equals(token1)){
request.setAttribute("msg", "親!您已經提交過!請不要重復提交了!");
request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
return;
}
1.2.3.3 商品的信息的修改:
在列表頁面上點擊【修改】鏈接:
提交到Servlet:根據id查詢該商品.將商品的信息顯示到修改頁面:
在修改的頁面上修改數據,點擊【提交】按鈕:
提交到Servlet:完成商品信息的修改:
1.2.3.4 商品的信息的刪除:
在列表頁面上點擊【刪除】鏈接:
提交到Servlet:
調用業務層完成刪除的操作:
***** 擴展刪除多條記錄:
1.2.3.5 商品模糊查詢:
1.2.3.6 商品分頁顯示:
分頁條: 【首頁】【上一頁】[1][2][3][4]【下一頁】【尾頁】
分頁功能的實現: - 物理分頁:一次只查10條記錄,點擊下一頁,再去查詢後10條.使用SQL語句進行控制的分頁.
- 缺點:經常需要和數據庫交互.
- 優點:數據量特別大,不會導致內存的溢出.
- 邏輯分頁:一次性將所有數據全都查詢出來,根據需要進行截取.List集合進行控制. subList();
- 缺點:數據量如果特別大,容易導致內存溢出.
- 優點:與數據庫交互次數少.
- 不同的數據庫對分頁的語句也是不一樣的:
- MYSQL進行分頁: 使用limit關鍵字.
- select * from xxx where .. Group by ... Having ... Order by ... limit a,b; -- a:從哪開始 b:查詢的記錄數.
- 根據頁數計算 limit後面的兩個參數:
- currPage begin pageSize
1 0 10
2 10 10
3 20 10 - begin = (currPage - 1) * pageSize;
- currPage begin pageSize
- 參數的傳遞:
- 前臺--->後臺:currPage
- 後臺--->前臺:currPage,totalPage(總頁數),totalCount(總記錄數),pageSize,List集合.
- 使用JavaBean封裝參數:
- 後臺--->前臺:傳遞一個JavaBean就可以.
- Oracle進行分頁: 使用SQL語句嵌套.
- SQL Server數據庫進行分頁: 使用 top 關鍵字.
- MYSQL進行分頁: 使用limit關鍵字.
- 在首頁上添加一個分頁查詢的鏈接:
第14章WEB14-JDBC案例篇