JDBC初出茅廬


JDBC初出茅廬


介紹

  • JDBC(Java Database Connectivity)是一組公共接口, 是一個獨立於特定數據庫管理系統,通用的SQL數據庫操作的一組API, 定義了用來訪問數據庫的標準Java類庫, (java.sql,javax.sql)使用這些類庫可以以一種標準的方法,方便地操作數據庫資源
  • JDBC的目標是使Java程序員使用JDBC可以連接任何提供了JDBC驅動程序的數據庫系統,這樣就使得程序員無需對特定的數據庫系統的特點有過多的瞭解,從而大大簡化和加快了開發過程
  • JDBC接口包含兩套API面向應用的API: Java API, 抽象接口, 供應用程序開發人員使用(連接數據庫, 執行SQL語句, 獲得結果)面向數據庫的API: Java Driver API, 供開發商開發數據庫驅動程序用

JDBC是SUN公司提供一套用於數據庫操作的接口, Java程序員只需要面向這套接口編程即可

不同的數據庫廠商, 需要針對這套接口, 提供不同實現

不同的實現的集合, 即為不同數據庫的驅動, 面向接口編程

Driver接口實現類

  • java.sql.Driver 接口是所有 JDBC 驅動程序需要實現的接口, 這個接口是提供給數據庫廠商使用的, 不同數據庫廠商提供不同的實現
  • 在程序中不需要直接去訪問實現了 Driver 接口的類, 而是由驅動程序管理器類 (java.sql.DriverManager) 去調用這些Driver實現Oracle的驅動:oracle.jdbc.driver.OracleDrivermySql的驅動: com.mysql.jdbc.Driver
  • 加載驅動:加載 JDBC 驅動需調用 Class 類的靜態方法 forName(),向其傳遞要加載的 JDBC 驅動的類名Class.forName(“com.mysql.jdbc.Driver”)
  • 註冊驅動:DriverManager 類是驅動程序管理器類,負責管理驅動程序使用DriverManager.registerDriver(com.mysql.jdbc.Driver)來註冊驅動通常不用顯式調用 DriverManager 類的 registerDriver() 方法來註冊驅動程序類的實例,因為 Driver 接口的驅動程序類都包含了靜態代碼塊,在這個靜態代碼塊中,會調用 DriverManager.registerDriver() 方法來註冊自身的一個實例.

URL

  • JDBC URL 用於標識一個被註冊的驅動程序,驅動程序管理器通過這個 URL 選擇正確的驅動程序,從而建立到數據庫的連接。
  • JDBC URL的標準由三部分組成,各部分間用冒號分隔。 jdbc:子協議:子名稱協議:JDBC URL中的協議總是JDBC子協議:子協議用於標識一個數據庫驅動程序子名稱:一種標識數據庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位數據庫提供足夠的信息。包含主機名(對應服務端的ip地址),端口號,數據庫名

幾種常用數據庫的 JDBC URL

  • MySQL的連接URL編寫方式:jdbc:mysql://localhost:3306/test?user=root&password=123&useUnicode=true&characterEncoding=utf8(如果JDBC程序與服務器端的字符集不一致,會導致亂碼,那麼可以通過參數指定服務器端的字符集)
  • Oracle 9i的連接URL編寫方式:jdbc:oracle:thin:@主機名稱:oracle服務端口號:數據庫名稱jdbc:oracle:thin:@localhost:1521:test
  • SQLServer的連接URL編寫方式:jdbc:sqlserver://主機名稱:sqlserver服務端口號:DatabaseName=數據庫名稱jdbc:sqlserver://localhost:1433:DatabaseName=test


代碼

連接方式一

<code>  @Test
   public void testConnection1() {
       try {
           //1.提供java.sql.Driver接口實現類的對象
           Driver driver = null;
           driver = new com.mysql.jdbc.Driver();

           //2.提供url,指明具體操作的數據
           String url = "jdbc:mysql://localhost:3306/test";

           //3.提供Properties的對象,指明用戶名和密碼
           Properties info = new Properties();
           info.setProperty("user", "root");
           info.setProperty("password", "123");

           //4.調用driver的connect(),獲取連接

           Connection conn = driver.connect(url, info);
           System.out.println(conn);
      } catch (SQLException e) {
           e.printStackTrace();
      }
  }/<code>

