jdbc—JDBC常用接口介紹


1.什么是JDBC

  -1.JDBC(Java Database Connection)為Java開發者使用數據庫提供了統一的編程接口,它由一組Java類和接口組成。是Java程序與數據庫通信的標准API。

JDBC API使得開發人員可以使用純Java的方式來連接數 據庫,並執行操作。

  -2.sun公司由於不知道各個主流商用數據庫的程序代碼,因此無法自己寫代碼連接各個數據庫,因此,sun公司自己提供了一套API,只要數據庫想要和Java連接的,

數據庫廠商必須自己實現JDBC這套接口。而數據庫廠商的JDBC實現,我們就叫它此數據庫的驅動。

2.JDBC訪問數據庫流程

  1.加載JDBC驅動程序

  2.建立與數據庫的連接

  3.發送SQL語句

  4.得到SQL執行結果

3.Java程序和數據庫連接的時候,其實就是Socket連接。

4.JDBC常用接口

  Driver接口

    - Driver接口由數據庫廠家提供,對於Java開發者而言,只需要使用Driver接口就可以了。

    - 在編程中要連接數據庫,必須先裝載特定廠商的數據庫驅動程序。不同的數據庫有不同的裝載方法。

    - 驅動:就是各個廠商實現Sun公司提出的JDBC接口。即對Connection等接口的實現類的jar文件。

    - 裝載mysql驅動:Class.forName("com.mysql.jdbc.Driver");

    - 裝載oracle驅動:Class.forName("com.jdbc.driver.OracleDriver");

  DriverManager接口

    - DriverManager接口是JDBC的管理層,作用於用戶和驅動程序之間。

    - DriverManager跟蹤可用的驅動程序,並在數據庫和相應的驅動之間建立連接。

  Connection接口

    - Connection與特定數據庫的連接(會話),在連接上下文中執行SQL語句並返回結果。

    - DriverManager的getConnection()方法建立在JDBC URL中定義的數據庫Connection連接上

      -Mysql

        Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

      -Oracle

        Connection con = DriverManager.getConnection("jdbc:oracle:thin@host:port/database", "user", "password");

   Statement接口

    - 用於執行靜態SQL語句並返回它所生成結果的對象。

    - 三種Statement類:

      - Statement:

        由createStatement創建,用於發送簡單的SQL語句(不帶參數)

      - PreparedStatement:

        - 繼承自Statement接口,有preparedStatement創建,用於發送含有一個或者多個輸入參數的SQL語句。PreparedStatement對象

         比Statement對象效率更高,並且是防止SQL注入。我們一般都使用PreparedStatement。

      - CallableStatement:

        - 繼承自preparedStatement。由方法prePareCall創建,用於調用存儲過程。

    - 常用的Statement方法

        - execute():運行語句,返回是否有結果集。

        - executeQuery():運行select語句,返回ResultSet結果節

        - executeUpdate():運行insert/update/delete操作,返回更新的行數。

    - 例子:

        

package com.yf.jdbc.test;

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

/**
 * 測試執行SQL語句和SQL注入問題
 * @author yangf
 *
 */
public class Demo02 {
    public static void main(String[] args) {
        try {
            // 加載數據庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            // 獲得connection對象 建立與數據庫連接
            /*
             * 連接對象內部其實包含了Socket對象,是一個遠程連接。比較耗時!這是Connection對象管理的一個要點。
             * 后面通過連接池來做
             */
            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
            
            Statement stmt = con.createStatement();
            String sql = "insert into t_user (username,pwd,regTime) values ('yyy',123123,now())";
            stmt.execute(sql);
            
            String sql1 = "delete from t_user where id = 4";
            stmt.execute(sql1);
            // 測試SQL注入
            // 由於是外部傳入參數,所以可以任意修改DB,造成SQL注入,所以我們不適用Statement
            String id = "5 or 1 = 1";
            String sql2 = "delete from t_user where id = " + id;
            stmt.execute(sql2);
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
package com.yf.jdbc.test;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
 * 測試PreparedStatement的基本用法
 * @author yangf
 *
 */
public class Demo03 {
    public static void main(String[] args) {
        try {
            // 加載數據庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            // 獲得connection對象 建立與數據庫連接
            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
            String sql = "insert into t_user (username,pwd,regTime) values (?,?,?)";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, "yangf");
            ps.setInt(2, 888888);
            ps.setDate(3, new Date(System.currentTimeMillis()));
            
            ps.execute();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

  ResultSet接口

      - Statement執行SQL語句時返回Result結果集。

      - ResultSet提供的檢索不同類型字段的方法,常用的有:

        - getString():獲得在數據庫里是varchar,char等數據類型的對象。

        - getFloat():獲得數據庫里是Float類型的對象

        - getDate():獲得數據庫里是Date類型的對象

        - getBoolean():獲得數據庫里是Boolean類型的數據

      - 依序關閉使用的對象和連接

        Result->Statement->Connection

/**
 * 測試ResultSet的用法
 * @author ibm
 *
 */
public class Demo04 {
    public static void main(String[] args) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 加載數據庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            // 獲得connection對象 建立與數據庫連接
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
            String sql = "select * from t_user where id > ?";
            ps = con.prepareStatement(sql);
            ps.setInt(1, 2);
            // 內部就是個迭代器
            rs = ps.executeQuery();
            
            while (rs.next()) {
                System.out.println(rs.getInt(1) + "--" + rs.getString(2) + "--" + rs.getInt(3) + "--" + rs.getDate(4));
            }
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 批處理

  - batch

  - 對於大量的批處理,建議使用Statement,因為PreparedStatement的預編譯空間有限,數據量特別大時,會發生異常。

  

package com.yf.jdbc.test;

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

/**
 * 測試批處理
 * @author yangf
 *
 */
public class Demo05 {
    public static void main(String[] args) {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 加載數據庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            // 獲得connection對象 建立與數據庫連接
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
            // jdbc中事物是自動提交的,我們設為手動提交
            con.setAutoCommit(false);
            long start = System.currentTimeMillis();
            stmt = con.createStatement();
            
            for (int i = 0; i < 20000; i++) {
                stmt.addBatch("insert into t_user (username,pwd,regTime) values ('yangf "+ i + "', 6666 , now())");
            }
            
            stmt.executeBatch();
            con.commit();
            long end = System.currentTimeMillis();
            
            System.out.println("插入20000萬條數據耗時:" + (end - start) + "毫秒");
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM