一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JDBC快速入門教程

 芥納須彌 2015-11-26
JDBC是什么?

JDBC API是一個Java API,可以訪問任何類型表列數(shù)據(jù),特別是存儲在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。JDBC代表Java數(shù)據(jù)庫連接。

JDBC庫中所包含的API任務(wù)通常與數(shù)據(jù)庫使用:

  • 連接到數(shù)據(jù)庫

  • 創(chuàng)建SQL或MySQL語句

  • 在數(shù)據(jù)庫中執(zhí)行SQL或MySQL查詢

  • 查看和修改記錄

 

先決條件:

學(xué)習(xí)JDBC,需要在以下兩個主題有一定的了解:

  1. JAVA核心編程

  2. SQL或MySQL數(shù)據(jù)庫

JDBC - 環(huán)境設(shè)置:

請確認(rèn)您已完成以下設(shè)置:

  1. 核心JAVA安裝

  2. SQL 或 MySQL數(shù)據(jù)庫安裝

除上述者外,需要建立一個數(shù)據(jù)庫,為本程測試項(xiàng)目使用。假設(shè)這是EMP,在同一個數(shù)據(jù)庫上創(chuàng)建表Employees。

創(chuàng)建JDBC應(yīng)用程序:

參與建立一個JDBC應(yīng)用程序,本教程中按六個步驟進(jìn)行:

導(dǎo)入包:

這需要你有軟件包包含了數(shù)據(jù)庫編程所需的JDBC類。大多數(shù)情況下,使用import java.sql.* 就足夠了,如下所示:

//STEP 1. Import required packages
import java.sql.*;

注冊JDBC驅(qū)動程序:

這需要初始化驅(qū)動程序,這樣就可以打開與數(shù)據(jù)庫的通信信道。以下是代碼片段實(shí)現(xiàn)這一目標(biāo):

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

打開一個連接:

這需要使用DriverManager.getConnection()方法來創(chuàng)建一個Connection對象,它代表一個物理連接的數(shù)據(jù)庫,如下所示:

//STEP 3: Open a connection
//  Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);

執(zhí)行一個查詢:

這需要使用一個對象類型Statement或PreparedStatement構(gòu)建,并提交一個SQL語句到數(shù)據(jù)庫。如下:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

如果有一個SQL UPDATE,INSERT或DELETE語句,那么需要下面的代碼片段:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);

從結(jié)果集中提取數(shù)據(jù):

這一步是必需的情況下,從數(shù)據(jù)庫中獲取數(shù)據(jù)??梢允褂眠m當(dāng)?shù)腞esultSet.getXXX()方法來檢索的數(shù)據(jù)結(jié)果如下:

//STEP 5: Extract data from result set
while(rs.next()){
    //Retrieve by column name
    int id  = rs.getInt("id");
    int age = rs.getInt("age");
    String first = rs.getString("first");
    String last = rs.getString("last");

    //Display values
    System.out.print("ID: " + id);
    System.out.print(", Age: " + age);
    System.out.print(", First: " + first);
    System.out.println(", Last: " + last);
}

清理環(huán)境:

應(yīng)該明確地關(guān)閉所有的數(shù)據(jù)庫資源,對依賴于JVM的垃圾收集如下:

//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();

第一個JDBC 程序:

基于上面的步驟,我們可以有以下綜合示例代碼,我們可以用它作為模板而寫JDBC代碼:
此示例代碼已被寫入基于對環(huán)境和數(shù)據(jù)庫環(huán)境一章中設(shè)置完成。

//STEP 1. Import required packages
import java.sql.*;

public class FirstExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();
      String sql;
      sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);

      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      //STEP 6: Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end FirstExample - by www.

現(xiàn)在讓我們來編譯上面的例子如下:

C:\>javac FirstExample.java
C:\>

當(dāng)你運(yùn)行FirstExample的,它會產(chǎn)生以下結(jié)果:

C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>

SQLException方法:

一個SQLException既可以發(fā)生在驅(qū)動程序和數(shù)據(jù)庫。當(dāng)這樣的異常時,SQLException類型的對象將被傳遞到catch子句。
通過SQLException對象有以下幾種方法可用于獲取更多的關(guān)于異常的信息:

方法 描述
getErrorCode() 獲取與異常關(guān)聯(lián)的錯誤號。
getMessage() 獲取的JDBC驅(qū)動程序的錯誤處理錯誤消息的驅(qū)動程序,或獲取Oracle錯誤號和消息的數(shù)據(jù)庫錯誤。
getSQLState() 獲取XOPEN SQLSTATE字符串。對于JDBC驅(qū)動程序錯誤,沒有有用的信息,從該方法返回。對于一個數(shù)據(jù)庫錯誤,五位的XOPEN SQLSTATE代碼返回。這種方法可以返回null。
getNextException() 獲取異常鏈中的下一個Exception對象。
printStackTrace() 打印當(dāng)前的異常,或可拋出,并回溯到標(biāo)準(zhǔn)錯誤流。
printStackTrace(PrintStream s) 打印此拋出對象及其回溯到指定的打印流。
printStackTrace(PrintWriter w) 打印此拋出對象及其回溯您指定打印作家。

通過利用從Exception對象提供的信息,可以捕獲一個異常,并適當(dāng)?shù)乩^續(xù)運(yùn)行程序。這是一個try塊中的一般形式:

try {
   // Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
   // Your exception handling code goes between these 
   // curly braces, similar to the exception clause 
   // in a PL/SQL block.
}
finally {
   // Your must-always-be-executed code goes between these 
   // curly braces. Like closing database connection.
}

JDBC - 數(shù)據(jù)類型:

下表總結(jié)了默認(rèn)的JDBC數(shù)據(jù)類型的Java數(shù)據(jù)類型轉(zhuǎn)換,當(dāng)調(diào)用PreparedStatement或CallableStatement對象的setXXX()方法,或ResultSet.updateXXX()方法。

SQL JDBC/Java setXXX updateXXX
VARCHAR java.lang.String setString updateString
CHAR java.lang.String setString updateString
LONGVARCHAR java.lang.String setString updateString
BIT boolean setBoolean updateBoolean
NUMERIC java.math.BigDecimal setBigDecimal updateBigDecimal
TINYINT byte setByte updateByte
SMALLINT short setShort updateShort
INTEGER int setInt updateInt
BIGINT long setLong updateLong
REAL float setFloat updateFloat
FLOAT float setFloat updateFloat
DOUBLE double setDouble updateDouble
VARBINARY byte[ ] setBytes updateBytes
BINARY byte[ ] setBytes updateBytes
DATE java.sql.Date setDate updateDate
TIME java.sql.Time setTime updateTime
TIMESTAMP java.sql.Timestamp setTimestamp updateTimestamp
CLOB java.sql.Clob setClob updateClob
BLOB java.sql.Blob setBlob updateBlob
ARRAY java.sql.Array setARRAY updateARRAY
REF java.sql.Ref SetRef updateRef
STRUCT java.sql.Struct SetStruct updateStruct

JDBC3.0的增強(qiáng)支持BLOB,CLOB,ARRAY,REF數(shù)據(jù)類型。的ResultSet對象UPDATEBLOB(),updateCLOB(),updateArray()和updateRef()方法,使您可以在服務(wù)器上直接操作相應(yīng)的數(shù)據(jù)。

setXXX()和updateXXX()方法,可以轉(zhuǎn)換成特定的Java類型到特定的JDBC數(shù)據(jù)類型。setObject()和updateObject()方法,幾乎所有的Java類型映射到JDBC數(shù)據(jù)類型。

ResultSet對象提供相應(yīng)的getXXX()方法為每個數(shù)據(jù)類型來檢索列值。每一種方法,可以使用與列名或由它的序號位置。

SQL JDBC/Java setXXX getXXX
VARCHAR java.lang.String setString getString
CHAR java.lang.String setString getString
LONGVARCHAR java.lang.String setString getString
BIT boolean setBoolean getBoolean
NUMERIC java.math.BigDecimal setBigDecimal getBigDecimal
TINYINT byte setByte getByte
SMALLINT short setShort getShort
INTEGER int setInt getInt
BIGINT long setLong getLong
REAL float setFloat getFloat
FLOAT float setFloat getFloat
DOUBLE double setDouble getDouble
VARBINARY byte[ ] setBytes getBytes
BINARY byte[ ] setBytes getBytes
DATE java.sql.Date setDate getDate
TIME java.sql.Time setTime getTime
TIMESTAMP java.sql.Timestamp setTimestamp getTimestamp
CLOB java.sql.Clob setClob getClob
BLOB java.sql.Blob setBlob getBlob
ARRAY java.sql.Array setARRAY getARRAY
REF java.sql.Ref SetRef getRef
STRUCT java.sql.Struct SetStruct getStruct

JDBC - 批量處理:

批處理允許一個批處理組相關(guān)的SQL語句,并將其提交的一個調(diào)用到數(shù)據(jù)庫。

當(dāng)幾個SQL語句一次發(fā)送到數(shù)據(jù)庫中,可以減少通信開銷,從而提高性能。

  • JDBC驅(qū)動程序不支持此功能。您應(yīng)該使用DatabaseMetaData.supportsBatchUpdates()方法來確定目標(biāo)數(shù)據(jù)庫支持批量更新處理。如果你的JDBC驅(qū)動程序支持此功能,則該方法返回true。

  • addBatch()方法的聲明,PreparedStatement和CallableStatementis用于添加單個語句的批處理。 executeBatch()將開始執(zhí)行的所有語句組合到一起。

  • executeBatch()將返回一個整數(shù)數(shù)組,每個數(shù)組元素的表示為相應(yīng)的更新語句的更新計數(shù)。

  • 可以添加語句進(jìn)行處理,可以clearBatch()方法刪除它們。此方法將刪除addBatch()方法添加的所有語句。但是,你不能有選擇性地選擇語句來刪除。

JDBC - 數(shù)據(jù)流:

PreparedStatement對象有能力使用提供參數(shù)數(shù)據(jù)的輸入和輸出流。這使您可以將整個文件到數(shù)據(jù)庫中,可容納較大的值,如CLOB和BLOB數(shù)據(jù)類型的列。

有下列方法可用于流數(shù)據(jù):

  1. setAsciiStream(): 此方法用于提供大的ASCII值。

  2. setCharacterStream(): 此方法用于提供大的UNICODE值。

  3. setBinaryStream(): 使用此方法,以提供大的二進(jìn)制值。

setXXXStream()方法需要一個額外的參數(shù),文件大小,除了參數(shù)占位符。此參數(shù)通知應(yīng)發(fā)送多少數(shù)據(jù)的數(shù)據(jù)庫,使用流的驅(qū)動程序。

對于一個詳細(xì)的關(guān)于所有這些概念,需要去通過學(xué)習(xí)完整的教程。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精品日韩中文字幕视频在线| 自拍偷女厕所拍偷区亚洲综合| 免费在线成人激情视频| 国产超薄黑色肉色丝袜| 国产成人国产精品国产三级| 激情中文字幕在线观看| 午夜小视频成人免费看| 香蕉网尹人综合在线观看| 男女午夜福利院在线观看| 美国女大兵激情豪放视频播放| 日韩中文字幕狠狠人妻| 国内九一激情白浆发布| 两性色午夜天堂免费视频| 一区二区日本一区二区欧美| 国产亚洲二区精品美女久久| 亚洲免费视频中文字幕在线观看 | 丝袜诱惑一区二区三区| 视频一区二区 国产精品| 偷拍美女洗澡免费视频| 久久久免费精品人妻一区二区三区| 麻豆果冻传媒一二三区| 精品欧美国产一二三区| 国产传媒精品视频一区| 天堂网中文字幕在线观看| 国产熟女一区二区精品视频| 五月激情综合在线视频| 成人你懂的在线免费视频| 国产av熟女一区二区三区蜜桃| 欧美精品久久99九九| 亚洲另类欧美综合日韩精品| 日本不卡一区视频欧美| 欧美日韩国产成人高潮| 欧美一区二区三区高潮菊竹| 69老司机精品视频在线观看| 91精品视频免费播放| 台湾综合熟女一区二区| 欧美日韩免费观看视频| 久久久免费精品人妻一区二区三区| 国产精品推荐在线一区| 五月婷婷综合缴情六月| 欧美成人国产精品高清|