天天看點

day14-jdbc案例(簡單的curd&分頁)

回顧:
mvc
    jsp的設計模式1:
        jsp+javabean
    jsp的設計模式2:
        jsp+javabean+servlet
            jsp:展示資料
            javabean:封裝資料 封裝對資料的通路
            servlet:處理請求
    mvc:
        将業務邏輯 代碼 顯示相分離
        M:model 模型 封裝資料 封裝對資料的通路
        V:view     視圖 展示資料 目前由jsp擔任
        C:controller 控制 處理請求
    三層架構:
        web:
            作用:
                展示資料 
                
                接受請求
                調用service
                頁面的跳轉,資訊的生成
        service:
            作用:
                處理邏輯
                調用dao
                
        dao:
            作用:
                對資料庫的curd操作
    /
    反射:
        先擷取class對象,無所不能
        
事務:
    一件完整的事情.可以包含多個操作,操作要麼成功,要麼全部失敗
    mysql中的事務:
        預設是事務自動送出
        手動送出:
            1.關閉自動送出
            2.手動開啟一個事務
                start transaction;
                commit;
                rollback;
    java中的事務:
        Connection接口的api
            setAutoCommit(false):手動的開啟一個事務
            commit():送出
            rollback():復原
    DBUitls使用事務:
        1.建立QueryRunner
            new QueryRunner():手動事務 調用他的方法的時候必須手動傳入一個連接配接,連接配接得手動關閉,事務得手動控制.
            new QueryRunner(DataSource ds):自動事務 調用他的方法的時候不需要傳入一個連接配接,連接配接自動關閉,事務自動控制.
        2.使用的方法 (手動事務)
            query(...)
            update(Connection conn .....)
    事務中要想保證在一個事務中,必須保證使用同一個連接配接
        方式1:向下傳遞連接配接
        方式2:将連接配接和目前線程綁定
            ThreadLocal
                常用的方法:
                    set(Object value)
                    Object get()
                    remove()
    事務的特性:
        ACID
        原子性 一緻性 隔離性 持久性
    若不考慮隔離性的時候會發生的問題
        髒讀
        不可重複讀
        虛讀
    隔離級别:
        read uncommitted:讀未送出 什麼問題都避免不了
        read committed:讀已送出 避免髒讀
        repeatable read:可重複讀 避免髒讀和不可重複讀
        serializable:串行化 避免所有的問題 鎖表
    安全:
        serializable>repeatable read>read committed>read uncommitted
    效率
        serializable<repeatable read<read committed<read uncommitted
    
    mysql中預設隔離級别 repeatable read
    oracle中預設隔離級别 read committed
/
案例1-展示所有商品
需求:
    點選首頁上的超連結,在頁面上展示所有的商品資訊
