1. 程式人生 > >JAVA訪問資料庫之連線資料庫

JAVA訪問資料庫之連線資料庫

開發一個訪問資料庫的應用程式,首先要載入資料庫的驅動程式,只需要在第一次訪問資料庫時載入一次,然後每次執行時建立一個Connection例項,緊接著執行操作資料庫的SQL語句,並處理返回的結果集,最後在完成完成此次操作時銷燬前面建立的Connection,釋放與資料庫的連線。

載入資料庫驅動

在連線資料庫之前,首先要把JDBC驅動類載入到java虛擬機器,可以使用java.lang.Class類的靜態方法forName(String className)。成功載入後會將載入的驅動類註冊給DriverManager類,載入失敗將丟擲ClassNotFoundException異常。

建立資料庫連線

DriverManager類跟蹤已註冊的驅動程式,通過呼叫DriverManager類的靜態方法getConnection(String url, String user, String password)可以建立與資料庫的連線。3個引數依次為欲連線的資料庫的路徑、使用者名稱和密碼,方法返回值型別為java.sql.Connection。當呼叫該方法時,會搜尋整個驅動程式列表,直到找到一個能夠連線至資料連線字串中指定的資料庫的驅動程式為止。

執行SQL語句,得到結果集

當資料庫連線建立以後,就可以使用該連線建立Statement例項,並將SQL語句傳遞給它所連線的資料庫,並返回型別為ResultSet的物件(查詢的時候),Statement例項分為3種類型:

  • Statement例項:該型別的例項只能用來執行靜態的SQL
  • PreparedStatement例項:該型別的例項可以執行動態的SQL
  • CallableStatement例項:該型別的例項可以執行資料庫的儲存過程

處理查詢結果

對於返回的結果集,使用ResultSet物件的next()方法將游標指向下一行。最初游標位於第一行之前,因此第一次呼叫next()方法將游標置於第一行上,如果到達結果集的末尾,則ResultSet的next()方法會返回false,方法getXXX提供了獲取當前行中某一列的值的途徑,列名或列號可用於標識要從中獲取資料的列。

連線示例

H2是一個短小精幹的嵌入式資料庫引擎,主要的特性包括:
1. 免費、開源、快速
2. 嵌入式的資料庫伺服器,支援叢集
3. 提供JDBC、ODBC訪問介面,提供基於瀏覽器的控制檯管理程式
4. Java編寫,可使用GCJ和IKVM.NET編譯
5. 短小精幹的軟體,1M左右

如電腦上已經安裝了資料庫,直接使用對應資料庫廠商提供的驅動包即可,操作過程一致。

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

public class JDBCConnectDemo
{
   public static void main(String[] args)
   {
      // 載入資料庫驅動
      try
      {
         Class.forName("org.h2.Driver");
      }
      catch (ClassNotFoundException e)
      {
         System.out.println("載入資料庫驅動失敗...");
         return;
      }
      // 初始化資料庫,方便執行加的這一段程式碼,實際開發中,資料庫應該是初始化好的,如果已存在資料庫,請將該段程式碼註釋掉,無需執行
      try
      {
         initDataBase();
      }
      catch (SQLException e1)
      {
         System.out.println("資料庫表初始化失敗驅動失敗...");
         return;
      }
      Connection conn = null;
      Statement statement = null;
      ResultSet resultSet = null;
      try
      {
         // 獲得資料庫連線
         conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
         statement = conn.createStatement();
         resultSet = statement
               .executeQuery("SELECT USER_ID, USER_NAME FROM USER_INFO");
         System.out.printf("%20s %50s\n", "USER_ID", "USER_NAME");
         // 遍歷結果集
         while (resultSet.next())
         {
            System.out.printf("%20s %50s\n", resultSet.getString("USER_ID"),
                  resultSet.getString("USER_NAME"));
         }
      }
      catch (SQLException e)
      {
         System.out.println("出現異常...");
      }
      finally
      {
         // 釋放資源
         if (resultSet != null)
         {
            try
            {
               resultSet.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (statement != null)
         {
            try
            {
               statement.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (conn != null)
         {
            try
            {
               conn.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
      }
   }

   /**
    * 初始化資料庫
    * 
    * @throws SQLException
    */
   private static void initDataBase() throws SQLException
   {
      Connection conn = null;
      Statement statement = null;
      try
      {
         // 獲得資料庫連線
         conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
         // 建立一張表
         String sql = "CREATE TABLE IF NOT EXISTS USER_INFO (USER_ID VARCHAR(20) PRIMARY KEY, USER_NAME VARCHAR(50))";
         statement = conn.createStatement();
         statement.executeUpdate(sql);
      }
      catch (SQLException e)
      {
         throw e;
      }
      finally
      {
         if (statement != null)
         {
            try
            {
               statement.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (conn != null)
         {
            try
            {
               conn.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
      }
   }
}

常用資料庫驅動類及連線字串

資料庫 驅動類 連線字串
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@[IP]:[PORT]:[SID]
DB2 com.ibm.db2.jdbc.app.DB2Driver jdbc:db2://[IP]:[PORT]/[databaseName]
Sql Server com.microsoft.jdbc.sqlserver.SQLServerDriver jdbc:microsoft:sqlserver://[IP]:[PORT];databaseName=[databaseName]
Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:[IP]:[PORT]/databaseName
MySQL com.mysql.jdbc.Driver jdbc:mysql://[IP]:[PORT]/databaseName

其中[]為需要替換的部分。