[TOC]
## 問題01:什么是JDBC?
> 一套訪問數據庫的標準Java類庫
> 一套用于執行SQL語句的Java API
> 位于``` java.sql.* ```中

JDBC是Java訪問數據庫的標準規范(即定義接口),具體的實現由各大數據庫廠商來實現或提供(即數據庫驅動)。
* 建立連接
* 發送命令
* 處理數據
* 得到結果
## 問題02:JDBC開發步驟。

## 問題03:如何進行驅動注冊?
```
public static Class<?> forName(String className) throws ClassNotFoundException
```
Returns the Class object associated with the class or interface with the given string name.
Parameters: className - the fully qualified name of the desired class.
Returns: the Class object for the class with the specified name.
Throws: **ClassNotFoundException - if the class cannot be located**
> 如果拋出ClassNotFoundException異常,那么可以檢查一下數據庫驅動(*.jar包)是否加載到項目的classpath中。如果已經加載了jar包,那么檢查一下驅動路徑是否完全正確(包名和類名大小寫等)。
## 問題04:Class.forName()和DriverManager.regist()有什么區別?
> 在 com.mysql.jdbc.Driver中已經有一段靜態代碼塊用于向 DriverManager注冊一個Driver實例
> 采用DriverManager.registerDriver(Driver driver)方法,會造成Driver實例被注冊兩次
> 在開發過程中,建議采用Class.forName("包名.類名")的方式進行注冊
### 不同版本的driver
> MySQL 5.5及之前版本: com.mysql.jdbc.Driver
> MySQL 5.6及之后版本:com.mysql.cj.jdbc.Driver
## 問題05:如何獲得數據庫連接?(URL格式)
```
public static Connection getConnection(String url, String user, String password) throws SQLException
```
根據給定的數據庫URL、用戶名及密碼與數據庫建立連接,并返回一個Connection,其中user為數據庫用戶名, password為數據庫的密碼。
### 不同版本的url

MySQL 5.6及之后版本的MySQL數據庫的時區設定比中國時間早8個小時,需要在URL地址后面指定時區。
> mysql8.x的jdbc升級了,增加了時區(serverTimezone)屬性,并且不允許為空。
```
jdbc:mysql://hostname:port/databasename?serverTimezone=GMT%2B8
```
```
jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
```
## 問題06:Statement和PreparedStatement的創建和區別?
### 方法
| 方法 | 描述 |
| --- | --- |
| Statement createStatement() | 創建一個 Statement 對象來將 SQL 語句發送到數據庫 |
| PreparedStatement prepareStatement(String sql) | 創建一個 PreparedStatement 對象來將預編譯的SQL語句發送到數據庫 |
| CallableStatement prepareCall(String sql) | 創建一個 CallableStatement 對象來調用數據庫的存儲過程 |
| void setAutoCommit(boolean autoCommit) | 用于設置Connection對象的提交模式 |
| void commit() | 用于提交事務 |
| void rollback() | 用于回滾事務 |
### 區別
> PreparedStatement 接口繼承于Statement接口
> 不僅擁有Statement接口中的所有方法,還針對帶有參數的SQL語句的執行進行了擴展
> 創建和使用的時候注意參數
## 問題07:什么是SQL注入式攻擊?如何避免?
> 所謂SQL注入式攻擊,就是通過輸入特定數據和字符來構造(或者影響)SQL命令,進而欺騙服務器執行惡意的SQL命令。
### 示例:用戶登錄判斷
假設當前用戶輸入的用戶名保存在變量usr中,密碼保存在變量pwd中,
使用SQL語句``` select * from user where name=' "+usr+" ' and password = ' "+pwd+" ' ```來進行判斷。
當用戶輸入的用戶名和密碼為``` 1'or'1'='1 ```,SQL語句在拼接輸入變量之后會變為:
``` select * from user where name='1'or'1'='1' and password = '1'or'1'='1' ```
其中'1'='1' 為true,SQL語句的where條件將會失效,即只要數據表user存在數據,該SQL語句都能查詢到結果,從而實現注入式攻擊。
> 在實際的開發過程中,如果涉及到向SQL語句傳遞參數時,最好使用PreparedStatement接口進行實現。因為該接口不僅可以提高SQL的執行效率,還可以避免SQL語句的注入式攻擊。
## 問題08:PreparedStatement的優點有哪些?
1. 效率高
2. 易讀性高
3. 可維護性高
4. 安全性高
## 問題09:如何執行SQL語句?描述一下返回值?
| 方法 | 描述 |
| --- | --- |
| boolean execute() | 執行的SQL語句有查詢結果,則返回true,否則返回false |
| ResultSet executeQuery() | 執行查詢類型(select)的SQL語句 |
| int executeUpdate() | 執行修改類型(insert、update、delete)的SQL語句 |
## 問題10:如何對ResultSet進行遍歷?

```
getXXX(String columnLabel)
```
columnLabel表示的是字段名稱。
```
getXXX(int columnIndex)
```
columnIndex表示列的索引,索引值從1開始。
## 問題11:如何釋放資源?釋放資源的順序。

順序:
```
ResultSet → Statement(或PreparedStatement、CallableStatement)→ Connection
```
# 實踐:數據庫連接
## 1. 實驗目的
1. 能夠在Java Web項目中連接MySQL數據庫;
2. 能夠實現數據庫的連接與查詢;
3. 能夠根據實際開發抽象出數據庫工具類優化開發;
4. 能夠按照MVC模式對數據庫進行查詢和顯示。
## 2. 實驗要求
1. 設計功能菜單“文件列表”、“文件檢索”功能;
2. 使用FileMsg.java對文件表的信息進行封裝;
3. 編寫JDBCUtil工具類來加載驅動、封裝無參獲得連接方法以及重載資源釋放方法;
4. 編寫db.properties來保存數據庫信息;
5. 編寫ShowServlet作為控制層,實現對數據庫的查詢并將數據保存在域對象中;
6. 編寫SearchServlet作為控制層,實現對數據庫的模糊查詢并將數據保存在域對象中;
7. 在show.jsp視圖層顯示域對象中的用戶數據。
## 3. 實驗內容
### 1. 設計菜單欄

### 2. 編寫映射類

### 3. 編寫數據庫配置文件

### 4. 編寫數據庫工具類

### 5. 編寫顯示頁面show.jsp
1. 如果沒有文件則顯示空白提示

2. 如果有內容則顯示文件信息

### 6. 編寫查詢所有控制器ShowServlet

### 7. 編寫模糊查詢控制器SearchServlet

- 1課程概述
- 2環境配置
- 3MVC
- 3.1View
- 3.1.1前端基礎
- 3.1.2JSP語法
- 3.1.3JSP內置對象1
- 3.1.4JSP內置對象2
- 3.2Bean
- 3.3Controller
- 3.3.1Servlet
- 3.3.2Filter
- 3.3.3Listener
- 3.4EL&JSTL
- 4三層架構
- 4.1數據庫操作
- 4.1.1JDBC
- 4.1.2JDBC優化
- 4.2三層架構設計
- 4.3程序優化
- 4.3.1數據庫連接優化
- 4.3.2數據庫操作優化
- 4.4安全專題
- 4.4.1Ajax異步查詢
- 4.4.2CAPTCHA
- 4.4.3MD5&SHA
- 4.4.4Cookie
- 4.4.5分頁顯示
- 4.4.6文件上傳
- 4.4.7發送郵件
- 5企業級框架
- 5.0Maven
- 5.1MyBatis
- 5.2Spring
- 5.3SpringMVC
- 6實踐項目
- 6.1實驗1-用戶登錄(MVC)
- 6.2實驗2-訪問統計(Servlet高級)
- 6.3實驗3-三層架構
- 6.4實驗4-安全信息系統