步驟分析:
    1.資料庫和表
        create database day14;
        use day14;
        create table `product` (
            `pid` varchar (96),
            `pname` varchar (150),
            `market_price` double ,
            `shop_price` double ,
            `pimage` varchar (600),
            `pdate` date ,
            `pdesc` varchar (765)
        ); 
        INSERT INTO `product` VALUES('1','小米 4c 标準版','1399','1299','products/1/c_0001.jpg','2015-11-02','小米 4c 标準版 全網通 白色 移動聯通電信4G手機 雙卡雙待');
        INSERT INTO `product` VALUES('10','華為 Ascend Mate7','2699','2599','products/1/c_0010.jpg','2015-11-02','華為 Ascend Mate7 月光銀 移動4G手機 雙卡雙待雙通6英寸高清大屏,纖薄機身,智能超八核,按壓式指紋識别!!選擇下方“移動老使用者4G飛享合約”,無需換号,還有話費每月返還!');
        INSERT INTO `product`  VALUES('11','vivo X5Pro','2399','2298','products/1/c_0014.jpg','2015-11-02','移動聯通雙4G手機 3G運存版 極光白【購機送藍牙耳機+藍牙自拍杆】新更新3G運作記憶體·雙2.5D弧面玻璃·眼球識别技術');
        INSERT INTO `product`  VALUES('12','努比亞(nubia)My 布拉格','1899','1799','products/1/c_0013.jpg','2015-11-02','努比亞(nubia)My 布拉格 銀白 移動聯通4G手機 雙卡雙待【嗨11,下單立減100】金屬機身,快速充電!布拉格相機全新體驗!');
        INSERT INTO `product`  VALUES('13','華為 麥芒4','2599','2499','products/1/c_0012.jpg','2015-11-02','華為 麥芒4 晨曦金 全網通版4G手機 雙卡雙待金屬機身 2.5D弧面屏 指紋解鎖 光學防抖');
        INSERT INTO `product`  VALUES('14','vivo X5M','1899','1799','products/1/c_0011.jpg','2015-11-02','vivo X5M 移動4G手機 雙卡雙待 香槟金【購機送藍牙耳機+藍牙自拍杆】5.0英寸大屏顯示·八核雙卡雙待·Hi-Fi移動KTV');
        INSERT INTO `product`  VALUES('15','Apple iPhone 6 (A1586)','4399','4288','products/1/c_0015.jpg','2015-11-02','Apple iPhone 6 (A1586) 16GB 金色 移動聯通電信4G手機長期省才是真的省!點選購機送費版,月月送話費,月月享優惠,暢享4G網絡,就在聯通4G!');
    2.建立一個項目
    3.導入jar包
        驅動 dbutils c3p0 jstl beanutils
    4.包結構
        utils工具類:datasourceutils
        導入c3p0配置檔案
    5.建立一個首頁index.jsp    
        添加一個超連結
    6.點選超連結 發送一個servlet上(FindAllServlet)
    7.FindAllServlet:
        調用service,查詢所有的商品 傳回值:list
        将list放入request域中,請求轉發 prodouct_list.jsp
        

案例2-添加商品
需求:
    在index.jsp添加一個超連結,跳轉到一個頁面,用來填寫商品資訊,點選儲存按鈕,将商品儲存到資料庫中
步驟分析:
    1.在index.jsp添加一個超連結 
        跳轉到add.jsp
    2.add.jsp放入一個表單
    3.表單送出到 AddProductServlet
        封裝資料
        調用service完成儲存操作
        跳轉到FindAllServlet
        (請求轉發和重定向)
有表單使用的時候若使用請求轉發會出現重複送出
    方案1:重定向
    方案2:令牌機制
    擴充:令牌機制
        在添加頁面上随機生成一個字元串,
            放入session中一份,放入表單中一份
            送出的時候在背景擷取兩個碼
            然後移除session中碼(隻使用一次)
            然後判斷兩個碼是否一緻,
            若不一緻就是重複送出了
        
/
案例3-修改商品資訊:
需求:
    在product-list.jsp每一個商品後面都有修改操作.點選修改操作,到了一個edit.jsp(将原來的資料展示出來),最後儲存就可以了
步驟分析
    先查詢後修改
    查詢步驟分析:
        點選修改連接配接的時候
            <a href="/day14/getProductById?pid=sss">修改</a>
        getProductById
            擷取pid
            通過pid擷取到商品 傳回值product
            将product放入request域中 請求轉發到edit.jsp
    //
    修改步驟分析:
        edit.jsp已經将商品的所有資訊展示出來
            需要将商品的id通過隐藏域放入表單中
            點選儲存,跳轉到editProductServlet
        editProductServlet:
            1.封裝資料
            2.調用servcie完成修改更新操作
            3.頁面跳轉到 FindAllServlet(重定向)
        
/
案例4-删除商品
需求:
    在清單頁面上,點選一個商品的删除操作,彈出一個提示,點選确定的時候,商品目前商品
步驟分析:
    先給删除添加事件
        單擊事件 彈出提示
            confirm()
        點選确定再去删除商品
            location.href="/day14/deleteProductById?pid=xxx" 相當于超連結
    deleteProductById
        1.擷取商品id
        2.調用service完成删除操作
        3.頁面重定向 FindAllServlet
        
擴充:删除多個商品:
需求:
    在每個商品前面添加複選框,勾選需要删除的商品,添加一個按鈕(删除選中),點選之後删除選中的商品
步驟分析:
    給每一個商品添加複選框(全選全不選),同時添加name屬性 值為"pid",value為目前商品的pid
    點選删除選中,需要将勾選上的商品的id送出到背景
        request.getParameterValues("pid")
        必須把所有的商品的放入一個表單中,
            需要在按鈕添加事件 
                需要先擷取表單,
                調用表單的submit()
    
    delCheckedServlet
        1.擷取所有要删除的商品的id      String[] ids
        2.調用servcie完成操作
        3.頁面重定向 FindAllServlet
        
/
擴充:案例5-多條件查詢 
需求:
    在product_list.jsp頁面上添加一個表單,輸入商品名稱 和 關鍵詞,點選确定,将符合條件的商品展示在目前頁面上
步驟分析:
    在product_list.jsp頁面上添加一個表單,添加一個查詢按鈕
    送出的路徑 findProductByCondition
        1.擷取兩個條件
        2.調用service完成查詢 傳回值:list
        3.将list放入request域中,請求轉發
    productDao
        基本sql:select * from product where 1=1
        若商品名稱不為空 and pname like ...
        若商品名不為空 and pdesc like ...
        
//
案例6-分頁展示商品
需求:
    将商品進行分頁展示
技術分析:
    分頁
///
分頁:
    将資料按照頁碼劃分,提高使用者的體驗度.
分類:
    實體分頁:(開發中經常使用)
        一次隻去資料庫中查詢目前頁需要的資料.
    邏輯分頁:
        一次性将所有資料查詢出來,放入記憶體(集合),每次查詢隻需要去記憶體中截取
mysql中分頁:
    limit 
    格式1:
        select ....  limit m,n;
        從索引為m條開始向後查找n條資料
        就是從第m+1條 到 第m+n條  []
    格式2:
        select .... limit n;
        等價于:select .... limit 0,n;
        
    每頁顯示3條資料 
        第一頁         limit 0,3
        第二頁         limit 3,3
        第三頁         limit 6,3
        第n頁         limit (n-1)*3,3
    
    擴充:
        oracle中 rownum
        sqlserver中 top
/
    每一頁需要的資料有
        目前頁内容    limit查詢 
        目前頁碼    從前台傳遞過去
        每頁顯示的條數 固定
        總條數        count(*)
        總頁數        總條數/每頁顯示的條數 Math.ceil(double)
    以後開發中一般會将這5個參數封裝一個javabean(PageBean)
        private List<T> list;//目前頁内容         查詢
        private int currPage;//目前頁碼          傳遞
        private int pageSize;//每頁顯示的條數    固定
        private int totalCount;//總條數            查詢
        private int totalPage;//總頁數            計算
        
/
步驟分析:
    最終結果:
        [首頁][上一頁][下一頁][尾頁]
        [首頁][上一頁]x x x[下一頁][尾頁]
        
    1.建立一個頁面 product_page.jsp
        有上面的内容
        還需要有目前頁的資料
    2.在首頁上有一個超連結,點選超連結将第一頁查詢出來
        <a href="/day14/showProductsByPage?currPage=1">分頁展示商品</a>
    3.showProductsByPage
        擷取第幾頁
        調用service 完成查詢操作,傳回值:pagebean
        将pagebean放入request域中,請求轉發product_page.jsp
        
    4.service.showProductsByPage
        傳回值pagebean
        查詢目前頁的資料
        查詢出總條數
    
    在頁面上展示
        1.展示目前也資料 
            通過<c:forEach items="${pb.list}">
        2.添加首頁 上一頁 ....的超連結
        3.判斷是否是第一頁.若是第一頁 不展示首頁和上一頁
        4.判斷是否是最後一頁 若是最後一頁 不展示尾頁和下一頁
        5.展示所有頁碼
            <c:forEach begin='1' end="${pb.totalPage}">
        6.判斷是否是目前頁
            若是目前頁 不加超連結
            若不是目前頁 添加超連結
            
    擴充:頁面多的時候 采用前五後四的方式
        隻需要控制begin和end
        begin 判斷目前頁-5>0?目前頁-5:1
        end 判斷 目前頁+4>總頁數?總頁數:目前頁+4