框架
java web項目總工分為兩部分:客戶端(前端)和服務端(后端)
客戶端發起請求,服務端接受請求并進行處理
發起請求的方式:from表單、jQuery + ajax
from表單 造成全局的變化,在發起請求時所有的數據都會被修改
jQuery + ajax 可以做到局部更新
tomcat是一個服務器,時刻等待請求到來
關系如圖所示
項目的工作流程類似于去飯店吃飯,
url 是請求路徑,相當于找指定的飯店,找到指定的服務員
type 是請求參數(有get? post 等),相當于指定服務方式
data 是攜帶的參數,相當于特定要求
success 是成功的回調函數,相當于上菜
服務端
接收參數,相當于接受菜單
邏輯處理,提供對應的服務,相當于后廚的加工
(如果需要)操作數據庫,數據庫就相當于倉庫
返回數據,即上菜
注:所有的信息不是存在后端,而是存在數據庫
get和post的區別
1.傳參方式不同
? ?post 傳參用data域
? ?get? 則在url中傳參?
? ?格式? ? url:" 對應Servlet類文件名?要傳的參數=參數值 "
? ?當參數不止一個時,用&? 等連接符
2.發起范圍不同
? ?get :只要能寫地址的地方都可以發起get請求(包括url 、瀏覽器的地址欄、前端中的<a href="? "></a>標簽.....)
? ?post: 請求發起需要ajax+jquery? ?或者form表單(現不用)
3.常用作用范圍
get常用于查找
post 常用于查找以外的功能,如添加、修改、刪除等
servlet
servlet 相當于小服務員,同時處理服務端的多種操作,對少量數據進行處理,數據量太大時效果不好
有軟件可將servlet的角色拆分開,分成controller 、 service 、 dao
controller專門接受客戶端的信息,和客戶端進行交互
service 進行各種各樣的邏輯處理
dao 專門操作數據庫,做處理后將內容返回service
service再將信息返回controller
controller再返回到客戶端
Navicat?
Mysql? ? ? 數據庫
Navicat? ?數據庫的可視化工具
表中一般有一個"id" 作為主鍵,一般默認勾選使用"不是null鍵",即自動遞增
數據庫中的表的關系
一對一
該情況下經常把兩個表合并成一張表,即將
id | name | age |
---|---|---|
1 | qqq | 26 |
2 | www | 36 |
3 | eee | 27 |
id | name | age |
---|---|---|
1 | aaa | 34 |
2 | sss | 27 |
3 | ddd | 28 |
變為
id | Wname | Wage | Mname | Mage |
---|---|---|---|---|
1 | qqq | 26 | sss | 27 |
2 | eee | 27 | aaa | 34 |
3 | www | 36 | ddd | 28 |
但方法不唯一,包括存外鍵、新建表格等
外鍵就是當前表格中的一個字段,但其取值有嚴格要求,必須來自于對應的另一張表中的主鍵
一對多
合成一張表時數據冗余
常用方法:把多的表設置外鍵,(少的表設置外鍵也會數據冗余)
有時也額外創造一張表存儲關系,但是效率不如上述方法高
如:學生表和班級表
id | c_name | 總分 |
---|---|---|
1 | 一班 | 30 |
2 | 二班 | 36 |
3 | 三班 | 27 |
id | name | age | c_id |
---|---|---|---|
1 | aaa | 13 | 1 |
2 | sss | 14 | 3 |
3 | ddd | 15 | 2 |
4 | zzz | 12 | 3 |
5 | xxx | 14 | 1 |
6 | ccc | 15 | 2 |
多對多
無論是兩張表合并,還是在一張表上單獨加外鍵,都會造成數據只能使用新建表存外鍵的方式
例如:學生表和課程表
id | c_name | 總分 |
---|---|---|
1 | java | 30 |
2 | 數據結構 | 36 |
3 | python | 27 |
id | name | age |
---|---|---|
1 | aaa | 13 |
2 | sss | 14 |
3 | ddd | 15 |
4 | zzz | 12 |
5 | xxx | 14 |
6 | ccc | 15 |
s_id | c_id |
---|---|
1 | 3 |
1 | 2 |
3 | 3 |
4 | 1 |
... | ... |
操作數據庫
操作數據庫需要對應的驅動,
比如: Mysql驅動Mysql數據庫
? ? ? ? ? ??SqlServerl驅動SqlServerl數據庫
因此為了簡化操作,對驅動進行了規范:JDBC
操作數據庫步驟:
1.加載驅動
Class.forName("com,mysql.jdbc.Driver")? ?----5.版本
Class.forName("com,mysql.cj.jdbc.Driver")? ?----8.版本
可能會報錯,因為沒有驅動
解決方法:
<1>異常拋出
? ?但是在調方法時可能再次產生異常,所以可以調方法時繼續拋出異常,也可以使用方法二
<2>try....catch....捕獲異常
? ?使用該方法時,正常情況下執行try中的內容,一旦有異常時,異常會被捕獲并執行catch中的內容
catch(捕獲指定異常內容)
eg:catch(ClassNotFoundException e)? 指定捕獲沒有找到class的異常
? ? ? ??catch(SQLException e)? 指定捕獲sql的異常
? ? ? ??catch(Exception e)? 捕獲所有的異常
2.添加用戶信息和url
?? ??? ??? ?String url="jdbc:mysql://localhost:端口號/需要連接的數據庫";
?? ??? ??? ?String username ="root";? ? --->? ?賬號一般情況下默認為root
?? ??? ??? ?String password ="10027018";? ?----> 密碼自設
3.驅動管理類調用方法進行連接,得到連接對象(一般繼續拋出異常)
驅動管理類? ? ?----->? ?DriverManager
調方法? ? ? ? ? ? ----->? ?DriverManager.getConnection(url,username,password);
連接類? ? ? ? ? ? ----->? ?Connection
4.創建執行sql的對象
? ?其對應的類為Statement
? ?用createStatement()方法
5.執行sql語句
? ? executeQuery(sql)? ? ? ? ?---->執行查找的方法
? ??executeUpdate(sql)? ? ? ?---->執行修改的方法,會返回受影響的行數
? ??
? ? ResultSet? ? ---->結果集? ?用于處理結果
6.對結果進行處理
? ? 獲取指定某項下的數據,需要調方法getInt("數據名")? ?Int根據數據類型變化
7.關閉/釋放資源
? ?資源名.close()