JDBC是一種用於執行SQL語句的Java API,能夠爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。java
Java數據庫鏈接體系結構是用於Java應用程序鏈接數據庫的標準方法,JDBC對Java程序員而言是API,對實現與數據庫鏈接的服務提供商而言是接口模型。做爲API,JDBC爲程序開發提供標準的接口,併爲數據庫廠商及第三方中間件廠商實現與數據庫的鏈接提供了標準方法。mysql
一般一個數據庫廠商在推出本身的數據庫產品的時候都會提供一套訪問數據庫的API,這些API能夠用各類語言的形式提供,客戶端應用程序調用這些API來訪問數據庫。每個廠商提供的API都不相同,致使了使用某一個特定的數據庫的程序不能移植到另外一個數據庫上。JDBC以Java類庫來取代數據庫廠商的專有API,客戶端只須要調用JDBC API,由JDBC驅動程序(第三方數據庫廠商實現Java JDBC標準而定義的特定於某一數據庫操做的API)去處理與數據庫的通訊。程序員
應用:spring
使用某種數據庫持久化數據要導入相應的數據庫驅動包。
主要數據庫JDBC驅動的類名:
SQL Server:com.microsoft.jdbc.sqlserver.SQLServerDriver
MySQL:com.mysql.jdbc.Driver
Oracle:oracle.jdbc.driver.OracleDriversql
一、首先咱們通常要加載並註冊數據庫驅動,有如下三種方式能夠作到這一點:
①、Class.forName("JDBC驅動類名") //經過反射機制加載註冊驅動,經常使用
②、System.setProperty("jdbc.driver","JDBC驅動類名");//設置系統屬性指定數據庫驅動
③、DriverManager.registerDriver(new com.mysql.jdbc.Driver());數據庫
總結:推薦①,和②兩種方式。
緣由:③在編譯時須要導入對應的lib。①,②不須要。
第②種方式的話,能夠同時導入多個jdbc驅動,中間用冒號「:」分開
好比System.setProperty("jdbc.drivers","XXXDriver:XXXDriver:XXXDriver");
這樣就一次註冊了三個數據庫驅動服務器
在調用Class.forName(「XXXDriver」)時,完成了將具體的驅動程序向JDBC API中驅動管理器DriverManager
的註冊,該 註冊方法在類構造完成前完成,通常使用靜態語句塊,
經過查看MySQL的驅動實現com.mysql.jdbc.Driver類能夠看到oracle
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
它是任何數據庫提供商的驅動類必須實現的接口,驅動類必須實現該接口中的全部方法!sqlserver
MySQL驅動類Driver源碼:
package com.mysql.jdbc; import java.sql.SQLException; /** * The Java SQL framework allows for multiple database drivers. Each driver * should supply a class that implements the Driver interface * * <p> * The DriverManager will try to load as many drivers as it can find and then * for any given connection request, it will ask each driver in turn to try to * connect to the target URL. * * <p> * It is strongly recommended that each Driver class should be small and * standalone so that the Driver class can be loaded and queried without * bringing in vast quantities of supporting code. * * <p> * When a Driver class is loaded, it should create an instance of itself and * register it with the DriverManager. This means that a user can load and * register a driver by doing Class.forName("foo.bah.Driver") */ public class Driver extends NonRegisteringDriver implements java.sql.Driver { // ~ Static fields/initializers // --------------------------------------------- // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } /** * Construct a new driver and register it with DriverManager */ public Driver() throws SQLException { // Required for Class.forName().newInstance() } }
二、從DriverManager中的到一個DBMS鏈接,DriverManager類是整個JDBC的起點!利用它能夠建立鏈接,
從而完成後續的操做。調用DriverManager類的getConnection(String url, String user, String pwd)創建到
數據庫的鏈接,返回一個鏈接對象。
常見的url:
SQL Server :jdbc:microsoft:sqlserver://localhost:1443;databasename=數據庫名
Oracle :jdbc:oracle:thin:@localhost:1521:ORCL(數據庫實例名)
MySQL :jdbc:mysql://localhost:3306:/databasename
Jdbc-odbc橋 :jdbc:odbc:test(test爲odbc數據源名稱)
public class DBUtil { private static String url = "jdbc:mysql://localhost:3306/spring"; private static String user = "root"; private static String pwd = "mysql5"; private static Connection conn = null; static { try { //使用Class.forName()加載並註冊JDBC驅動程序 Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() { try { //加載 Driver 類並在 DriverManager 類中註冊後,它們便可用來與數據庫創建鏈接。 //當調用 DriverManager.getConnection 方法發出鏈接請求時, //DriverManager 將檢查每一個驅動程序,查看它是否能夠創建鏈接。 conn = DriverManager.getConnection(url, user, pwd); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static void closeConn() { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
三、訪問數據庫進行CRUD操做,對數據庫操做的接口類通常都位於java.sql包和javax.sql包下。
數據庫鏈接被用於向數據庫服務器發送命令和SQL語句。
經常使用的數據庫操做接口類:
DriverManager:
public class DriverManager extends Object管理一組 JDBC 驅動程序的基本服務。
在調用getConnection
方法時,DriverManager
會試着從初始化時加載的那些驅動程序以及使用與當前 applet 或應用程序相同的類加載器顯式加載的那些驅動程序中查找合適的驅動程序。
Connection:
public interface Connection extends Wrapper與特定數據庫的鏈接(會話)。在鏈接上下文中執行 SQL 語句並返回結果。
注:在配置Connection
時,JDBC 應用程序應該使用適當的Connection
方法,好比setAutoCommit
或setTransactionIsolation
。在有可用的 JDBC 方法時,應用程序不能直接調用 SQL 命令更改鏈接的配置。默認狀況下,Connection
對象處於自動提交模式下,這意味着它在執行每一個語句後都會自動提交更改。若是禁用了自動提交模式,那麼要提交更改就必須顯式調用commit
方法;不然沒法保存數據庫更改。
Statement:
public interface Statement extends Wrapper用於執行靜態 SQL 語句並返回它所生成結果的對象。
Statement
對象用來將 SQL 語句發送到數據庫。不帶參數的 SQL 語句一般使用Statement
對象執行。若是屢次執行相同的 SQL 語句,使用PreparedStatement
對象可能更有效。PreparedStatement:
public interface PreparedStatement extends Statement表示預編譯的 SQL 語句的對象。
SQL 語句被預編譯並存儲在PreparedStatement
對象中。而後可使用此對象屢次高效地執行該語句。所以屢次執行的 SQL 語句常常建立爲 PreparedStatement 對象,以提升效率。
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
resultset rs = pstmt.executequery();ResultSet:
public interface ResultSet extends Wrapper表示數據庫結果集的數據表,一般經過執行查詢數據庫的語句生成。
ResultSet
對象具備指向其當前數據行的光標。最初,光標被置於第一行以前。next
方法將光標移動到下一行;由於該方法在ResultSet
對象沒有下一行時返回false
,因此能夠在while
循環中使用它來迭代結果集。