天天看點

JDBC連接配接資料庫詳解(Oracle)

JDBC是Sun公司制定的一個可以用Java語言連接配接資料庫的技術。

一、JDBC基礎知識

JDBC(Java Data Base Connectivity,java資料庫連接配接)是一種用于執行SQL語句的Java API,可以為多種關系資料庫提供統一通路,它由一組用Java語言編寫的類和接口組成。JDBC為資料庫開發人員提供了一個标準的API,據此可以建構更進階的工具和接口,使資料庫開發人員能夠用純 Java API 編寫資料庫應用程式,并且可跨平台運作,并且不受資料庫供應商的限制。  
           

1、跨平台運作:這是繼承了Java語言的“一次編譯,到處運作”的特點;

2、不受資料庫供應商的限制:巧妙在于JDBC設有兩種接口,一個是面向應用程式層,其作用是使得開發人員通過SQL調用資料庫和處理結果,而不需要考慮資料庫的提供商;另一個是驅動程式層,處理與具體驅動程式的互動,JDBC驅動程式可以利用JDBC API建立Java程式和資料源之間的橋梁。應用程式隻需要編寫一次,便可以移到各種驅動程式上運作。Sun提供了一個驅動管理器,資料庫供應商——如MySQL、Oracle,提供的驅動程式滿足驅動管理器的要求就可以被識别,就可以正常工作。是以JDBC不受資料庫供應商的限制。

JDBC API可以作為連接配接Java應用程式與各種關系資料庫的紐帶,在帶來友善的同時也有負面影響,以下是JDBC的優、缺點。優點如下:  
           

操作便捷:JDBC使得開發人員不需要再使用複雜的驅動器調用指令和函數;

可移植性強:JDBC支援不同的關系資料庫,是以可以使同一個應用程式支援多個資料庫的通路,隻要加載相應的驅動程式即可;

通用性好:JDBC-ODBC橋接驅動器将JDBC函數換成ODBC;

面向對象:可以将常用的JDBC資料庫連接配接封裝成一個類,在使用的時候直接調用即可。

缺點如下:  
           

通路資料記錄的速度受到一定程度的影響;

更改資料源困難:JDBC可支援多種資料庫,各種資料庫之間的操作必有不同,這就給更改資料源帶來了很大的麻煩

二、JDBC連接配接資料庫的流程及其原理

1、在開發環境中加載指定資料庫的驅動程式。例如,接下來的實驗中,使用的資料庫是Oracle,是以需要去下載下傳Oracle支援JDBC的驅動程式(其實這個地方并不需要去官網上下載下傳jdbc驅動,本地安裝的Oracle中就有,是一個ojdbc14.jar的檔案);而開發環境是MyEclipse,将下載下傳得到的驅動程式加載進開發環境中(具體示例的時候會講解如何加載)。

2、在Java程式中加載驅動程式。在Java程式中,可以通過 “Class.forName(“指定資料庫的驅動程式”)” 方式來加載添加到開發環境中的驅動程式,例如加載Oracle的資料驅動程式的代碼為: Class.forName(“oracle.jdbc.driver.OracleDriver”)

3、建立資料連接配接對象:通過DriverManager類建立資料庫連接配接對象Connection。DriverManager類作用于Java程式和JDBC驅動程式之間,用于檢查所加載的驅動程式是否可以建立連接配接,然後通過它的getConnection方法,根據資料庫的URL、使用者名和密碼,建立一個JDBC Connection 對象。如:Connection connection = DriverManager.geiConnection(“連接配接資料庫的URL”, “使用者名”, “密碼”)。其中,URL=協定名+IP位址(域名)+端口+資料庫名稱;使用者名和密碼是指登入資料庫時所使用的使用者名和密碼。具體示例建立Oracle的資料庫連接配接代碼如下:

conn=DriverManager.getConnection(url, user, password);  
           

4、建立Statement對象:Statement 類的主要是用于執行靜态 SQL 語句并傳回它所生成結果的對象。通過Connection 對象的 createStatement()方法可以建立一個Statement對象。例如:Statement statament = connection.createStatement(); 具體示例建立Statement對象代碼如下:

Statement statamentMySQL =connectMySQL.createStatement();   
           

5、調用Statement對象的相關方法執行相對應的 SQL 語句:通過execuUpdate()方法用來資料的更新,包括插入和删除等操作,例如向staff表中插入一條資料的代碼:

statement.excuteUpdate( "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" + " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ") ;   
           

通過調用Statement對象的executeQuery()方法進行資料的查詢,而查詢結果會得到 ResulSet對象,ResulSet表示執行查詢資料庫後傳回的資料的集合,ResulSet對象具有可以指向目前資料行的指針。通過該對象的next()方法,使得指針指向下一行,然後将資料以列号或者字段名取出。如果當next()方法傳回null,則表示下一行中沒有資料存在。使用示例代碼如下:

ResultSet resultSel = statement.executeQuery( "select * from staff" );  
           

6、關閉資料庫連接配接:使用完資料庫或者不需要通路資料庫時,通過Connection的close() 方法及時關閉資料連接配接。

三、JDBC應用示例實驗

實驗 步驟:

S1、下載下傳ojdbc14.jar驅動檔案,并将該檔案放到你的項目中去;

S2、在MyEclipse中的項目中添加Oracle驅動程式:在項目名上右鍵-> Build Path ->Add External Archiver然後選擇你剛才放在項目中的檔案, 點确定即可。

S3、打開Oracle的各項服務,并在Oracle中建一張表。

S4、編寫MyEclipse與Oracle的連接配接程式:

import java.sql.Connection;    
import java.sql.DriverManager;    
import java.sql.PreparedStatement;    
import java.sql.ResultSet;    
import java.sql.Statement;    
import java.sql.* ;    

public class JDBC_Test {    
    //orcl為oracle資料庫中的資料庫名,localhost表示連接配接本機的oracle資料庫     
   //1521為連接配接的端口号     
    private static String url="jdbc:oracle:thin:@localhost:1521:orcl";    
    //system為登陸oracle資料庫的使用者名     
    private static String user="system";    
    //manager為使用者名system的密碼     
    private static String password="manager";    
    public static Connection conn;    
    public static PreparedStatement ps;    
    public static ResultSet rs;    
    public static Statement st ;    
    //連接配接資料庫的方法     
    public void getConnection(){    
        try {    
            //初始化驅動包     
            Class.forName("oracle.jdbc.driver.OracleDriver");    
            //根據資料庫連接配接字元,名稱,密碼給conn指派     
            conn=DriverManager.getConnection(url, user, password);    

        } catch (Exception e) {    
            // TODO: handle exception     
            e.printStackTrace();    
        }    
    }    
     //測試能否與oracle資料庫連接配接成功     
     public static void main(String[] args) {    
        JDBC_Test basedao=new JDBC_Test();    
        basedao.getConnection();    
        if(conn==null){    
            System.out.println("與oracle資料庫連接配接失敗!");    
        }else{    
            System.out.println("與oracle資料庫連接配接成功!");    
        }    
     }    
}    
</SPAN>    

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.Statement;  
import java.sql.* ;  

public class JDBC_Test {  
    //orcl為oracle資料庫中的資料庫名,localhost表示連接配接本機的oracle資料庫  
   //1521為連接配接的端口号  
    private static String url="jdbc:oracle:thin:@localhost:1521:orcl";  
    //system為登陸oracle資料庫的使用者名  
    private static String user="system";  
    //manager為使用者名system的密碼  
    private static String password="manager";  
    public static Connection conn;  
    public static PreparedStatement ps;  
    public static ResultSet rs;  
    public static Statement st ;  
    //連接配接資料庫的方法  
    public void getConnection(){  
        try {  
            //初始化驅動包  
            Class.forName("oracle.jdbc.driver.OracleDriver");  
            //根據資料庫連接配接字元,名稱,密碼給conn指派  
            conn=DriverManager.getConnection(url, user, password);  

        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
        }  
    }  
     //測試能否與oracle資料庫連接配接成功  
     public static void main(String[] args) {  
        JDBC_Test basedao=new JDBC_Test();  
        basedao.getConnection();  
        if(conn==null){  
            System.out.println("與oracle資料庫連接配接失敗!");  
        }else{  
            System.out.println("與oracle資料庫連接配接成功!");  
        }  
     }  
}  

S5、如果上述的連接配接已經建立,就可以利用JDBC中的Java API對資料庫進行操作了,具體的查詢,插入,删除,更新操作如下:  
[cpp] view plaincopyprint?<SPAN style="FONT-SIZE: 16px">代碼轉載自:http://blog.csdn.net/cxwen78/article/details/6863696     

import java.sql.Connection;    
import java.sql.DriverManager;    
import java.sql.ResultSet;    
import java.sql.SQLException;    
import java.sql.Statement;    

