# 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進來的


抓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
---

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}那個是把路徑動態的抓下來, 當成絕對路徑用

---
更新是第一次查詢第二次更新加查詢
---
檔名改成 功能+CRUD
packageName 就是功能
---

jsp要去找其他servlet時,
把自身也當成servlet,
所以當前jsp位置就是在根目錄下,
路徑寫法就是直接寫檔名(不用斜線)或是前面加./ ,
但./就跟沒寫一樣