黑馬就業班第五天-JDBC

wj541350發表於2016-11-22


    jdbc:Java DataBase Connectivity,java資料庫的連線

     比如有一臺電腦,想在電腦上安裝顯示卡,需要顯示卡的驅動,由顯示卡生產廠商提供

    要想使用java對資料庫進行操作,需要使用由資料庫提供的資料庫驅動

    一個程式,使用java運算元據庫,掌握java程式碼,除了掌握java程式碼之外,需要掌握資料庫驅動的程式碼,
    很多的資料庫,比如mysql、oracle,對於程式設計師來講,需要掌握每種資料庫的程式碼,對於程式設計師壓力很大

     sun公司針對這種情況,開發出一套標準介面,各個資料庫只需要實現這個介面就可以了,程式設計師只需要掌握這套
    介面就可以了,這套標準的介面就是jdbc

     如果想要使用jdbc對資料庫進行操作,首先安裝資料庫的驅動,不同的資料庫提供驅動使用jar的形式提供的,
    需要把jar包放到專案裡面,相當於安裝了資料庫的驅動。

     匯入jar到專案中(使用到開發工具 myeclipse10.x版本)
    首先建立一個資料夾 lib,把jar包複製到lib裡面,選中jar包右鍵點選build path -- add to build path,
    jar包前面的圖示變成了“奶瓶”圖示,表示匯入jar成功

2、JDBC的入門案例
    2.1 使用jdbc對資料庫進行操作步驟是固定的
    2.1.1 使用到類和介面
    DriverManager
    Connection
    Statement
    ResultSet

    2.2 jdbc的操作步驟
    第一步,載入資料庫的驅動
    DriverManager裡面registerDriver(Driver driver)

    第二步,建立與資料庫的連線
    DriverManager裡面getConnection(String url, String user, String password)

    第三步,編寫sql語句

    第四步,執行sql語句
    Statement裡面executeQuery(String sql)

    第五步,釋放資源(關閉連線)
    

    2.3 使用jdbc實現查詢的操作
    2.3.1 程式碼
    public static void main(String[] args) throws Exception {
        //載入驅動
        DriverManager.registerDriver(new Driver());
        //建立連線
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb2", "root", "root");
        //編寫sql
        String sql = "select * from user";
        //執行sql
        //得到statement
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        //遍歷結果集得到每條記錄
        while(rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            int chinese = rs.getInt("chinese");
            int english = rs.getInt("english");
            System.out.println(id+" :: "+username+" :: "+chinese+" :: "+english);
        }
        //釋放資源
        rs.close();
        stmt.close();
        conn.close();
    }

3、jdbc的DriverManager物件
    3.1 在java.sql包裡面

    3.2 載入資料庫的驅動
    registerDriver(Driver driver) :引數是資料庫的驅動,這個驅動是由資料庫提供的
    (1)這個方法在實際開發中,一般不使用,因為這個方法會載入驅動兩次
    (2)一般在開發中使用反射的方式載入資料庫的驅動
    Class.forName("com.mysql.jdbc.Driver");

    3.3 得到資料庫的連線
    getConnection(String url, String user, String password),返回Connection
    (1)有三個引數
    第一個引數:表示要連線的資料庫
    寫法:jdbc:mysql://資料庫的ip:資料庫的埠號/連線的資料庫的名稱
    jdbc:mysql://localhost:3306/testdb2
    簡寫的方式:jdbc:mysql:///testdb2(使用範圍:連線的資料庫是本機,埠是3306)

    第二個引數:表示連線資料庫的使用者名稱
    第三個引數:表示連線資料庫使用者密碼

4、jdbc的Connection物件
    4.1 代表資料庫的連線,是介面,在java.sql包裡面
    
    4.2 建立statement物件
    Statement createStatement()

    4.3 建立預編譯物件 PreparedStatement
    PreparedStatement prepareStatement(String sql)
 
 5、jdbc的Statement物件
    5.1 執行sql的物件,介面,在java.sql包裡面

    5.2 執行查詢操作方法
    ResultSet executeQuery(String sql) ,返回查詢的結果集

    5.3 執行增加 修改 刪除的方法
    int executeUpdate(String sql) ,返回成功的記錄數

    5.4 執行sql語句的方法
    boolean execute(String sql) ,返回是布林型別,如果執行的是查詢的操作返回true,否則返回的false
    
    5.5 執行批處理的方法
    addBatch(String sql):把多個sql語句放到批處理裡面
    int[] executeBatch():執行批處理裡面的所有的sql
 
