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