JDBC上_數據庫連接

1. JDBC的概述
    概述: 就是Java用來操作不同數據庫的類庫, 本質其實就是一些JavaAPI.
          //Java Data Base Connectivity, Java數據庫連接(技術)
          //大白話: 就是Java語言編寫的一些類和接口, 用於操作不同數據庫的.(DriverManager,Connection,Statement,PreparedStatement, ResultSet)

          //集合: 就是Java用來存儲不同類型數據的容器. 大白話, 就是一些接口和類.(Collection,Set,List,Map,ArrayList,HashSet,HashMap)
          //IO流: 就是Java用來操作文件(夾)的. 大白話, 就是一些類和接口(InputStream,OutputStream,Reader,Writer).
          //集合的頂層都是接口, IO流的頂層都是: 抽象類.


    作用:
        A: 連接數據庫.
        B: 向數據庫發送SQL語句.
        C: 操作數據庫返回的結果集.
            //如果操作的是更新語句, 返回的結果集是: int
            //如果操作的是查詢語句, 返回的結果集是: ResultSet



2. 什麼是驅動?
    驅動: 指的是設備間進行通信的橋樑.


3. JDBC的原理
    我們知道JDBC是用來操作不同數據庫的, 但是操作不同的數據庫需要使用不同的驅動.例如: 我們想操作MySQL數據庫, 就需要安裝MySQL的驅動, 我們想操作Oracle數據庫, 就需要安裝Oracle數據庫的驅動, 如果我們操作SQLServer數據庫,
    就需要安裝SQLServer數據庫的驅動, 這樣做是比較麻煩的. 因爲Java一定提供了大量的類和接口了, 但是要要求額外記憶一些
    其他的類和接口, 這樣就增加了程序員的學習難度. 
    後來Sun公司發現了這個問題, 就和各大數據庫生產商協商決定, 由Sun公司提供統一的規範(就是一些類和接口), 數據庫生產商
    提供具體的實現. Sun公司提供的這些類和接口就是: API.

4. JDBC的案例演示
    A: 新建一個web03數據庫.
    B: 在該庫中創建一張表: users(uid,uname,pw,age)
    C: 往該表中添加數據.
    D: 通過JDBC來操作數據庫.
        1) 導入驅動
        2) 註冊驅動
        3) 獲取連接對象
        4) 根據連接對象,獲取可以執行SQL語句的對象
        5) 執行SQL語句,獲取結果集
        6) 操作結果集
        7) 釋放資源

5. JDBC的API詳解之: DriverManager
    DriverManager: 驅動管理.

    作用一: 用於註冊驅動.        //瞭解就行了, 一般不用這種方式註冊驅動.
        public static void registerDriver(Driver d);    //註冊驅動. 這裏的Driver是java.sql包下的Driver接口.
        /*
                //  com.mysql.jdbc          java.sql
            public class Driver implements Driver {
            }
        */
        上述的註冊驅動的方式, 在實際開發中是不用的, 因爲這種方式會導致: 驅動程序註冊兩次.
        實際開發中的做法: 通過 反射 的方式註冊驅動.
        //核心: 通過"反射"技術, 加載Driver.class字節碼文件, 因爲該類中有靜態代碼塊,
        //      所以在加載該類的字節碼文件的時候, 靜態代碼塊也跟着加載了, 從而實現註冊驅動.
        Class.forName("類的全類名"); //該方法的作用是: 加載指定的類的字節碼文件到 內存中.

    作用二: 獲取連接對象.
        public static Connection getConnection(String url,String username,String password);  //用於獲取連接對象.
        /*
            方法的形參的解釋:
                url: 數據庫連接字符串
                    jdbc:mysql://localhost:3306/要操作的數據庫
                    jdbc:mysql://127.0.0.1:3306/操作的數據庫

                    格式:
                        協議:子協議://要鏈接的數據庫的IP或者主機名:端口號/要操作的數據庫

                    如果你操作的是本地服務器, 上述的方式可以優化爲:
                        jdbc:mysql:///操作的數據庫

                username: 要操作的數據庫的 賬號
                password: 要操作的數據庫的 密碼
        */