6、jdbc的ResultSet物件
    6.1 代表查詢之後返回的結果,介面,在java.sql包裡面
    類似於使用select語句查詢出來的表格

    6.2 遍歷結果集
    next()
    
    6.3 得到資料的具體值
    getXXX
    (1)比如資料是string型別,使用getString("欄位的名稱")
         比如資料是int型別,使用getInt("欄位的名稱")
         比如不知道資料的型別,使用getObject("欄位的名稱")
    
    6.4 結果集的遍歷方式
    在最開始的時候在第一行之前,當執行了next方法之後,一行一行的向下進行遍歷
    ,在預設的情況下,只能向下,不能向上,在遍歷出來的結果也是不能修改的

7、jdbc的釋放資源
    7.1 關閉的原則:誰最先開啟,誰最後關閉
    7.2 關閉資源的規範的寫法
    finally {
        //釋放資源
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }            
    }

8、使用jdbc進行crud操作
    (1)實現對資料庫表記錄進行查詢的操作
        * executeQuery(sql)

    (2)實現對資料庫表記錄進行增加的操作
        * executeUpdate(sql)

    (3)實現對資料庫表記錄進行修改的操作
        * executeUpdate(sql)

    (4)實現對資料庫表記錄進行刪除的操作
        * executeUpdate(sql)

9、jdbc工具類的封裝
    9.1 當在很多的類裡面有相同的程式碼,可以把相同的程式碼提取到一個工具類裡面,
    在類裡面直接呼叫工具類裡面的方法實現

    9.2 在jdbc實現crud操作的程式碼裡面,首先得到資料庫連線,和釋放資源的程式碼是重複的,所以進行封裝

    9.3 可以把資料庫的一些資訊,寫到配置檔案裡面,在工具類讀取配置檔案得到內容
    一般使用properties格式檔案作為儲存資料庫資訊的檔案
    有兩種方式讀取配置檔案
    第一種,使用properties類
    (1)程式碼
    //建立properties物件
    Properties p = new Properties();
    //檔案的輸入流
    InputStream in = new FileInputStream("src/db.properties");
    //把檔案的輸入流放到物件裡面
    p.load(in);
    String drivername = p.getProperty("drivername");
    String url = p.getProperty("url");
    String username = p.getProperty("username");
    String password = p.getProperty("password");

    第二種,使用ResourceBundle類
    * 使用範圍:首先讀取的檔案的格式需要時properties,檔案需要放到src下面
    (1)程式碼
    String drivername = ResourceBundle.getBundle("db").getString("drivername");
    String url = ResourceBundle.getBundle("db").getString("url");
    String username = ResourceBundle.getBundle("db").getString("username");
    String password = ResourceBundle.getBundle("db").getString("password");

    9.4 程式碼
    public static String drivername;
    public static String url;
    public static String username;
    public static String password;
    
    //在類載入時候,執行讀取檔案的操作
    static {
        drivername = ResourceBundle.getBundle("db").getString("drivername");
        url = ResourceBundle.getBundle("db").getString("url");
        username = ResourceBundle.getBundle("db").getString("username");
        password = ResourceBundle.getBundle("db").getString("password");
    }

10、使用jdbc的工具類實現crud操作

11、sql的注入和防止
    11.1 模擬登入的效果
    (1)登入的實現的步驟
    首先,輸入使用者名稱和密碼
    第二,拿到輸入的使用者名稱和密碼,到資料庫裡面進行查詢,如果使用者名稱和密碼都正確,才表示登入成功;
    但是如果使用者名稱和密碼,有一個是錯誤的,表示登入失敗。
    
    11.2 演示sql的注入
    (1)在登入時候,使用者名稱裡面輸入 bbb' or '1=1,因為在表裡面有一個使用者是bbb,可以登入成功
    因為輸入的內容,被作為sql語句的一個條件,而不是作為整個使用者名稱。
    select * from user where username='bbb' or '1=1' and password='rrr'

    11.3 防止sql的注入
    (1)使用PreparedStatement預編譯物件防止sql注入
    (2)建立PreparedStatement物件 prepareStatement(String sql)
    (3)PreparedStatement介面的父介面Statement
    (4)什麼是預編譯
    (5)步驟:
    第一步,載入驅動,建立資料庫的連線
    第二步,編寫sql
    第三步,需要對sql進行預編譯
    第四步,向sql裡面設定引數
    第五步,執行sql
    第六步,釋放資源
    (6)程式碼
    //使用工具類得到資料庫的連線
    conn = MyJdbcUtils.getConnection();
    //編寫sql
    String sql = "select * from user where username=? and password=?";
    //對sql進行預編譯
    psmt = conn.prepareStatement(sql);
    //設定引數
    psmt.setString(1, username);
    psmt.setString(2, password);
    //執行sql
    rs = psmt.executeQuery();
    if(rs.next()) {
        System.out.println("login success");
    } else {
        System.out.println("fail");
    }

