1. 程式人生 > 實用技巧 >JDBC(二)【獲取資料庫連線】

JDBC(二)【獲取資料庫連線】

2.1 要素一:Driver介面實現類

2.1.1 Driver介面介紹

  • java.sql.Driver 介面是所有 JDBC 驅動程式需要實現的介面。這個介面是提供給資料庫廠商使用的,不同資料庫廠商提供不同的實現。

  • 在程式中不需要直接去訪問實現了 Driver 介面的類,而是由驅動程式管理器類(java.sql.DriverManager)去呼叫這些Driver實現。

    • Oracle的驅動:oracle.jdbc.driver.OracleDriver
    • mySql的驅動: com.mysql.jdbc.Driver

  • 將上述jar包拷貝到Java工程的一個目錄中,習慣上新建一個lib資料夾。

在驅動jar上右鍵-->Build Path-->Add to Build Path

注意:如果是Dynamic Web Project(動態的web專案)話,則是把驅動jar放到WebContent(有的開發工具叫WebRoot)目錄中的WEB-INF目錄中的lib目錄下即可

2.1.2 載入與註冊JDBC驅動

  • 載入驅動:載入 JDBC 驅動需呼叫 Class 類的靜態方法 forName(),向其傳遞要載入的 JDBC 驅動的類名

    • Class.forName(“com.mysql.jdbc.Driver”);
  • 註冊驅動:DriverManager 類是驅動程式管理器類,負責管理驅動程式

    • 使用DriverManager.registerDriver(com.mysql.jdbc.Driver)來註冊驅動

    • 通常不用顯式呼叫 DriverManager 類的 registerDriver() 方法來註冊驅動程式類的例項,因為 Driver 介面的驅動程式類包含了靜態程式碼塊,在這個靜態程式碼塊中,會呼叫 DriverManager.registerDriver() 方法來註冊自身的一個例項。下圖是MySQL的Driver實現類的原始碼:

2.2 要素二:URL

  • JDBC URL 用於標識一個被註冊的驅動程式,驅動程式管理器通過這個 URL 選擇正確的驅動程式,從而建立到資料庫的連線。

  • JDBC URL的標準由三部分組成,各部分間用冒號分隔。

    • jdbc:子協議:子名稱
    • 協議:JDBC URL中的協議總是jdbc
    • 子協議:子協議用於標識一個數據庫驅動程式
    • 子名稱:一種標識資料庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位資料庫提供足夠的資訊。包含主機名(對應服務端的ip地址),埠號,資料庫名
  • 舉例:

  • 幾種常用資料庫的 JDBC URL

    • MySQL的連線URL編寫方式:

      • jdbc:mysql://主機名稱:mysql服務埠號/資料庫名稱?引數=值&引數=值
      • jdbc:mysql://localhost:3306/atguigu
      • jdbc:mysql://localhost:3306/atguigu?useUnicode=true&characterEncoding=utf8(如果JDBC程式與伺服器端的字符集不一致,會導致亂碼,那麼可以通過引數指定伺服器端的字符集)
      • jdbc:mysql://localhost:3306/atguigu?user=root&password=123456
    • Oracle 9i的連線URL編寫方式:

      • jdbc:oracle:thin:@主機名稱:oracle服務埠號:資料庫名稱
      • jdbc:oracle:thin:@localhost:1521:atguigu
    • SQLServer的連線URL編寫方式:

      • jdbc:sqlserver://主機名稱:sqlserver服務埠號:DatabaseName=資料庫名稱

      • jdbc:sqlserver://localhost:1433:DatabaseName=atguigu

2.3 要素三:使用者名稱和密碼

  • user,password可以用“屬性名=屬性值”方式告訴資料庫
  • 可以呼叫 DriverManager 類的 getConnection() 方法建立到資料庫的連線

2.4 資料庫連線方式舉例

2.4.1 連線方式一

	@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", "abc123");

            //4.呼叫driver的connect(),獲取連線
            Connection conn = driver.connect(url, info);
            System.out.println(conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

說明:上述程式碼中顯式出現了第三方資料庫的API

2.4.2 連線方式二

	@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", "abc123");

            //4.呼叫driver的connect(),獲取連線
            Connection conn = driver.connect(url, info);
            System.out.println(conn);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

說明:相較於方式一,這裡使用反射例項化Driver,不在程式碼中體現第三方資料庫的API。體現了面向介面程式設計思想。

2.4.3 連線方式三

	@Test
    public void testConnection3() {
        try {
            //1.資料庫連線的4個基本要素:
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "abc123";
            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();
        }

    }

說明:使用DriverManager實現資料庫的連線。體會獲取連線必要的4個基本要素。

2.4.4 連線方式四

	@Test
    public void testConnection4() {
        try {
            //1.資料庫連線的4個基本要素:
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "abc123";
            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();
        }

    }

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

2.4.5 連線方式五(最終版)

	@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);

    }

其中,配置檔案宣告在工程的src目錄下:【jdbc.properties】

user=root
password=abc123
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver

說明:使用配置檔案的方式儲存配置資訊,在程式碼中載入配置檔案

使用配置檔案的好處:

①實現了程式碼和資料的分離,如果需要修改配置資訊,直接在配置檔案中修改,不需要深入程式碼
②如果修改了配置資訊,省去重新編譯的過程。