国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java 連接、操控數據庫總結(JDBC)

2019-11-15 00:25:50
字體:
來源:轉載
供稿:網友
java 連接、操控數據庫總結(JDBC)

看到數據庫連接不由得想起了大一末參加團隊考核時的悲催經歷~~,還記得當初傻傻地按照書本的代碼打到 Eclipse 上,然后一運行就各種報錯。。。報錯后還傻傻地和書本的代碼一遍又一遍地進行核對,發現無誤后,還特別糾結——代碼和書本一樣,怎么就報錯了呢? 最后通過 Google 才得知要添加驅動包,就這樣好多個小時就白白浪費掉了 ~~ 當初連 JDBC 與 JDBC Driver 還沒區分好,往事不堪回首。。。

大二末,抱著“自己被抗了,也坑坑師弟,讓他們體驗下爬坑的經歷”的心態,考核師弟時故意沒發驅動包給他們,事后聽他們說就因為這坑了他們幾天的時間。。。

大三末,輪到大二師弟考核大一的師弟,然后大二的師弟和大一的說,“數據庫連接時,需要一個驅動包,你們自己去了解、下載,具體的就不說了,要學會解決問題。當年帶我的師兄也沒直接提供給我,還害我花了幾天的時間。所以今年我算好了,還提醒你們要注意。。。”,聽到這我背后不由的一涼,這得有多大的怨氣。。。(^_^,這不怪我,叫了你們遇到解決不了的問題可以問師兄,你們沒問而已,逃~~)

好了,回憶結束~~。為了懷念以前的“懵懂青春”,總結下 Java的數據庫連接以及 JDBC、JDBC Driver。

JDBC 與 JDBC Driver

首先要搞清楚的是,什么是 JDBC,什么是 JDBC Driver

  1. JDBC,JDBC 的全稱為 Java Database Connectivity,它定義了一套訪問數據庫的 API。使用這些 API 你就可以使用 Java 來操控數據庫,執行 selectupdatedeleteinsert 等常用的操作。(具體定義請看維基百科

  2. JDBC Driver,JDBC Driver 就是 Java 與數據庫之間的一層軟件組件——驅動。就像我們的鼠標驅動、鍵盤驅動等驅動,它擔任了一個中間人、一名翻譯者。因此,要想使用 Java(JDBC API)來訪問操控數據庫,我們還需要 JDBC Driver 來負責翻譯。(維基百科上有具體介紹)

JDBC Driver

JDBC Driver 一般是由相應的數據庫提供的,比如 MySQL 提供了 Connector/J 驅動 (根據官方說明,Connector/J 屬于第 4 種類型的驅動。想了解更詳細、更多的驅動類型可以參加維基百科)。

JDBC Driver 的安裝

JDBC Driver 的安裝很簡單,只需要去官網下載它提供的驅動,并把相應的 Jar 包(通常叫作 mysql-connector-java-version-bin.jar)放在 Java Classpath 下就 OK,如果你和我一樣是搞 J2EE 的,你也可以直接把它放在 WEB-INF/lib 目錄下,或者用類似 Maven 之類的工具來添加。詳細請看 官方文檔 。

使用

JDBC Driver 的使用在 這 有很多例子,因此不再累贅了。畢竟它只是一個驅動,我們更多的是使用 JDBC API 調用這個驅動與數據庫打交道。更多的使用總結請看下部分。

JDBC API

JDBC 只是 Java 中定義的一些接口,它也屬于 JDK 的一部分,就像文件等普通接口一樣,我們只需要調用它來完成目的就 OK 。既然是 API 我們就要去看文檔熟悉它才能更好地使用它,這些類分別處于 java.sql 和 javax.sql。

連接

要想使用 JDBC API 來操控數據庫,首先要連上數據庫。連接數據庫有兩種方法:

  • 使用 DriverManager 。第一次使用 DriverManager 來建立與數據庫的連接時,它會自動在 class path 中尋找并加載 JDBC 4.0 驅動。要注意的是,如果是 4.0 之前的版本,需要手動去加載。
  • 使用 DataSource 。根據官方推薦,我們應該優先使用 DataSource 。相對于比較簡單的 DriverManager ,它比較復雜,也比較全面、詳細。

使用 DriverManager 連接數據庫:要使用 DriverManager ,我們先要把該類加載進來,使用最簡單的方法(在要加載的類里添加以下代碼)

Class.forName("com.mysql.jdbc.Driver").newInstance();

加載了 DriverManager 后,我們就可以使用它來獲取與數據庫的連接(假設我們使用本地數據,默認路徑為 localhost ;數據庫名為 test ;用戶名為 root;密碼為 123):

// DriverManager、Connection 類在 java.sql 里都有定義String URL = "jdbc:mysql://localhost:3306/test?user=root&passWord=123";Connection conn = DriverManager.getConnection(URL); //或者String URL = "jdbc:mysql://localhost:3306/test";String user = "root";String password = "123";Connection conn = DriverManager.getConnection(URL, user, password); //或者String URL = "jdbc:mysql://localhost:3306/test";PRoperties connectionProps = new Properties();connectionProps.put("user", this.userName);connectionProps.put("password", this.password);Connection conn = DriverManager.getConnection(URL, connectionProps); 

(個人覺得,第一種看起來簡單、方便,但是修改麻煩、可讀性不高,不太建議使用。如果你只想簡單地傳遞用戶名與密碼可以選用第二種。如果你有很多參數要傳遞,比如字符編碼、用戶名密碼等,優先選擇第三種。)

連接數據庫,我們只需調用 getConnection() 方法并且返回與數據庫的連接(Connection)就 OK ,有了此連接我們就可以操作數據了。

在這要注意的是 getConnection 方法里的字符串參數 URL 。該字符串指定了數據庫的路徑、數據庫名、數據庫配置(用戶名密碼等)。 MySQL 的 URL 語法如下:

jdbc:mysql://[host][,failoverhost...][:port]/[database] [?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...詳細說明

使用 DataSource 連接:DataSource 連接涉及的東西比較多,找時間另開一篇來總結。 ^_^

創建語句

連接上了數據庫,我就可以操控數據庫了。通常我們是編寫 SQL 語句來操控數據庫的。因此,在操控數據庫之前,我們還要創建 SQL 語句。JDBC 定義了 3 種類型語句接口,用來運行 SQL 語句,并且返回執行結果:

  • Statement
  • PreparedStatement
  • CallableStatement

相應地,創建語句也有三種方法:

  • Connection.createStatement() ——創建普通的語句,它通常不需要提供參數。更多
  • Connection.prepareStatement(String stringSQL)——創建預編譯語句,通常要提供一個帶有占位符的字符串 SQL 語句。 更多
  • Connection.prepareCall()——創建存儲過程。更多

這里要注意的是,StatementPreparedStatement 的區別。它們的最主要區別就是:

  1. PreparedStatement 對 SQL 語句進行了預編譯,在需要運行多次 SQL 語句是能得到顯著的性能提升
  2. 可以有效地防止 SQL 注入攻擊( SQL injection attacks )
  3. 可以輕松地在 SQL 字符串里使用非標準的 Java 對象,如DateTimeTimestampBigDecimal
  4. 相對于使用拼接方式的 Statement,它使用占位符(?) 很好地把查詢語句以及變量值分開。
  5. 更多請看 stackoverflow 上的討論
操控數據庫

平時我們操控數據庫,最常用的、最簡單的就是selectupdatedeleteinsert 等常用的操作了。那么我們是怎么通過 JDBC API 來實現這些行為的呢?

通常,我們會使用 Statement.executeQuery(String sql) 來執行 select 查詢操作,它會返回一個 ResultSet 的對象,這個對象包含了查詢返回的數據。updatedeleteinsert 等更新操作使用 Statement.executeUpdate(String sql),它會返回一個整數,代表影響的行數。

ResultSet

ResultSet 是查詢數據庫時返回的數據集,我們可以把它想象為一張與數據表類似的數據表,就像我們使用命令行執行 select 語句時控制臺返回的數據表。不同之處是它擁有一個一開始處于第一行數據的前一行的指針。然后我們就可以通過不停地調用 ResultSet.next() 來移動指針獲取每一行的數據,該函數在指針移動到最后一行的下一行時就返回 false ,我們可以利用這個特性來作為終止條件遍歷整張表。(第一行的前一行與最后一行的下一行都是不存在的行,是虛擬的行)

此外,ResultSet 有 3 中類型(更多):

  1. TYPE_FORWARD_ONLY:這個是默認的類型,它只能不同地調用 next() 方法把指針向下一行移動,而不能往回走。
  2. TYPE_SCROLL_INSENSITIVE:這個類型除了可以調用 next() 方法把指針向下一行移動外,還可以調用previous() 方法把指針指向前一行,使用 first 方法把指針移動到第一行等。
  3. TYPE_SCROLL_SENSITIVE:此方法與第 2 個類型一樣,可以任意移動指針。但它是敏感型的。也就是說,當你使用 Statement.executeQuery(String sql) 產生了 ResultSet 后,數據庫中響應的數據發生了改變,它會更新 ResultSet 并保持數據與數據庫一致。而第 2 個類型是非敏感型的,它不會更新 ResultSet。

要指定 ResultSet 的類型,我們只需在創建 Statement 時指定:

 Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE);

OK,我已經可以在獲取數據表中的任意行了,我們現在來獲取一行數據中的特定列的數據。ResultSet 提供了 getter 方法(getBoolean、getLong、getInt等方法)來獲取當前行的列。這些方法的參數既可以是列的索引號(從 1 開始的整型)也可以是列的別名或者列名(字符串)。比如 ResultSet.getInt(1) 獲取第一列的數據,ResultSet.getFloat("score") 獲取列名為 score 的列。更多

參考

Oracle 官方 Java教程 —— JDBC(TM) Database accessMySQL 5.6 參考手冊維基百科 JDBC Driverjava.sql 包stackoverflow


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 富顺县| 南部县| 玉门市| 松潘县| 顺平县| 京山县| 土默特右旗| 长白| 武夷山市| 股票| 建始县| 威海市| 阜阳市| 桦甸市| 凤台县| 利辛县| 东莞市| 区。| 英超| 汪清县| 甘泉县| 鹤壁市| 鄄城县| 南阳市| 襄城县| 南华县| 安新县| 南宫市| 集安市| 安康市| 库尔勒市| 澳门| 涞源县| 曲阜市| 临猗县| 渑池县| 汝州市| 中阳县| 香格里拉县| 雷山县| 淮南市|