1. 程式人生 > >java開發中JDBC連線資料庫的步驟

java開發中JDBC連線資料庫的步驟

JDBC核心類

DriverManager 用於管理驅動/獲得連線
Connection 用於連線資料庫
Statement 用於執行SQL語句
ResultSet 使用者獲取執行結果,可以對資料庫欄位進行取出,修改,刪除等操作

完整java開發中JDBC連線資料庫包含7個步驟

    1, 載入註冊JDBC驅動
          在連線資料庫之前,首先要載入想要連線的資料庫的驅動到JVM(Java虛擬機器),   
          這通過java.lang.Class類的靜態方法forName(String  className)實現。
        Class.forName("com.mysql.jdbc.Driver");會丟擲ClassNotFoundException異常
        (當驅動沒找到時),catch住提醒“MYSQL驅動載入失敗”

    2,提供JDBC連線的URL   
        連線URL定義了連線資料庫時的協議、子協議、資料來源標識,使用者名稱,密碼。 

    ("jdbc:mysql://localhost/demo1?useUnicode=true&charcterEncoding=
    UTF-8","root","root")
     //協議://主機:埠號/資源路徑?查詢字串


    3,通過驅動連線資料庫
        要連線資料庫,需要向java.sql.DriverManager請求並獲得Connection物件,   
         該物件就代表一個數據庫的連線

         使用DriverManager的getConnectin(String url , String username ,    
        String password )方法傳入指定的欲連線的資料庫的路徑、資料庫的使用者名稱和   
         密碼來獲得。


     第一個引數叫"連線字串",用於設定連線到哪臺伺服器(localhost),哪個資料庫(demo1),
     以及其他配置資訊(和資料庫的編碼一致).連線字串的格式由不同DBMS的驅動來規定,
     具體檢視驅動的文件
        第2,3個引數為使用者名稱,密碼

    4,執行SQL包下面的預編譯sql語句物件Statement   
        要執行SQL語句,必須獲得java.sql.Statement例項,Statement例項分為以下3  
         種類型:   
          A、執行靜態SQL語句。通常通過Statement例項實現。   
          B、執行動態SQL語句。通常通過PreparedStatement例項實現。   
          C、執行資料庫儲存過程。通常通過CallableStatement例項實現。
    PreparedStatement ps  = 
    conn.prepareStatement("insert into T_Persons(Name,Age,Gender)values('無崖子',22,1)")
            ps.executeUpdate();//執行更新

    5,執行SQL語句   
        Statement介面提供了三種執行SQL語句的方法:executeQuery 、executeUpdate   
        和execute 
         A、ResultSet executeQuery(String sqlString):執行查詢資料庫的SQL語句   
            ,返回一個結果集(ResultSet)物件。   
         B、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或   
            DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等   
         C、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的   
            語句。   
       具體實現的程式碼:   
              ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;   
        int rows = stmt.executeUpdate("INSERT INTO ...") ;   
        boolean flag = stmt.execute(String sql) ; 

    6, 處理結果   
        兩種情況:   
         1、執行更新返回的是本次操作影響到的記錄數。   
         2、執行查詢返回的結果是一個ResultSet物件。   
        • ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些   
          行中資料的訪問。   
        • 使用結果集(ResultSet)物件的訪問方法獲取資料:   
         while(rs.next()){   
             String name = rs.getString("name") ;   
        String pass = rs.getString(1) ; // 此方法比較高效   
         }   
        (列是從左到右編號的,並且從列1開始) 

    7,關閉JDBC物件    
         操作完成以後要把所有使用的JDBC物件全都關閉,以釋放JDBC資源,關閉順序和聲   
         明順序相反:   
         A、關閉記錄集   
         B、關閉宣告   
         C、關閉連線物件  

preparedstatement是加工SQL的介面。
把sql的引數域編譯成確切的sql儲存起來!
--------------------------------------------
 public interface PreparedStatement extends Statement表示預編譯的 SQL 語句的物件。 

SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。 
----------------------------------------------------------  
事務(Transaction)有四大特徵:原子性,一致性,隔離性,永續性。
  原子性值得是”幾個操作要麼都成功,要麼都失敗“!

  JDBC事務
  首先 1,設定Connection的setAutoCommit(false), 禁止自動提交;
        2,操作結束執行conn.commit()提交事務;
        3,如果執行出錯,則conn.rollback() 回滾(當前事務的操作全部取消)

案例:


     1,對資料庫批量提交插入資料,先把資料裝箱,通過addBacth(),每滿多少筆時候提交一次executeBatch();

 2,模擬銀行轉賬,通過連線資料庫 對某賬號進行 +  - 金額
     try
    {
        conn = JdbcUtils.createConnection();
        conn.setAutoCommit(false);//通過事務禁止自動提交
        ps1 = conn.prepareStatement("Update T_Employees Set Salary=Salary-10 where Name='Tom'"
); ps1.executeUpdate(); ps2 = conn.prepareStatement("Update T_Employees Set1 Salary=Salary+10 where Name='Jerry'"); ps2.executeUpdate(); conn.commit();//全部操作一致無誤後,提交 } catch (SQLException e) { conn.rollback();//如果操作中有誤,則回滾,之前的操作都不算 }
 ----------------------------------------------------------
批量提交
    採用批量提交:要配合事務使用,否則沒效果。把executeUpdate() 改成
    addBatch(),在最後再ps.executeBatch(),看看用多長時間
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*
 * 案例1:通過批量提交插入,優化處理
 * */
public class BatchTest2
{

    public static void main(String[] args)
    {
         Connection conn= null;
         PreparedStatement ps = null;
        //計算用時 比較
         long start = System.currentTimeMillis();
         try
         {
             //建立資料庫連線,注意批量提交應確保連線中,要在事務中配合使用
             conn = JDBCUtils.createConnection();
             //批量提交配合事務使用,設定禁止自動提交
             conn.setAutoCommit(false);
             //建立預處理sql語句物件,共用此物件,
             ps = conn.prepareStatement("insert into t_persons2(Name,Age,Gender) values(?,?,?)");

             //設定插入引數值
              for(int i = 0;i<10000;i++)
              {
                  ps.clearParameters();//記住Statement重複使用要把上次設定的
                  查詢引數的值清空,才能繼續設定下一次的值
                  ps.setString(1, "東方白"+i);
                  ps.setInt(2, 25);
                  ps.setBoolean(3, true);
                  //ps.executeUpdate();// ,每次插入都通知mysql,
                  ps.addBatch(); //裝到"箱子裡" ,用批量提交則先把資料
                  加入到箱子裡面來 一次性批量提交箱子
                  //以每滿1000筆提交一次箱子,根據資料量而定
                  if(i%1000==0)
                  {
                      ps.executeBatch();//每1000筆提交一次
                  }

              }
              //把箱子中剩下的,餘下的沒滿1000的再提交一次
               ps.executeBatch();//把"箱子裡"的命令一次提交給mysql 
              conn.commit();//在所有的操作之後,提交事務, 
              long end = System.currentTimeMillis();
              System.out.println("耗時"+(end-start));

         } 
         catch (SQLException e)
        {
            try
            {
                conn.rollback();//如果發生異常則回滾,剛才的操作都不算
            } catch (SQLException e1)
            {
                System.out.println("回滾失敗");
            } 

            e.printStackTrace();

        }
         finally
         {
             JDBCUtils.closeQuietly(conn);
         }

    }

}