public class JDBC_Test {    
    // 建立靜态全局變量     
    static Connection conn;    

    static Statement st;    

    public static void main(String[] args) {    
        insert();   //插入添加記錄     
        update();   //更新記錄資料     
        delete();   //删除記錄     
        query();    //查詢記錄并顯示     
    }    

    /* 插入資料記錄,并輸出插入的資料記錄數*/    
    public static void insert() {    

        conn = getConnection(); // 首先要擷取連接配接,即連接配接到資料庫     

        try {    
            String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"    
                    + " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')";  // 插入資料的sql語句     

            st = (Statement) conn.createStatement();    // 建立用于執行靜态sql語句的Statement對象     

            int count = st.executeUpdate(sql);  // 執行插入操作的sql語句,并傳回插入資料的個數     

            System.out.println("向staff表中插入 " + count + " 條資料"); //輸出插入操作的處理結果     

            conn.close();   //關閉資料庫連接配接     

        } catch (SQLException e) {    
            System.out.println("插入資料失敗" + e.getMessage());    
        }    
    }    

    /* 更新符合要求的記錄,并傳回更新的記錄數目*/    
    public static void update() {    
        conn = getConnection(); //同樣先要擷取連接配接,即連接配接到資料庫     
        try {    
            String sql = "update staff set wage='2200' where name = 'lucy'";// 更新資料的sql語句     

            st = (Statement) conn.createStatement();    //建立用于執行靜态sql語句的Statement對象,st屬局部變量     

            int count = st.executeUpdate(sql);// 執行更新操作的sql語句,傳回更新資料的個數     

            System.out.println("staff表中更新 " + count + " 條資料");      //輸出更新操作的處理結果     

            conn.close();   //關閉資料庫連接配接     

        } catch (SQLException e) {    
            System.out.println("更新資料失敗");    
        }    
    }    

    /* 查詢資料庫,輸出符合要求的記錄的情況*/    
    public static void query() {    

        conn = getConnection(); //同樣先要擷取連接配接,即連接配接到資料庫     
        try {    
            String sql = "select * from staff";     // 查詢資料的sql語句     
            st = (Statement) conn.createStatement();    //建立用于執行靜态sql語句的Statement對象,st屬局部變量     

            ResultSet rs = st.executeQuery(sql);    //執行sql查詢語句,傳回查詢資料的結果集     
            System.out.println("最後的查詢結果為:");    
            while (rs.next()) { // 判斷是否還有下一個資料     

                // 根據字段名擷取相應的值     
                String name = rs.getString("name");    
                int age = rs.getInt("age");    
                String sex = rs.getString("sex");    
                String address = rs.getString("address");    
                String depart = rs.getString("depart");    
                String worklen = rs.getString("worklen");    
                String wage = rs.getString("wage");    

                //輸出查到的記錄的各個字段的值     
                System.out.println(name + " " + age + " " + sex + " " + address    
                        + " " + depart + " " + worklen + " " + wage);    

            }    
            conn.close();   //關閉資料庫連接配接     

        } catch (SQLException e) {    
            System.out.println("查詢資料失敗");    
        }    
    }    

    /* 删除符合要求的記錄,輸出情況*/    
    public static void delete() {    

        conn = getConnection(); //同樣先要擷取連接配接,即連接配接到資料庫     
        try {    
            String sql = "delete from staff  where name = 'lili'";// 删除資料的sql語句     
            st = (Statement) conn.createStatement();    //建立用于執行靜态sql語句的Statement對象,st屬局部變量     

            int count = st.executeUpdate(sql);// 執行sql删除語句,傳回删除資料的數量     

            System.out.println("staff表中删除 " + count + " 條資料\n");    //輸出删除操作的處理結果     

            conn.close();   //關閉資料庫連接配接     

        } catch (SQLException e) {    
            System.out.println("删除資料失敗");    
        }    

    }    

    /* 擷取資料庫連接配接的函數*/    
    public static Connection getConnection() {    
        Connection con = null;  //建立用于連接配接資料庫的Connection對象     
        try {    
            Class.forName("com.mysql.jdbc.Driver");// 加載Mysql資料驅動     

            con = DriverManager.getConnection(    
                    "jdbc:mysql://localhost:3306/myuser", "root", "root");// 建立資料連接配接    

        } catch (Exception e) {    
            System.out.println("資料庫連接配接失敗" + e.getMessage());    
        }    
        return con; //傳回所建立的資料庫連接配接     
    }    
}