關於JDBC總結

1.JDBC介紹

     1.1.What is JDBC?

            1.     JDBC(Java Database Connectivity)是基於JAVA語言訪問數據庫的一種技術。
            2.     JDBC 的設計思想:由 SUN 公司(JCP)提供訪問數據庫的接口,由數據庫廠商提
                    供對這些接口的實現,程序員編程時都是針對接口進行編程的。
            3.     JDBC 包括一套 JDBC 的 API 和一套程序員和數據庫廠商都必須去遵照的規範。
                        1) java.sql包:提供訪問數據庫基本的功能
                        2) javax.sql包:提供擴展的功能
            4.     數據庫中間件
            5.     JDBC能夠作些什麼?
                        1) 鏈接到數據庫
                        2) 在Java app中執行SQL命令
java

                        3) 處理結果 。mysql

        1.2.Five important interfaces of JDBC
程序員

            1.     Connection:特定數據庫的鏈接(會話)。在鏈接上下文中執行 SQL 語句
                    並返回結果
            2.     Statement:用於執行靜態 SQL 語句並返回它所生成結果的對象
            3.     PreparedStatement:表示預編譯的 SQL 語句的對象
            4.     CallableStatement:用於執行 SQL 存儲過程的接口
            5.     ResultSet:表示數據庫結果集的數據表,一般經過執行查詢數據庫的語
sql

                    句生成數據庫

 2.The step of developping a JDBC App

       2.1. 註冊 JDBC  驅動程序

              1. Class.forName("oracle.jdbc.driver.OracleDriver");
              2. Class.forName("oracle.jdbc.driver.OracleDriver");

              3. java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver com.FirstJDBC編程

       2.2. 建立數據庫鏈接( 獲取 Connection  的方法)

                 經過DriverManager  獲取
                Connection conn = DriverManager.getConnection(url, 「username", 「password");
                1) JDBC的URL=協議名+子協議名+數據源名。
                       a 協議名老是「jdbc」。
                       b 子協議名由JDBC驅動程序的編寫者決定。
                       c 數據源名也可能包含用戶與口令等信息;這些信息也可單獨提供。
                2) 幾種常見的數據庫鏈接
                -------------------------------jdbc-odbc---------------
                驅動:sun.jdbc.odbc.JdbcOdbcDriver
                URL:jdbc:odbc:datasource_name
                -------------------------------oracle------------------
                驅動:oracle.jdbc.driver.OracleDriver
                URL:jdbc:oracle:thin:@<machine_name><:port>:dbname
                注:machine_name:數據庫所在的機器的名稱;
                port:端口號,默認是1521
                -------------------------------mysql-------------------
                驅動:org.gjt.mm.mysql.Driver
                or: com.mysql.jdbc.Driver
                URL:jdbc:mysql://<machine_name><:port>/dbname
                注:machine_name:數據庫所在的機器的名稱;
                port:端口號,默認3306
                ---------------------------SQL Server------------------
                驅動:com.microsoft.jdbc.sqlserver.SQLServerDriver
                URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
                注:machine_name:數據庫所在的機器的名稱;
                port:端口號,默認是1433
                --------------------------DB2--------------------------
                驅動:com.ibm.db2.jdbc.app.DB2Driver
                URL:jdbc:db2://<machine_name><:port>/dbname
                注:machine_name:數據庫所在的機器的名稱;
                port:端口號,默認是5000
                -------------------------------------------------------
      2.3. 建立 SQL( 存儲過程)
         
             2.3.1. 建立 Statement  對象
                    1. Statement stm = con.createStatement();
                    2. 主要方法
                        1)     執行查詢 SQL 語句(返回結果集)
                                ResultSet executeQuery(String sql)throws SQLException;
                        2)     執行更新 SQL 語句(返回受影響的行數)
                                int rows = executeUpdate(String sql)throws SQLException
                        3)     萬能執行 SQL 語句(若是第一個結果爲 ResultSet 對象,則返回 true;若是其爲更
                                新計數或者不存在任何結果,則返回 false)
                                boolean flag=stmt.execute(sql);
                                ResultSet rs=null;
                                int rows=0;
                                if(flag){
                                rs=stmt.getResultSet();
                                }
                                else{
                                rows=stmt.getUpdateCount();
                                }

                2.3.2. PreparedStatement

                   1. 用來處理 SQL 結構、關鍵部分相同的 SQL 語句
                    2. pstmt=conn.prepareStatement(sql);
                    3. 例子
                        String sql = "SELECT * FROM student WHERE stu_sex=?";
                        //?表明一個佔位符合,它的值是待定的。
                        pstmt=conn.prepareStatement(sql);
                        //下面的語句設置?的值
                        //第一參數是?的索引位置
                        //第二參數:把?的值設置成這個參數
                        pstmt.setString(1, 「f");
                        rs=pstmt.executeQuery();
                        String sql = "INSERT INTO student(stu_name,stu_sex,stu_age,stu_desc,stu_grade)
                        VALUES(?,?,?,?,?)";
                        pstmt=conn.prepareStatement(sql);
                        pstmt.setString(1, "LILY");
                        pstmt.setString(2, "F");
                        pstmt.setInt(3, 23);

                         pstmt.setString(4, "***");
                        pstmt.setString(5, "sd0702");
                        pstmt.executeUpdate();

            2.3.3. CallableStatement

              1.     用來執行存儲過程
                2.     CallableStatement cstmt=con.prepareCall(sql);
                3.     例子
                        String sql = "CALL getTotalStudent(?,?)";
                        CallableStatement cstmt=con.prepareCall(sql);
                        // 設置OUT和IN參數
                        cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
                        cstmt.setString(2, "xxx");
                        建立一個存儲過程
                        in:參數從Java程序傳到數據庫的存儲過程
                        out:反過來
                        SQl語句中建立存儲過程:
                                1) delimiter //
                                2)
                                CREATE PROCEDURE getTotalStudent(OUT totalStudent integer(11),IN sex char(2))
                                BEGIN
                                SELECT count(*) INTO totalStudent FROM
                                student
                                WHERE stu_sex LIKE sex;
                                END//
                                3) delimiter ;
             2.3.4. Statement  接口的比較
                 Statement接口的比較
                    
  Statement PreparedStatement CallableStatement
