JDBC之簡介

openkk 12年前發布 | 30K 次閱讀 JDBC Java開發
java.sql包和javax.sql包

DriverManager類(驅動管理器),它可以創建連接,它本身就是一個創建Connection的工廠(Factory)。

Driver接口  入口

Connection接口,會根據不同的驅動產生不同的連接

Statement接口,發送sql語句

ResultSet接口(結果集),是用來接收select語句返回的查尋結果的。其實質類似于集合。  

 

以上的資源都需要釋放,釋放的是數據庫的資源

 

JDBC應用步驟

1,注冊加載一個driver驅動

2,創建數據庫連接(Connection)

3,創建一個Statement(發送sql)

4,執行sql語句

5,處理sql結果(select語句)

6,關閉Statement

7,關閉連接Connection。

 

注意:6,7兩個步驟勢必須要做的,因為這些資源是不會自動釋放的,必須要自己關閉

 

訪問Oracle的數據庫的驅動名字叫o加到環境變量PATH中。

jdbc14.jar,這個jar文件中出訪的驅動程序的.class文件

要使用這個驅動程序,要先將他

一,注冊加載驅動driver,也就是強制類加載

    1Class.forName(driver);

       driver = "oracle.jdbc.driver.OracleDriver";

 

    2Driver d=new Driver();

       Driver d = new oracle.jdbc.driver.OracleDriver();

       DriverManager.registerDriver(d);

       

    3、編譯時利用虛擬機的系統屬性

       java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver 類名(文件)       

 

    oracleDriver的全名oracle.jdbc.driver.OracleDriver

    mysqlDriver的全名com.mysql.jdbc.Driver

    SQLServerDriver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver

 

二,創建連接

    DriverManager.getConnection(String url,String username,String password);

    Connection連接是通過DriverManager的靜態方法getConnection(.....)來得到的,這個方法的實質是把參數傳到實際的Driver中的connect()方法中來獲得數據庫連接的。

    oracleURL值是由連接數據庫的協議和數據庫的IP地址及端口號還有要連接的庫名(DatebaseName

    oracle URL的格式

    jdbc:oracle:thin:(協議)@XXX.XXX.X.XXX:XXXXIP地址及端口號):XXXXXXX(所使用的庫名)

    例:jdbc:oracle:thin:@192.168.0.39:1521:TARENADB

    MySql URL的寫法

    例: jdbc:mysql://192.168.8.21:3306/test

    SQLServer URL的寫法

    例:jdbc:microsoft:sqlserver://192.168.8.21:1433

 

    java -Djdbc.drivers=驅動全名 類名

 

    使用系統屬性名,加載驅動 -D表示為系統屬性賦值

    

    使用Connection對象獲得一個StatementStatement中的executeQuery(String sql) 方法可以使用select語句查詢,并且返回一個結果集 ResultSet通過遍歷這個結果集,

    可以獲得select語句的查尋結果,ResultSetnext()方法會操作一個游標從第一條記錄的前邊開始讀取,直到最后一條記錄。

    executeUpdate(String sql) 方法用于執行DDLDML語句,可以updatedelete操作。

注意:要按先ResultSet結果集,后Statement,最后Connection的順序關閉資源,因為Statement和ResultSet是需要連接是才可以使用的,

      所以在使用結束之后有可能起他的Statement還需要連接,所以不能現關閉Connection  

      

作業:修改StudentDao的設計以及實現和測試程序,來完成從命令行傳遞學生的信息。

第二季

一、提問

如何進行代碼復用

   繼承復用、組合復用

   私有復用:一個方法在一個類的內部使用

   工具方法:使用靜態方法,使用類名直接調用                                    

   

二、Statement  

execute(sql); 當不知道執行的SQL語句是什么類型的時候執行 ,返回值是boolean

executeQuery(sql); 執行查詢語句

executeUpdate(sql); 執行更新語句

 

三、PreparedStatement

可以使用參數替代sql語句中的某些參數使用 "?"代替,他先將帶參數的sql語句發送到數據庫,進行編譯,然后PreparedStatement會將參數發送給數據庫。

在使用PreparedStatement時,在設置相應參數時,要指明參數的位置和類型,以及給出參數值

根據不同的參數類型使用不同的setXXX(參數的位置,參數值)來設置參數

 

例:

public void insert(Student s){

        Connection con=ConnectionFactory.getConnection();//建立連接

        String sql="insert into student(id,name) values(?,?)";

        PreparedStatement ps=null;

        try {

            ps=con.prepareStatement(sql);//創建一個PreparedStatement

      int index=1;

            ps.setInt(index++,s.getStuId());  //為參數賦值

            ps.setString(index++,s.getName());

            ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            if(ps!=null)

                try {

                    ps.close();

                } catch (SQLException e) {

                    e.printStackTrace();

                }

                if(con!=null)

                    try {

                        con.close();

                    } catch (SQLException e) {

                        e.printStackTrace();

                    }

        }

    }

 

CallableStatement是可以用非sql語句來訪問數據庫,他是通過調用存儲過程(PL/SQL)來訪問數據庫的。可以直接使用連接來調用 prepareCall(...)方法,來執行這個存儲過程,"..."是存儲過程的名字。

 

對于系統時間要去數據庫時間

TimeStamp  Date都可以保存時間

TimeStamp可以保存時、分、秒的數據,Date只保存日期年月的信息。

 

SQLException是檢查異常必須處理要么throws ,要么try{}catch(){}

getErrorCode()可以獲得錯誤碼,可以對錯誤進行查詢。

 

 

四、源數據

JDBC中有兩種源數據,一種是數據庫源數據,另一種是ResultSet源數據。

 

源數據就是描述存儲用戶數據的容器的數據結構。

 

ResultSet rs=ps.executeQuery(sql);

ResultSetMetaData m=rs.getMetaData();

 

getColumnCount(),獲得實際列數

getColumnName(int colnum),獲得指定列的列名

getColumnType(int colnum),獲得指定列的數據類型

getColumnTypeName(int colnum),獲得指定列的數據類型名

 

//打印結果集

public static void printRS(ResultSet rs)throws SQLException{

    ResultSetMetaData rsmd = rs.getMetaData();

    while(rs.next()){

       for(int i = 1 ; i < = rsmd.getColumnCount() ; i++){

          String colName = rsmd.getColumnName(i);

          String colValue = rs.getString(i);

          if(i>1){

             System.out.print(",");

          }

          System.out.print(name+"="+value);

       }

       System.out.println();

    }

}

 

 

五、數據庫源數據

 

DatabaseMetaData

getURL(),獲得連接數據庫的URL

getDatabaseProductName() 獲得數據庫產品的名稱

getDriverVersion() 獲得JDBC驅動程序的String形式的版本號

getTables()獲得數據庫中該用戶的所有表

getUserName() 獲得數據庫用戶名。

 

六、事務(Transaction)

 

事務是針對原子操作的,要求原子操作不可再分,要求原子操作必須同時成功同時失敗。

事務是捆綁的原子操作的邊界。

JDBC中使用事務,先要使用連接調用setAutoCommite(false)方法,把自動提交(commit)置為false。打開事務就要關閉自動提交。不用事務是要把setAutoCommite(true)

 

在處理事務時,在發送sql語句后執行成功并確認時,就在try塊中使用連接調用commit()方法來發送提交信息,

在發送sql語句后執行失敗時,會在catch語句塊中使用連接調用rollback()方法來發送回滾信息,也可以在需要時做回滾操作(主觀原因)。

 

七、JDBC事務并發產生的問題和事務隔離級別

 

1,臟讀(dirty read),讀取到了沒有提交的數據。

2,不可重復讀(UnPrpeatable Read),兩次讀取到了不同的數據,就是要保持在同一時間點上兩次讀取到的數據相同,

   不能夠使查詢數據時進行改變。

3,幻讀(phantom),在兩次查詢同一時間點數據時,數據數量發生改變,要保持在同一時間點上兩次讀取到的數據相同。

 

事務隔離級別

 

TRANSACTION_NONE不使用事務。

TRANSACTION_READ_UNCOMMITTED 可以讀取為提交數據。

TRANSACTION_READ_COMMITTED可以避免臟讀,不能夠讀取沒提交的數據,最常用的隔離級別  大部分數據庫的默認隔離級別

TRANSACTION_REPEATABLE_READ可以避免臟讀,重復讀取,

TRANSACTION_SERIALIZABLE可以避免臟讀,重復讀取和幻讀,(事務串行化)會降低數據庫效率

 

以上的五個事務隔離級別都是在Connection類中定義的靜態常量,使用setTransactionIsolation(int level) 方法可以設置事務隔離級別。

 

八,異常的處理

try{}

catch(SQLException){}

try{}

catch(Exception){}

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!