Java JDBC
Java JDBC
JDBC(Java Database Connectivity)是一個(gè)獨(dú)立于特定數(shù)據(jù)庫(kù)管理系統(tǒng)、通用的SQL數(shù)據(jù)庫(kù)存取和操作的公共接口(一組API),定義了用來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)Java類庫(kù),使用這個(gè)類庫(kù)可以以一種標(biāo)準(zhǔn)的方法、方便地訪問(wèn)數(shù)據(jù)庫(kù)資源。
JDBC API
JDBC API 是一系列的接口,它使得應(yīng)用程序能夠進(jìn)行數(shù)據(jù)庫(kù)聯(lián)接,執(zhí)行SQL語(yǔ)句,并且得到返回結(jié)果。
Driver接口
?Java.sql.Driver 接口是所有JDBC 驅(qū)動(dòng)程序需要實(shí)現(xiàn)的接口。這個(gè)接口是提供給數(shù)據(jù)庫(kù)廠商使用的,不同數(shù)據(jù)庫(kù)廠商提供不同的實(shí)現(xiàn)
?在程序中不需要直接去訪問(wèn)實(shí)現(xiàn)了Driver接口的類,而是由驅(qū)動(dòng)程序管理器類(java.sql.DriverManager)去調(diào)用這些Driver實(shí)現(xiàn)
JDBC編程步驟:
加載與注冊(cè)JDBC 驅(qū)動(dòng)
?加載 JDBC 驅(qū)動(dòng)需調(diào)用Class類的靜態(tài)方法forName(),向其傳遞要加載的JDBC 驅(qū)動(dòng)的類名
?DriverManager 類是驅(qū)動(dòng)程序管理器類,負(fù)責(zé)管理驅(qū)動(dòng)程序
?通常不用顯式調(diào)用DriverManager 類的 registerDriver() 方法來(lái)注冊(cè)驅(qū)動(dòng)程序類的實(shí)例,因?yàn)镈river接口的驅(qū)動(dòng)程序類都包含了靜態(tài)代碼塊,在這個(gè)靜態(tài)代碼塊中,會(huì)調(diào)用DriverManager.registerDriver() 方法來(lái)注冊(cè)自身的一個(gè)實(shí)例
建立連接
?可以調(diào)用DriverManager 類的 getConnection() 方法建立到數(shù)據(jù)庫(kù)的連接
?JDBCURL 用于標(biāo)識(shí)一個(gè)被注冊(cè)的驅(qū)動(dòng)程序,驅(qū)動(dòng)程序管理器通過(guò)這個(gè)URL 選擇正確的驅(qū)動(dòng)程序,從而建立到數(shù)據(jù)庫(kù)的連接。
?JDBCURL的標(biāo)準(zhǔn)由三部分組成,各部分間用冒號(hào)分隔。
–jdbc:<子協(xié)議>:<子名稱>
–協(xié)議:JDBCURL中的協(xié)議總是jdbc
–子協(xié)議:子協(xié)議用于標(biāo)識(shí)一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
–子名稱:一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。子名稱可以依不同的子協(xié)議而變化,用子名稱的目的是為了定位數(shù)據(jù)庫(kù)提供足夠的信息
示例:
//對(duì)于 Oracle 數(shù)據(jù)庫(kù)連接,采用如下形式: jdbc:oracle:thin:@localhost:1521:sid //對(duì)于 SQLServer 數(shù)據(jù)庫(kù)連接,采用如下形式: jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid //對(duì)于 MYSQL 數(shù)據(jù)庫(kù)連接,采用如下形式: jdbc:mysql://localhost:3306/sid訪問(wèn)數(shù)據(jù)庫(kù)
- Statement
- PrepareStatement
- CallableStatement
Statement
?通過(guò)調(diào)用 Connection對(duì)象的 createStatement 方法創(chuàng)建該對(duì)象
?該對(duì)象用于執(zhí)行靜態(tài)的SQL 語(yǔ)句,并且返回執(zhí)行結(jié)果
?Statement接口中定義了下列方法用于執(zhí)行SQL 語(yǔ)句:
? –ResultSet excuteQuery(Stringsql)
? –int excuteUpdate(Stringsql)
ResultSet
?通過(guò)調(diào)用 Statement對(duì)象的excuteQuery()方法創(chuàng)建該對(duì)象
?ResultSet 對(duì)象以邏輯表格的形式封裝了執(zhí)行數(shù)據(jù)庫(kù)操作的結(jié)果集,ResultSet接口由數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn)
?ResultSet 對(duì)象維護(hù)了一個(gè)指向當(dāng)前數(shù)據(jù)行的游標(biāo),初始的時(shí)候,游標(biāo)在第一行之前,可以通過(guò)ResultSet對(duì)象的next()方法移動(dòng)到下一行
?ResultSet 接口的常用方法:
| 描述 | byte getByte(int columnIndex) | 返回指定字段的字節(jié)值 |
| Date getDate(int columnIndex) | 返回指定字段的日期值 | |
| 3 | Float getFloat(int columnIndex) | 返回指定字段的浮點(diǎn)值 |
| 4 | int getInt(int columnIndex) | 返回指定字段的整數(shù)值 |
| 5 | String getString(int columnIndex) | 返回指定字段的字符串值 |
| 6 | double getDouble(String columnName) | 返回指定字段的雙精度值 |
| 7 | long getLong(String columnName) | 返回指定字段的long型整值 |
| 8 | boolean next() | 返回是否還有下一字段 |
PreparedStatement
?可以通過(guò)調(diào)用Connection對(duì)象的 preparedStatement() 方法獲取 PreparedStatement 對(duì)象
?PreparedStatement 接口是 Statement的子接口,它表示一條預(yù)編譯過(guò)的SQL 語(yǔ)句
?PreparedStatement 對(duì)象所代表的SQL 語(yǔ)句中的參數(shù)用問(wèn)號(hào)(?)來(lái)表示,調(diào)用PreparedStatement 對(duì)象的 setXXX() 方法來(lái)設(shè)置這些參數(shù). setXXX() 方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是要設(shè)置的SQL 語(yǔ)句中的參數(shù)的索引(從 1 開(kāi)始),第二個(gè)是設(shè)置的SQL 語(yǔ)句中的參數(shù)的值
PreparedStatement vs Statement
?代碼的可讀性和可維護(hù)性.
?PreparedStatement 能最大可能提高性能:
–DBServer會(huì)對(duì)預(yù)編譯語(yǔ)句提供性能優(yōu)化。因?yàn)轭A(yù)編譯語(yǔ)句有可能被重復(fù)調(diào)用,所以語(yǔ)句在被DBServer的編譯器編譯后的執(zhí)行代碼被緩存下來(lái),那么下次調(diào)用時(shí)只要是相同的預(yù)編譯語(yǔ)句就不需要編譯,只要將參數(shù)直接傳入編譯過(guò)的語(yǔ)句執(zhí)行代碼中就會(huì)得到執(zhí)行。
–在statement語(yǔ)句中,即使是相同操作但因?yàn)閿?shù)據(jù)內(nèi)容不一樣,所以整個(gè)語(yǔ)句本身不能匹配,沒(méi)有緩存語(yǔ)句的意義.事實(shí)是沒(méi)有數(shù)據(jù)庫(kù)會(huì)對(duì)普通語(yǔ)句編譯后的執(zhí)行代碼緩存.這樣每執(zhí)行一次都要對(duì)傳入的語(yǔ)句編譯一次.
–(語(yǔ)法檢查,語(yǔ)義檢查,翻譯成二進(jìn)制命令,緩存)
?PreparedStatement 可以防止 SQL 注入
DatabaseMetaData類
?DatabaseMetaData
類中提供了許多方法用于獲得數(shù)據(jù)源的各種信息,通過(guò)這些方法可以非常詳細(xì)的了解數(shù)據(jù)庫(kù)的信息:
–getURL():返回一個(gè)String類對(duì)象,代表數(shù)據(jù)庫(kù)的URL。
–getUserName():返回連接當(dāng)前數(shù)據(jù)庫(kù)管理系統(tǒng)的用戶名。
–isReadOnly():返回一個(gè)boolean值,指示數(shù)據(jù)庫(kù)是否只允許讀操作。
–getDatabaseProductName():返回?cái)?shù)據(jù)庫(kù)的產(chǎn)品名稱。
–getDatabaseProductVersion():返回?cái)?shù)據(jù)庫(kù)的版本號(hào)。
–getDriverName():返回驅(qū)動(dòng)驅(qū)動(dòng)程序的名稱。
–getDriverVersion():返回驅(qū)動(dòng)程序的版本號(hào)。
ResultSetMetaData類
?可用于獲取關(guān)于 ResultSet 對(duì)象中列的類型和屬性信息的對(duì)象:
–getColumnName(int column):獲取指定列的名稱
–getColumnCount():返回當(dāng)前ResultSet 對(duì)象中的列數(shù)。
–getColumnTypeName(int column):檢索指定列的數(shù)據(jù)庫(kù)特定的類型名稱。
–getColumnDisplaySize(int column):指示指定列的最大標(biāo)準(zhǔn)寬度,以字符為單位。
–isNullable(int column):指示指定列中的值是否可以為null。
–isAutoIncrement(int column):指示是否自動(dòng)為指定列進(jìn)行編號(hào),這樣這些列仍然是只讀的。
總結(jié)
- 上一篇: 275. 传纸条
- 下一篇: Java Web Servlet