---
# System prepended metadata

title: Hirbernate作業

---

# 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位置就是在根目錄下，
路徑寫法就是直接寫檔名(不用斜線)或是前面加./ ，
但./就跟沒寫一樣