說明:上述代碼中顯式出現了第三方數據庫的API

連接方式二

<code>  @Test
   public void testConnection2() {
       try {
           //1.實例化Driver
           String className = "com.mysql.jdbc.Driver";
           Class clazz = Class.forName(className);
           Driver driver = (Driver) clazz.newInstance();

           //2.提供url,指明具體操作的數據
           String url = "jdbc:mysql://localhost:3306/test";

           //3.提供Properties的對象,指明用戶名和密碼
           Properties info = new Properties();
           info.setProperty("user", "root");
           info.setProperty("password", "123");

           //4.調用driver的connect(),獲取連接
           Connection conn = driver.connect(url, info);
           System.out.println(conn);

      } catch (Exception e) {
           e.printStackTrace();
      }
  }/<code>

說明:相較於方式一,這裡使用反射實例化Driver,不在代碼中體現第三方數據庫的API。體現了面向接口編程思想。

連接方式三

<code>  @Test
   public void testConnection3() {
       try {
           //1.數據庫連接的4個基本要素:
           String url = "jdbc:mysql://localhost:3306/test";
           String user = "root";
           String password = "123";
           String driverName = "com.mysql.jdbc.Driver";

           //2.實例化Driver
           Class clazz = Class.forName(driverName);
           Driver driver = (Driver) clazz.newInstance();
           //3.註冊驅動
           DriverManager.registerDriver(driver);
           //4.獲取連接
           Connection conn = DriverManager.getConnection(url, user, password);
           System.out.println(conn);
      } catch (Exception e) {
           e.printStackTrace();
      }

  }/<code>

說明:使用DriverManager實現數據庫的連接。體會獲取連接必要的4個基本要素。

連接方式四

<code>  @Test
   public void testConnection4() {
       try {
           //1.數據庫連接的4個基本要素:
           String url = "jdbc:mysql://localhost:3306/test";
           String user = "root";
           String password = "123";
           String driverName = "com.mysql.jdbc.Driver";

           //2.加載驅動 (①實例化Driver ②註冊驅動)
           Class.forName(driverName);


           //Driver driver = (Driver) clazz.newInstance();

           //3.註冊驅動
           //DriverManager.registerDriver(driver);
           /*
           可以註釋掉上述代碼的原因,是因為在mysql的Driver類中聲明有:
           static {
               try {
                   DriverManager.registerDriver(new Driver());
               } catch (SQLException var1) {
                   throw new RuntimeException("Can't register driver!");
               }
           }

            */


           //3.獲取連接
           Connection conn = DriverManager.getConnection(url, user, password);
           System.out.println(conn);
      } catch (Exception e) {
           e.printStackTrace();
      }

  }/<code>

說明:不必顯式的註冊驅動了。因為在DriverManager的源碼中已經存在靜態代碼塊,實現了驅動的註冊。

連接方式五(推薦)

<code>  @Test
   public  void testConnection5() throws Exception {
  //1.加載配置文件
       InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
       Properties pros = new Properties();
       pros.load(is);
       
       //2.讀取配置信息
       String user = pros.getProperty("user");
       String password = pros.getProperty("password");
       String url = pros.getProperty("url");
       String driverClass = pros.getProperty("driverClass");

       //3.加載驅動
       Class.forName(driverClass);

       //4.獲取連接
       Connection conn = DriverManager.getConnection(url,user,password);
       System.out.println(conn);

  }/<code>

其中,配置文件聲明在工程的src目錄下:【jdbc.properties】

<code>user=root
password=123
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver/<code>

企業級的使用方式五

總結

基本思想

面向接口編程的思想

ORM思想(object relational mapping)

一個數據表對應一個java類

表中的一條記錄對應java類的一個對象

表中的一個字段對應java類的一個屬性

sql是需要結合列名和表的屬性名來寫。注意起別名。

基本技術

JDBC結果集的元數據:ResultSetMetaData

獲取列數:getColumnCount()

獲取列的別名:getColumnLabel()

通過反射,創建指定類的對象,獲取指定的屬性並賦值


分享到:


相關文章: