JDBC學習與模式應用[20181107]
問題:1.下圖中的list<Master>和ArrayList<Master>的意思
- 為什麼放在裡面?
筆記:學習和練習程式碼在day14中
一、JDBC
-》概述:JDBC(Java Data Base Connectivity,java資料庫連線)是一種用於執行SQL語句
的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類
和介面組成。JDBC提供了一種基準,據此可以構建更高階的工具和介面,
使資料庫開發人員能夠編寫資料庫應用程式,同時,JDBC也是個商標名
-》應用:JDBC
-》說明:
DriverManager:管理各種不同的Jdbc驅動
Connection:負責連線資料庫並擔任傳送資料的任務
Statement:由Connection產生,負責執行sql語句
ResultSet:負責儲存Statement執行後所產生的查詢結果
二、JDBC的連線
-》匯入的包
點選專案名--Build Path--add Ex..
-》載入驅動
Class.forName("com.mysql.jdbc.Driver");
說明:通過Class.forName載入驅動的路徑 :
在新增驅動後,通過com.運算子得到
-》獲得資料庫的連結
建立Connection變數(快捷鍵導包:Ctrl+Shift+O)
通過DriverManager.getConnection(url,name,pass)獲得Connection物件
報錯選擇報sql異常,如下圖:
說明:
URL:jdbc:mysql://localhost:3306/資料庫名
-》127.0.1.1代表的是本機
localhost:代表的是本機
3306:連線資料庫的介面
name:登入名
pass:登入名對應的密碼
三、對資料庫的操作
-》相關類的順序
載入驅動(Class.forname())
管理驅動(DriverManager)
產生連線(Connection)
命令(Statement)
執行()
結果集(ResultSet)
釋放資源
Next()使用方法
1、.next()方法的作用:指標指向下一條記錄,有記錄(有值)返回true並把記錄內容存入到對應的物件中,也就是obj.next()的obj中。如果沒有返回false。
2、.next()方法的應用:一般和ResultSet物件和while迴圈一起使用,去迭代結果集,並在迴圈中呼叫getXXX(intfieldIndex)/getXXX(String columnName)方法獲取欄位值。
-》資料庫的新增,修改,刪除
Class.forName("com.mysql.jdbc.Driver");--載入驅動
Connection conn=Class.forName("com.mysql.jdbc.Driver");--獲得連結物件
Statement stat=conn.createStatement();--獲得命令物件
String sql="";
int Line=statement.executeUpdate(sql_update);--執行獲得結果
說明:
更新:int ExecuteUpdate(String SQL):
以執行插入、刪除、更新等操作,返回值int型別,是執行該操作所影響的行數。
-》資料庫的讀取;
-》結果集:ResultSet
Statement.executeQuery()===ResultSet物件
返回型別是:ResultSet
-》ResultSet結果集的方法
next():返回的是Boolean型別 檢視下一行是不是資料(判斷結果集是否有元素)
獲得字串:getString()
獲得Int型別:getInt():
說明:獲取元素時:下標從1 開始
Private 加和不加的區別:
加了就是私有的能在這個類裡面使用,如果要在別的類裡面也可以使用的話就要寫屬性對應的get和set方法,如下圖。
tostring方法
-》獲得結果集顯示的方法
登入:if(){}
遍歷:while();
四、PreparedStatement:預編譯命令
-》說明:
Statement :Sql注入式攻擊沒有進行優化處理,安全性較差
PreparedStatement繼承了Statement,在Statement的基礎上進行擴張,
對注入式的攻擊進行了很好的保護
-》解決方案:
PreparedStatement:預編譯命令
-》使用
-》String sql = "update commoditytype set ct_name = ? where ct_id = ?;"
說明:將具體的資料用?佔位符表示
-》獲得PrepardStatement物件
建立物件:conn.prepareStatement(sql);請注意,是在建立物件的時候將SQL命令放入其中
-》佔位符:?====》需要解析佔位符
解析方式:ptmt.setString(1,name);//解析字串
ptat.setDouble(佔位符(問號)的位置, 要傳入的值);//解析double型別
ptat.setInt(佔位符(問號)的位置,要傳入的值);//解析int型別
說明:1代表的是第一個在佔位符的位置====不像下標一樣從0開始
持久化
含義:持久化是將程式中的資料在瞬時狀態和持久狀態間轉換的機制
持久化的方式:資料庫,普通檔案,xml檔案
持久化的主要操作:
讀取,查詢,保持,修改,刪除
一、模式:
1、Java中一共有23種模式
2、模組: "套路"或"管理程式碼的一種方式"
二、Java中的設計模式:
說明:共有23種,其中DAO模式;
備註:
三層開發框架是比較有名的開發框架(框架與模式區別),三層不是模式
表示層(UI)
三層 業務層(BIZ)
資料訪問層(DAO)
DAO模式:
DAO:(Data Access Object資料儲存物件)是一個數據訪問介面,資料訪問:顧名思義就是與資料庫打交道。夾在業務邏輯與(持久化資料)資料庫資源中間的訪問
組成:資料庫連線類(連線資料庫),vO類(entity)(實體),Dao介面,Dao的實現類及Dao的工廠類;
說明: (1234表示建立順序)
1.資料庫連線類(util):作用:連線並獲得連線物件以及關閉資料庫,通過資料庫連線可以大大簡化開發,在需要進行資料庫連線時,只需建立該類的例項,並呼叫其中的方法,就可以獲得資料庫連線物件,不必進行重複的操作
2.vo類(實體類):是一個包含屬性與表中欄位完全對應的類並在該類中提供Setter和Getter方法來設定並獲得該類中的屬性
3.Dao介面類:interface為介面
該類中定義了所有使用者操作如新增刪除查詢記錄等;不過因為是介面僅僅是定義,需要子類來實現
4.dao實現(implement)類:實現某個介面
Dao實現類實現了Dao介面並實現了介面中定義的所有方法,在Dao實現類中通過連線資料庫進行操作,
說明:Daoimpl
繼承DaoMaster,方法如下圖。
Tips:快速try catch
選擇程式碼塊,然後按快捷鍵(Alt+Shift+Z),選擇Try/catch block
模組的進化
A:Dao模式===三層=====MVC模式=====框架(SSH)
資料連線類:資料來源
A:資料來源的優點:一次定義處處使用
B:資料來源:資料實體工具
包:util 類名
C:資料來源的構成
1、驅動連線
2、管理建構函式,static模組
3、資源釋放destory();
介面:資料登陸
儲存過程:cellableStatement
解析:Cstmt.SetString(索引,繫結值);
測試類:rs.next();判斷是否存在值
問題:實現結果獲取禁止使用ResultSet作為返回值
異常:
登入得優化
A:標準 Boolean===登陸的標準
B:資源釋放Destory
結果集的查詢
A:實體表示實體:vo entity bean
B:返回值:List list
C:實體:因為每條記錄不一樣,所以實體的物件也應該是不一樣,將實體的例項化放在while迴圈裡;
結果集的查詢(泛型)
A:實體:實體就是一張表是一個物件
B:屬性是私有的,方法是公有的 建構函式 對欄位進行封裝、
C:思想
1、Sql語句 Select 欄位 form 表明
2、泛型集合 List<Student> list //Student:類名
持久化:查詢全部資料的返回值型別 List<Student>
3:物件:集合新增的元素物件==實體
4:實體的讀寫:ResultSet中獲取資料
5:結果集:stmt.executeQuery();方法中獲取值
6:編譯命令:Statement是通過Connection獲取資料
7:資料來源的公共方法的提取
D:測試獲取的資料便利
什麼是分層:
含義:一種化大為小,分而治之的軟體開發方法
分層的特點
每一層都有自己的職責
上一層不用關心下一層的實現細節,上一層通過下一層提供的對外介面來使用其功能
上一層呼叫下一層的功能,下一層不能呼叫上一層功能
分層開發的好處:
各層專注於自己功能的實現,便於提高質量
便於分工協作,提高開發效率
便於程式碼複用
便於程式擴充套件