12、使用PreparedStatement預編譯物件實現crud的操作
    注意地方:
    第一,編寫sql時候,引數使用?表示(佔位符)
    第二,預編譯sql,設定引數的值,執行sql

    12.1 使用PreparedStatement預編譯物件實現查詢的操作
    (1)預編譯物件executeQuery()執行查詢語句

    12.2 使用PreparedStatement預編譯物件實現增加的操作
    (1)預編譯物件executeUpdate()執行增加的語句

    12.3 使用PreparedStatement預編譯物件實現修改的操作
    (1)預編譯物件executeUpdate()執行修改的語句

    12.4 使用PreparedStatement預編譯物件實現刪除的操作
    (1)預編譯物件executeUpdate()執行刪除的語句



---------------------------------程式碼--------------------
1 JDBC 核心物件
    |--Connection:連線物件
        |--獲取指令物件conn.createStatement()
        |--獲取預編譯物件conn.prepareStatement(sql)
        
    |--DriverManager:驅動管理物件
        |--註冊驅動(被Class.forName()替代)
        |--連線資料庫獲取 連線物件DriverManager.getConnection(url,name,pwd)
    
    |--Statement:指令物件
        |--執行sql
    
    |--PreparedStatement:預編譯物件
        |--解決sql注入安全問題
    
    |--ResultSet:結果集物件
        |--查詢到的結果
    
    
2 JDBC操作步驟
    |--載入驅動
    |--獲取連線物件
    |--準備sql
    |--獲取指令物件
    |--執行sql
    |--[處理查詢的結果集]

3 釋放連線

    if(rs!=null){
        try{
            rs.close();
        }catch(Exception e){
            //...
        }
        rs=null;
    }
    if(stmt!=null){
        try{
            stmt.close();
        }catch(Exception e){
            //...
        }
        stmt=null;
    }
    if(conn!=null){
        try{
            conn.close();
        }catch(Exception e){
            //...
        }
        conn=null;
    }
    
4 一個標準的例子(完整的,程式碼比較多的)
    public void jdbcDemo(){
        
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        
        try{
            //載入驅動
            Class.forName("com.mysql.jdbc.Driver");
            
            //獲取連線物件
            conn = DriverManager.getConnection("jdbc:mysql:localhost:3306/testDB", "root", "123");
            
            //獲取指令物件
            stmt = conn.createStatement();
            
            //執行查詢sql,獲取結果集
            rs = stmt.executeQuery("select * from users");
            
            //處理結果集
            while(rs.next()){
                String username = rs.getString("username");
                int age = rs.getInt("age");
                String addr = rs.getString("addr");
                System.out.println(username+" :"+age+" :"+addr);
            }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            /**--------------釋放資源-----------*/
            if(rs!=null){
                try{
                    rs.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                rs=null;
            }
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                stmt=null;
            }
            if(conn!=null){
                try{
                    conn.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                conn=null;
            }
        }
    
5 工具類封裝

    /**---獲取連線物件---**/
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    //靜態欄位獲取
    static{
        driver = ResourceBundle.getBundle("jdbc").getString("driver");
        url = ResourceBundle.getBundle("jdbc").getString("url");
        username = ResourceBundle.getBundle("jdbc").getString("username");
        password = ResourceBundle.getBundle("jdbc").getString("password");
    }
    
    public Connection getConnection() throws Exception{
        //載入驅動
        Class.forName(driver);
        //獲取連線物件
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }

6 使用預編譯物件
    public void jdbcPre(){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        
        try{
            conn = JdbcUtil.getConn();
            ps = conn.prepareStatement("select * from users where age>? and addr like '%?%'");
            ps.setInt(1, 23);
            ps.setString(2, "beijing");
            rs = ps.executeQuery();
            //處理結果集
            while(rs.next()){
                String username = rs.getString("username");
                int age = rs.getInt("age");
                String addr = rs.getString("addr");
                System.out.println(username+" :"+age+" :"+addr);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtil.releaseResource();
        }
    }

    
    
    
    

    
    
    
    
   

相關文章