6. JDBC的API詳解之: Connection
    Connection: 連接對象.

    作用一: 用來獲取 可以執行SQL語句的對象. //掌握
        public Statement createStatement();             //獲取可以執行SQL語句的對象.
            public ResultSet executeQuery(String sql);  //執行查詢語句
            public int executeUpdate(String sql);       //執行更新語句

        public PreparedStatement prepareStatement(String sql);  //獲取可以執行SQL語句的對象, 可以預編譯.
            public ResultSet executeQuery();    //執行查詢語句
            public int executeUpdate();     //執行更新語句

            public void setXxx(int index,Xxx value);    //給第index個佔位符賦值爲: value, 佔位符是從1開始數的.




    作用二: 可以操作事務.        //目前先理解.
        public void setAutoCommit(boolean flag);    //設置是否開啓事務的自動提交功能.
        public void commit();       //提交事務
        public void rollback(); //事務回滾
        public void setTransactionIsolation(int level); //設置事務的隔離級別.


    Connection接口中的常量:       //目前理解即可
        public static final int TRANSACTION_NONE = 0;
        public static final int TRANSACTION_READ_UNCOMMITTED = 1;
        public static final int TRANSACTION_READ_COMMITTED = 2;
        public static final int TRANSACTION_REPEATABLE_READ = 4;
        public static final int TRANSACTION_SERIALIZABLE = 8;


7. JDBC的API詳解之: Statement
    Statement: 可以執行SQL語句的對象.

    作用一:     用於執行SQL語句. //掌握
        public ResultSet executeQuery(String sql);  //執行查詢語句
        public int executeUpdate(String sql);       //執行更新語句

    作用二:  可以執行批處理.  //目前先了解即可, 批處理只針對 更新語句. 
        public void addBatch(String sql);   //把SQL語句添加到指定的批處理中.
        public int[] executeBatch();        //執行批處理. 
        public void clearBatch();           //清空批處理.


8. JDBC的API詳解之: ResultSet
    ResultSet: 結果集對象, 表示的是: 查詢語句執行後的結果.

    public boolean next();      //判斷結果集中是否還有 數據,  類似於我們之前學習集合時候的: hasNext().
    public Xxx getXxx(int colunmNumber);    //根據給定的列的編號,獲取該列的值.  Xxx表示數據類型, 列的編號從1開始.
    public Xxx getXxx(String colunmName);   //根據給定的列的名字,獲取該列的值. Xxx表示數據類型.


9. JDBC釋放資源的優化代碼.       //重點掌握.


10. JDBCUtils工具類的抽取.
    方式一: 普通抽取.
        public class JDBCUtils {
            //私有構造
            private JDBCUtils() {}

            //通過靜態代碼塊, 來註冊驅動
            static {
                try{
                    Class.forName("com.mysql.jdbc.Driver");
                } catch(Exception e){
                    e.printStackTrace();    //異常的描述信息, 異常的類型, 異常出現的位置.
                }
            }

            //獲取連接對象
            public static Connection getConnection() {
                return...
            }

            //釋放資源
            public static void release(Connection conn,Statement stat, ResultSet rs) {

            }
            //釋放資源
            public static void release(Connection conn,Statement stat) {

            }
        }

    方式二: 結合配置文件使用.    //Properties
        Properties: 集合類, 是一個雙列集合, 鍵值都是String類型, 它是Hashtable集合類的子類.
            //記憶: 它是唯一一個可以直接和IO流相結合使用的 集合類.
            public void load(InputStream is);       //可以從流(文件)中讀取數據.
            public void store(OutputStream os);     //可以寫數據到流(文件)中.


11. SQL注入攻擊.
    概述: 實際開發中, 如果SQL語句中的部分內容是要求用戶鍵盤錄入的, 這個時候如果用戶錄入了我們不想要的數據,
          就有可能引發安全問題, 這個安全問題就是: SQL注入攻擊問題.
          //SQL注入攻擊, SQL豬肉攻擊.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章