# Hirbernate作業 改bean/dao/servlet 加bean進去設定檔cfg(mapping class標籤) bean加annotation servlet 改連線部分然後 service呼叫dao做事 --- //新增方法先在interface ,他會提醒你去實作 先寫介面 再去寫實作 dao 和 service 的interface 這兩個長一樣 先做dao 再做service 因為service 是呼叫dao 介面就是一個框或者說是規範 介面就是單純寫方法和傳入的參數 實作才是實際上的方法內容 ``` servlet 需要servlet 來幫他做商業邏輯 service 則需要dao來幫他去dao拿資料 ``` service就是用來間接呼叫dao 然後可以放一些商業邏輯在裡面 --- 一個功能會有 1個service 兩個dao service 沒有介面只有class,單純只有叫dao做事 dao介面只有方法, 再dao實作寫完整內容,包含hibernate實際CRUD方法 session.persist --- 建立bean之後 在下面加個判斷 if(bean != null){ session.persist(bean放進來) //如果是boolean 方法,if內要多加return true } //return false 檢查傳入dao方法內的參數是不是空值 --- //如果是空值就設成空字串,就不會顯示null if(bean.getXXX()==null){ bean.setXXX("") } --- ## 如何用fetch +ajax處理頁面跳轉問題? 停留在同一頁面 或是特定頁面 --- ## hibernate的資料庫操作 1. 查詢: 單筆-get 多筆:createQuery 2. 新增:先get 再persist 3. 刪除:先get 再remove 4. 更新: 先get 再用setter去設定 --- # Fix import Shift + Ctrl + O 能快速把javax的import變成jakarta --- ./ ../ 有差別嗎? ./ 是當前資料夾 ../ 是父資料夾 --- 防呆就是做再度確認的東西 --- ### html 上面+ import 就變成jsp 能夠寫java程式 --- 從git 上面clone 然後import進來的 ![](https://hackmd.io/_uploads/S18quttSh.png) ![](https://hackmd.io/_uploads/Hyt3OFtr3.png) 抓name 對應getParameter - servlet 抓value - requestParameter抓 jsp網頁的name 得到value得字串 - 然後在servlet 透過if 或是switch 去比對 value字串, 相同就會去執行相應的CRUD方法,然後跳轉到後台頁面或是前台頁面 ------- 後台前台各一個servlet ```=sql create table topics( topicId int identity(3001,1) primary key, title varchar(100) not null, content varchar(max) not null, --topic_classification_id int not null, memno int not null, publishTime datetime2(0) default getdate(), editTime datetime2(0), --foreign key (topic_classification_id) references topic_classification(topic_classification_id), foreign key (memno) references member(memno) ); ``` --- ``` public ArticleBean insertData(ArticleBean article) { ArticleBean resultBean = session.get(ArticleBean.class, articcle.getArticleID()); if (resultBean == null) { session.persist(articcle); return articcle; } return null; } ``` 這個方法這邊是什麼意思啊 這是一個新增的方法,我們要傳ArticleBean 型態的articcle進去,回傳也是ArticleBean 型態的article 第一行建立一個ArticleBean型態的bean叫做resultBean ,會透過連線方式跟資料庫做查詢並把結果set到resultBean 之後會判斷如果有查到資料,才會新增近article裏面 沒有查到資料回傳空值 --- ArticleBean articleBean = new ArticleBean(); articleBean.setUserId(1); 我還沒跟會員串 所以設固定的userId 不然會出錯 因為我資料庫有reference 所以一定要處理會員編號 ArticleBean articleBean = new ArticleBean(); 單純就是我要傳bean --- ![](https://hackmd.io/_uploads/SycV2YtS2.png) jsp抓不到資料,就會null String JSP那邊ID媒改 servlet 這邊變數名稱改了,jsp也要跟著改。 --- ``` @Override public boolean deleteData(int articleID) { ArticleBean resultBean = session.get(ArticleBean.class, articleID); if (resultBean != null) { session.remove(resultBean); return true; } return false; } ``` 是一個刪除的方法,傳入int 型態的articleID參數 ,回傳值是boolean 但boolean基本用不到,不過你可以透過true /false去跳轉不同頁面 接下來就是建立一個ArticleBean,去直接查詢,有查到直接刪除,回傳resultBean ``` public ArticleBean updateData(ArticleBean article) { ArticleBean updateBean = session.get(ArticleBean.class, article.getArticleID()); if (updateBean != null) { updateBean.setArticleTitle(article.getArticleTitle()); updateBean.setArticleContent(article.getArticleContent()); updateBean.setHashtag(article.getHashtag()); return updateBean; } return null; ``` updateBean 是查詢的結果, 如果查詢結果不是空的, 就根據你get到得值去設定進去updateBean裏面 ``` public ArticleBean insertData(ArticleBean article) { ArticleBean resultBean = session.get(ArticleBean.class, article.getArticleID()); if (resultBean == null) { session.persist(article); return article; } return null; ``` 在servlet 的時候,因為你會創建bean 並把你用到的欄位都set進去bean裏面,並把bean傳進方法裏面 有查詢到就新增,沒查詢到就回傳空值 --- session.get(ArticleBean.class, article.getArticleID()); 這句意思是? 左邊表示回傳ArticleBean型態的資料 ,用articleID去select 左邊表示型態 只給一個參數ID也可以 但是要強制轉型 因為我昨天想給2個以上參數就不行 >應該要用hql 你說左邊.class 然後右邊放很多getter ,對啊 至於查全部左邊是from bean , 右邊是.class則代表 查你Bean裡面的全部屬性, 一樣回傳Bean型態資料 絕對路徑: 1. /專案名/servlet名 2. {pageContext.request.contextPath}那個是把路徑動態的抓下來, 當成絕對路徑用 ![](https://hackmd.io/_uploads/BklKAtFBh.png) --- 更新是第一次查詢第二次更新加查詢 --- 檔名改成 功能+CRUD packageName 就是功能 --- ![](https://hackmd.io/_uploads/rkGjEMcH3.png) jsp要去找其他servlet時, 把自身也當成servlet, 所以當前jsp位置就是在根目錄下, 路徑寫法就是直接寫檔名(不用斜線)或是前面加./ , 但./就跟沒寫一樣