成鵬致遠 | lcw.cnblog.com |2014-02-05
資料庫
1.JDBC概述
- JDBC(Java Database Connectivity,Java資料庫連線)提供了一種與平臺無關的用於執行 SQL語句的標準 Java API,可以方便的實現多種關係型資料庫的統一操作,它由一組用 Java語言編寫的類和介面組成
- 在 JDBC中提供的是一套標準的介面,這樣,各個支援 JAVA的資料庫生產商只要按照此介面提供相應的實現,則就可以使用 JDBC進行操作,極大的體現了 JAVA的可移植性設計思想
- 在 JDBC中所有的類和介面都儲存在 java.sql包中,在此包中規定了大量的介面
- JDBC本身提供的是一套資料庫操作標準,而這些標準又需要各個資料庫廠商實現,所以針對於每一個資料庫廠商都會提供一個 JDBC的驅動程式,目前比較常見的 JDBC驅動程式可以分為四類
- JDBC-ODBC橋驅動
- JDBC本地驅動
- JDBC網路驅動
- 本地協議純JDBC驅動
- 但是一般在開發中會將以上的四類簡單的分為三類
- JDBC-ODBC
- 純 JDBC連線
- 網路的 JDBC連線
- JDBC-ODBC橋驅動
- 是 SUN提供的一個標準的 JDBC操作,直接利用微軟的 ODBC進行資料庫的連線操作
- 這個操作效能較低
- 通常情況下不推薦使用這種方式進行操作
- JDBC本地驅動
- 直接使用各個資料庫生產商提供的 JDBC驅動程式,因為只能應用在特定的資料庫上,會喪失掉程式的可移植性,但是這樣的操作的效能較高
- JDBC本身提供的是一組類和介面,那麼各個資料庫生產商要實現這些介面,所以這些驅動程式都是需要單獨配置的,往往是以一組 jar包(zip包)的形式出現的,如果要使用的話,則肯定要配置 classpath
- 在開發中大部分情況都是基於一種資料庫的開發,所以一般使用此種模式是最多的
- JDBC網路驅動
- 這個驅動將 JDBC轉換為與 DBMS無關的網路協議,之後這種協議又被某個伺服器轉換為一種 DBMS協議
- 這種網路伺服器中介軟體能夠將它的純 Java客戶機連線到多種不同的資料庫上
- 所用的具體協議取決於提供者
- 通過,這是最為靈活的 JDBC驅動程式
- 本地協議純 JDBC驅動
- 這種型別的驅動程式將 JDBC呼叫直接轉換為 DBMS所使用的網路協議
- 這將允許從客戶機機器上直接呼叫 DBMS伺服器,是 Internet訪問的一個很實用的解決方法
- 資料庫的操作過程
- 開啟資料庫的服務
- 連線資料庫,連線的時候一般都要輸入使用者名稱和密碼
- 運算元據庫:建立表、查詢表、更新記錄
- 關閉
- Java操作類
- DriverManager:是一個最常用的類,使用此類可以取得一個資料庫的連線
- Connection:每一個 Connection的例項化物件都表示一個資料庫連線
- 資料庫的操作:Statement、PreparedStatement
- 資料庫的查詢:ResultSet
- 呼叫儲存過程:CallableStatement
- 小結
- JDBC的概念及作用
- JDBC的主要分類
- 主要操作類和介面
2.Mysql資料庫
- 資料庫的埠號是 3306,以後的 JDBC要想連線資料庫的時候必須使用此埠
- 手工選擇配置的資料庫編碼是 GBK
- 小結
- 會安裝及配置 MySQL資料庫(服務、命令、編碼)
- 基本的命令(連線、建庫、建表、刪除庫、刪除表)
3.SQL語法基礎
- SQL(Structured Query Language,結構查詢語言)
- SQL功能強大,概括起來,可以分成以下幾組
- DML(Data Manipulation Language,資料操作語言):用於檢索或者修改資料
- DDL(Data Definition Language,資料定義語言):用於定義資料的結構,如建立、修改或者刪除資料庫物件
- DCL(Data Control Language,資料控制語言):用於定義資料庫使用者的許可權
- MySQL中的資料型別
- 對於資料庫操作而言,查詢是最複雜的,查詢分為以下幾種
- 簡單查詢
- 限定查詢,指定查詢的條件
- 多表查詢
- 分組查詢
- 子查詢
- 父、並、補
- 在開發中,有一種情況:查詢部分資料,這在系統的分佈程式中經常使用:Limit
- 小結
- 熟練掌握增加、修改、刪除、簡單查詢的語句
- LIMIT語句,可以執行部分的查詢
4.JDBC操作步驟及資料庫連線操作
- JDBC本身是一個標準,所以其操作步驟是固定的,以後只需要修改很少的一部分程式碼就可以達到不同資料庫間的連線轉換功能
- JDBC操作步驟
- 載入資料庫驅動程式
- 連線資料庫
- 使用語句進行資料庫操作
- 關閉資料庫連線
- 配置資料庫的驅動程式
- 資料庫的驅動程式是由各個資料庫生產商提供,只要在 JAVA中要想連線資料庫,則肯定各個 DB要有所支援
- 將下載好的驅動程式放在 C盤目錄中,所以此時直接修改 CLASSPATH即可,在 windows中的環境變數中直接修改即可,如果沒有 classpath則自己增加一個新的
- 載入驅動程式
- 通過 Class.forName()語句可以載入一個驅動程式
- Class例項化需要一個完整的包.類名稱,此:“包.類”名稱的路徑就應該是驅動程式的名稱
- 如果出現找不到類,就表示 classpath配置有問題,檢視 classpath的配置
- 連線及關閉資料庫
- 在連線的時候肯定需要一個連線地址,這些連線地址將由各個資料庫生產商提供
- DriverManager說明
- 在 DriverManager中,提供的主要操作就是得到一個資料庫的連線
- getConnection()方法就是取得連線物件,此方法返回的型別是 Connection物件
- 不管使用哪種方式連線,都必須提供一個資料庫的連線地址,如果在連線資料庫的時候需要使用者名稱和密碼,則還需要將使用者名稱和密碼設定上
- 資料庫連線地址的形式
- JDBC雖然提供了與平臺無關的資料庫操作,但是各個資料庫的連線地址是有差異的,JDBC的連線地址實際上是由以下的三個部分組成
- jdbc協議:JDBC URL中的協議總是 jdbc
- 子協議:驅動程式名或資料庫連線機制(這種機制可由一個或多個驅動程式支援)的名稱,例如:mysql
- 子名稱:一種標識資料庫的方法。必須遵循“//主機名:埠/子協議”的標準 URL命名約定,例如://localhost:3306/mysql_db
- Connection
- 通過 DriverManager取得 Collection物件之後,實際上就表示資料庫連線上了,連線上了資料庫之後就可以進行資料庫的更新及查詢操作
- 操作的最後資料庫連線必須關閉
- 小結
- JDBC連線各個資料庫必須配置驅動程式
- JDBC的操作步驟
- 資料的連線操作,連線之後資料必須關閉
5.執行資料庫更新操作
- Statement介面
- 資料庫連線之後,下面就可以進行資料庫的具體操作了,如果要想對資料庫進行操作,則肯定要使用 Statement介面完成
- 此介面可以使用 Connection介面中提供的 createStatement()方法例項化
- 所有的操作都必須從連線展開,通過連線取得操作介面的例項
- 小結
- 總結出 JDBC的操作的流程
- 觀察 Statement進行資料庫更新的操作:增加、修改、刪除
6.ResultSet介面
- 資料庫的操作主要是分為更新和查詢操作,查詢操作時候會將全部的查詢結果返回給使用者
- ResultSet介面
- 使用 SQL中的 Select語句可以將資料庫的全部結果查詢出來,在 JDBC的操作中資料庫的所有查詢記錄將使用 ResultSet進行接收,並使用 ResultSet顯示內容
- 在操作的時候使用 Statement中的 executeQuery()方法進行資料庫的查詢操作,此方法的返回值就是 ResultSet介面
- 小結
- ResultSet查詢時是將全部的查詢結果以 ResultSet的形式返回
- 通過 ResultSet介面依次取出裡面的全部內容
- 所有的查詢結果實際上最終都是儲存在記憶體之中,所以對於資料庫的查詢操作來講,儘量不要全部查詢
7.PreparedStatement介面
- PreparedStatement是 Statement的子介面,屬於預處理操作
- 與直接使用 Statement不同的是:PreparedStatement在操作時,是先在資料表之中準備好了一條 SQL語句,但是此 SQL語句的具體內容暫不設定,而是之後再進行設定
- 通過連線物件 Connection得到一個 PreparedStatement的介面例項:PreparedStatement prepareStatemet(String sql) throws SQLException
- 之後使用一系列的 setXxx()方法設定內容,根據位置設定
- 如果執行更新語句的話,則會返回更新資料的記錄數
- 【注意】關於日期的輸入問題:在正常情況下都使用 java.util.Date表示日期,但是在 PreparedStatement中如果要想使用日期則必須使用 java.sql.Date型別
- 如果只是查詢,不需要設定任何內容的話,只需要建立完 PreparedStatement物件後直接查詢即可
- 【問題】在開發中到底是使用 PreparedStatement還是使用 Statement介面呢
- 實際上在開發應用中是不會使用 Statement介面的
- 因為其採用的是拼湊的 SQL語句形式,那麼這樣一來就可以造成 SQL的注入漏洞
- 小結
- PreparedStatement的基本工作原理,插入時,先點位,之後再設定內容
- 開發中建議不要使用 Statement介面,而使用 PreparedStatement介面完成
8.事務處理
- 事務:就是保證操作的一致性,所有的操作要麼全部成功,要麼全部失敗
- 事務本身具有:原子性、一致性、隔離性或獨立性、永續性四個特徵,也被稱為 ACID特徵
- 原子性:事務的最小的單元,是不可再分割的單元,相當於一個個小的資料庫操作,這些操作必須同時完成,如果有一個失敗了,則一切的操作將全部失敗
- 一致性:指在庫操作的前後是完全一致的,保證資料的有效性,如果事務正常操作則系統會維持有效性,如果事務出現了錯誤,則回到最原始狀態,也要維持其有效性,這樣保證事務開始時和結束時系統處於一致狀態
- 隔離性:多個事務可以同時進行且彼此之間無法訪問,只有當事務完成最終操作的時候,才可以看見結果
- 永續性:當一個系統崩潰時,一個事務依然可以堅持提交,當一個事務完成後,操作的結果儲存在磁碟中,永遠不會被回滾
- MySQL對事務的支援
- 操作事務步驟
- 取消掉自動提交:每次執行資料庫更新的時候實際上發出 SQL命令之後就已經提交上去
- 開始事務
- 進行一系列的操作
- 如果操作全部合格,則提交事務
- 如果發現有一個地方有問題,則可以進行回滾
- 或者設定一個 SAVEPOINT儲存事務的提交點
- 預設情況下所有的回滾,就是將全部的操作取消掉,而通過 SavePoint可以設定回退的位置
- 小結
- 事務的基本概念,如何在資料庫中處理事務
- JDBC操作事務的步驟
- 取消掉自動提交
- 執行多條 SQL語句
- 如果沒有異常,則提交事務
- 否則則進行事務的回滾操作
- 儲存點操作一般來說不是很常用
網路程式設計
1.IP(InternetProtocol)與InetAddress
- 在 java中支援網路通訊程式的開發,主要提供了兩種通訊協議:TCP協議、UDP協議
- 可靠的連線傳輸,使用三方握手的方式完成通訊
- 不可靠的連線傳輸,傳輸的時候接收方不一定可以接收的到
- 在 java中的所有網路程式的開發類都在 java.net包中存在
- 對於網路上,每一臺計算機也有自己名字,那麼這個名字就稱為 IP地址
- IP地址格式
- IP地址=網路地址 +主機地址
- 網路號:用於識別主機所在的網路
- 主機號:用於識別該網路中的主機
- IP地址中存在掩碼的功能主要是區分網路號和主機號
- 在實際中可以使用 127.0.0.1表示本機地址,或者直接使用 localhost也代表本機
- InetAddress類主要表示 IP地址,這個類有兩個子類
- Inet4Address:表示 IPV4協議
- Inet6Address:表示 IPV6協議
- InetAddress類的構造方法被隱藏起來了
- 小結
- 瞭解 IP地址的作用
- 掌握 InetAddress類的使用
2.URL與URLConnection
- URL(Uniform Resource Locator)統一資源定位符,可以直接使用此類找到網際網路上的資源(如:一個簡單的網頁)
- 構造方法:public URL(String protocol, String host, int port, String file) throws MalformedURLException
- 取得整個頁面的輸入流:public final InputStream openStream() throws IOException
- URLConnection
- 是封裝訪問遠端網路資源一般方法的類
- 通過它可以建立與遠端伺服器的連線,檢查遠端資源的一些屬性
3.UTLEncoder與URLDecoder
- Encoder最早是從電報中而來
- 使用 Encoder進行編碼
- 使用 Decoder進行解碼
- 在網路中經常存在編碼和解碼的操作
- 一般在進行網路程式開發時,傳遞中文的時候往往會需要進行編碼和解碼的操作
4.TCP
- 在 Java中使用 Socket(即套接字)完成 TCP程式的開發,使用此類可以方便的建立可靠的、雙向的、持續的、點對點的通訊連線
- 在 Socket的程式開發中,伺服器端使用 ServerSocket等待客戶端的連線,對於 Java的網路程式來講,每一個客戶端都使用一個 Socket物件表示
- 在 JAVA的網路程式中,客戶端只要符合連線的通訊協議,那麼伺服器端都可以進行接收
- ServerSocket:主要用在伺服器端程式的開發上,用於接收客戶端的連線請求
- 在伺服器端每次執行時都要使用 aceept()方法等待客戶端連線,此方法執行之後伺服器端進入阻塞狀態,直到客戶端連線之後程式才可以向下繼續執行,此方法的返回值型別是 Socket,每一個 Socket都表示一個客戶端物件
- 例項化 Socket類的時候要指定伺服器的主機地址和埠號
- 伺服器/客戶端程式需要編寫兩套程式碼才可以完成網路的開發,那麼實際上這個就表示的是 C/S架構,伺服器/客戶端,所以一般這種程式要同時維護兩套程式碼
- 還有另外一套架構:B/S,瀏覽器/伺服器,WEB開發的時候,這樣的程式只需要維護一套程式碼即可
- 小結
- TCP程式的開發
- 伺服器端的輸出就是客戶端的輸入,客戶端的輸出就是伺服器端的輸入
- 多執行緒在實際開發中的作用
5.UDP
- 在 TCP的所有操作都必須建立可靠的連線,這樣一來肯定會浪費大量的系統效能,為了減少這種開銷,在網路中又提供了另外一種傳輸協議:UDP
- UDP:不可靠的連線,這種協議在各個聊天工具中被廣泛的應用
- UDP開發中使用 DatagramPacket包裝一條要傳送的資訊,之後使用 DatagramSocket用於完成資訊的傳送操作
- UDP中主要是使用資料包協議傳送的
- 包含真實的要傳送的資訊,稱為資料包
- 小結
- UDP屬於不可靠的連線協議,伺服器傳送的資訊客戶端未必接收得到
- UDP採用資料包的協議傳送
- DatagramSocket和 DatagramPacket類的作用
新IO
1.緩衝區與Buffer
- 在 JDK1.4之後為了提升 IO的操作效能,也就是說為了提升伺服器操作的效能,提供了一個新的開發包,NIO,此包定義在 java.nio.*中
- 在整個 Java中,已有的 IO操作大部分都屬於阻塞操作,例如:鍵盤輸入資料,必須一直等待使用者輸入資料,否則程式無法向下繼續執行,還有 Socket程式中所有的伺服器必須通過 accept()方法一直等待使用者的連線,那麼這樣一來肯定會造成大量的系統資源浪費,所以在 Java的 JDK1.4之後增加了 NIO,在整個新 IO的操作中基本上都是使用緩衝區完成的
- 在整個 Java的新 IO中,所有的操作都是以緩衝區進行的,既然使用了緩衝區,則操作的效能將是最高的
- 新 IO基本上都是針對於基本資料型別的操作,但是沒有 boolean型別
- 在使用緩衝區的時候裡面有一個變數是非常有用處的
- position、limit、capacity
- 這三個變數完成了緩衝區的操作程式碼
- position:表示下一個緩衝區讀取或寫入的操作指標,每向緩衝區中寫入資料的時候此指標就會改變,指標永遠放到寫入的最後一個元素之後
- limit:表示還有多少資料需要儲存或讀取,position<=limit
- capacity:表示緩衝區的最大容量,limit<=capacity。此值在分配緩衝區時被設定,一般不會更改
- 可以在一個緩衝區中建立子緩衝區:slice(),長度為 position與 limit之間
- 子緩衝區是可以修改資料的
- 如果建立的緩衝區不希望被修改,則可以建立只讀緩衝區:asReadOnlyBuffer()
- 在緩衝區還有一種稱為直接緩衝區:如果建立了直接緩衝區,則 JVM將盡最大努力直接對其執行本機的 IO操作:public static ByteBuffer allocateDirect(int capacity)
- 小結
- NIO中都是以緩衝區進行操作的
- 緩衝區針對於各個基本資料型別都有實現,除了 Boolean型別之外
- 緩衝區中存在 position、limit、capacity三個狀態變數
- 緩衝區的操作中通過 allocate()建立緩衝區,或使用只讀、直接緩衝區
2.通道(Channel)
- 在新 IO中通道是一個可以用讀取和寫入資料的一種形式
- 通道可以用來讀取和寫入資料,通道類似於之前的輸入/輸出流,但是程式不會直接操作通道的,所有的內容都是先讀到或寫入到緩衝區之中,再通過緩衝區中取得或寫入的
- 通道與傳統的流操作不同,傳統的流操作是分為輸入或輸出流的,而通道本身是雙向操作的,即可以完成輸入也可以完成輸出的,即:通道都是操作緩衝區完成全部的功能的
- 可以使用 FileChannel()完成檔案的雙向操作
- 通道可以完成雙向的輸入和輸出操作
- 在通道中還有一種方式稱為記憶體對映
- 在幾種讀入的方式中
- RandomAccessFile:較慢
- FileOutputStream:較慢
- 緩衝讀取:速度較快
- 記憶體對映:速度最快
- MappedByteBuffer:使用此種方式讀取的內容是最快的
- 需要將一個輸入的操作流繫結在記憶體對映
- 記憶體對映在讀取的時候是最快的,但是執行寫入操作則有可能是非常危險的,因為僅僅只是改變陣列中的單個元素這種簡單的操作,就可以會直接修改磁碟上的檔案,因為修改資料與將資料儲存在磁碟上是一樣的
- 小結
- 通道的作用,明白通道是雙向的,可讀、可寫
- 記憶體對映讀取的時候速度是最快的
- 通道的操作都是以緩衝區為主的
3.檔案鎖:FileLock
- 在 Java新 IO中提供了檔案鎖的功能,這樣不一個執行緒將檔案鎖定之後,其它執行緒是無法操作此檔案的
- 要想進行檔案的鎖定操作,則要使用 FileLock類完成,此類的物件需要依靠 FileChannel進行例項化操作
- 關於鎖定的方式:
- 共享鎖:允許多個執行緒進行檔案的讀取操作
- 獨佔鎖:只允許一個執行緒進行檔案的讀/寫操作
- 小結
- FileLock類的基本操作
- 通過通道取得 FileLock的例項化物件
4.字符集
- 在整個 nio中,對於不同的平臺的編碼操作,java都可以進行自動的適應,因為可以使用字符集進行字元編碼的轉換操作
- 字符集:Charset
- 在 Java語言中所有的資訊都是以 UNICODE進行編碼的
- 但是在計算機的世界裡並不只單單存在一種編碼,而是多個,而且要是對編碼處理不好的,則就有可能產生亂碼
- 在 Java的新 IO包中提供了 Charset類來負責處理編碼的問題,該類還包含了建立編碼器(CharsetEncoder)和建立解碼器(CharsetDecoder)的操作
- 一般在讀取檔案的時候會按照指定的格式解碼,之後將解碼後的檔案內容重新編碼後輸出
- 小結
- Charset類的作用
- 編碼和解碼的操作
5.Selector
- 之前的 Socket程式在執行的時候,伺服器必須始終等待著客戶端的連線,那麼此時就會造成大量的資源浪費,所以引入了非阻塞的 IO操作,此時就可以通過 Selector完成
- 實際上在 NIO中主要的功能是解決伺服器端的通訊效能
- 使用 Selector可以構建一個非阻塞的網路服務
- 在新 IO中實現網路程式需要依靠 ServerSocketChannel類與 SocketChannel類
- 小結
- 在實際開發中使用 Selector較少
- 但是對於伺服器效能提高的操作程式碼上使用較多
- 使用 nio可以改善伺服器效能