代碼建立  數據庫服務器的客戶端 數據庫服務器的客戶端 數據庫服務器端
代碼存儲 客戶端  服務器端  服務器端
編程語言 Java、SQL Java、SQL 服務器端特定數據庫
語言
可配置性 靈活
可移植性  高     (支持)差
效率 低  第一次低,之後高
    選擇:沒有最好,只有最合適!
    建議:能夠移植性好首先考慮的條件!而後再考慮性能問題!
     
    2.4.How to handle resultset
          1. 經過 index 獲取字段的值
                String getString(int columnIndex) //int類型的參數
                SELECT * FROM student;//默認順序按表裏的定義順序
                rs.getString(3);//stu_sex
                SELECT stu_name,stu_sex,stu_desc FROM student;
                rs.getString(3);//stud_desc
                columnIndex:select子句中該字段的索引位置
        2.  經過字段名獲取字段的值。
                String getString(String columnName) //String類型的參數
                以 Java 編程語言中 String 的形式檢索此 ResultSet 對象的當前行中指定列的值。
                rs.getString("stu_name");//stu_name
                rs.getInt("stu_id");//stu_id
        3.  Java 類型到 SQL 類型的映射。

    2.5. 關閉 JDBC 
         1.     首先關閉記錄集;         2.     其次關閉Statement;         3.     最後關閉鏈接對象。                    if(rs !=null){                    try{rs.close();}catch(SQLException e){e.printStackTrace();}}                    if(stm!=null){try{stm.close();}catch(SQLException                    e){e.printStackTrace();}}                    if(con!=null){try{con.close();}catch(SQLException                    e){e.printStackTrace();}}