學習Java JDBC,看這篇就夠了
JDBC (Java DB Connection)---Java數據庫連接
JDBC是一種可用於運行SQL語句的JAVA API(ApplicationProgramming Interface應用程序設計接口)。它由一些Java語言編寫的類和界面組成。
JDBC為數據庫應用開發者和數據庫前臺工具開發者提供了一種標準的應用程序設計接口,使開發者能夠用純JAVA語言編寫完整的數據庫應用程序。
JDBC代表JAVA數據庫連接。
它是一個軟件層,同意開發人員在JAVA中編寫client/server應用。
一、ODBC到JDBC的發展歷程
ODBC是OpenDatabaseConnectivity的英文簡寫。
它是一種用來在相關或不相關的數據庫管理系統(DBMS)中存取數據的,用C語言實現的,標準應用程序數據接口。通過ODBCAPI。應用程序能夠存取保存在多種不同數據庫管理系統(DBMS)中的數據,而不論每一個DBMS使用了何種數據存儲格式和編程接口。
1.ODBC的結構模型
ODBC的結構包含四個主要部分:應用程序接口、驅動器管理器、數據庫驅動器和數據源。
應用程序接口:屏蔽不同的ODBC數據庫驅動器之間函數調用的區別。為用戶提供統一的SQL編程接口。
驅動器管理器:為應用程序裝載數據庫驅動器。
數據庫驅動器:實現ODBC的函數調用,提供對特定數據源的SQL請求。假設須要,數據庫驅動器將改動應用程序的請求,使得請求符合相關的DBMS所支持的文法。
數據源:由用戶想要存取的數據以及與它相關的操作系統、DBMS和用於訪問DBMS的網絡平臺組成。
盡管ODBC驅動器管理器的主要目的是載入數據庫驅動器,以便ODBC函數調用,可是數據庫驅動器本身也運行ODBC函數調用,並與數據庫相互配合。
因此當應用系統發出調用與數據源進行連接時。數據庫驅動器能管理通信協議。當建立起與數據源的連接時,數據庫驅動器便能處理應用系統向DBMS發出的請求。對分析或發自數據源的設計進行必要的翻譯。並將結果返回給應用系統。
2.JDBC的誕生
自從Java語言於1995年5月正式發布以來,Java風靡全球。出現大量的用java語言編寫的程序。當中也包含數據庫應用程序。因為沒有一個Java語言的API,編程人員不得不在Java程序中添加C語言的ODBC函數調用。這就使非常多Java的優秀特性無法充分發揮,比方平臺無關性、面向對象特性等。隨著越來越多的編程人員對Java語言的日益喜愛。越來越多的公司在Java程序開發上投入的精力日益添加,對java語言接口的訪問數據庫的API的要求越來越強烈。也因為ODBC的有其不足之處。比方它並不easy使用。沒有面向對象的特性等等,SUN公司決定開發一Java語言為接口的數據庫應用程序開發接口。
在JDK1.x版本號中,JDBC僅僅是一個可選部件。到了JDK1.1發布時,SQL類包(也就是JDBCAPI)就成為Java語言的標準部件。
二、JDBC技術概述
JDBC是一種可用於運行SQL語句的JavaAPI(ApplicationProgrammingInterface。應用程序設計接口)。
通過使用JDBC,開發者能夠非常方便地將SQL語句傳送給差點兒不論什麽一種數據庫。
也就是說,開發者能夠不必寫一個程序訪問Sybase,寫還有一個程序訪問Oracle。再寫一個程序訪問Microsoft的SQLServer。
用JDBC寫的程序能夠自己主動地將SQL語句傳送給對應的數據庫管理系統(DBMS)。不但如此,使用Java編寫的應用程序能夠在不論什麽支持Java的平臺上執行,不必在不同的平臺上編寫不同的應用。Java和JDBC的結合能夠讓開發者在開發數據庫應用時真正實現“WriteOnce。RunEverywhere。”
Java具有健壯、安全、易用等特性。並且支持自己主動網上下載,本質上是一種非常好的數據庫應用的編程語言。它所須要的是Java應用怎樣同各種各樣的數據庫連接,JDBC正是實現這樣的連接的關鍵。
JDBC擴展了Java的能力。如使用Java和JDBCAPI就能夠發布一個Web頁,頁中帶有能訪問遠端數據庫的Ap plet。或者企業能夠通過JDBC讓所有的職工(他們能夠使用不同的操作系統。如Windwos。Machintosh和UNIX)在In tranet上連接到幾個全球數據庫上,而這幾個全球數據庫能夠是不同樣的。隨著越來越多的程序開發者使用Java語言。對Java訪問數據庫易操作性的需求越來越強烈。
JDBC API定義了一組用於與數據庫通信的接口和類。
這些接口和類位於java.sql包中。
JDBC是用來(讓我們的程序)通過網絡來操作數據庫的,作用非常重要;JDBC技術也是Java核心技術之中的一個。
凡是須要用網絡操作數據庫的程序,JDBC編程有問題,一切都是白搭。
三、JDBC技術及使用具體解釋
從結構圖中能夠看出。通過JDBC API 讓我們的Java應用程序能夠利用JDBCDriver Manager[JDBC驅動管理],連接到JDBC驅動;體如今我們的project中也就是要導入驅動jar包。
何謂驅動?
不同的數據庫廠商或者同一廠商的不同數據庫版本號都會提供不同的驅動。不論什麽應用程序都是通過這個驅動來操作特定廠商、特定版本號的數據庫的。
使用JDBC的第一步就是要註冊(載入)這個驅動。
JDBC驅動程序的分類
第一類JDBC驅動程序是JDBC-ODBC橋再加上一個ODBC驅動程序。
這類驅動一般不用如今的編程應用中。
第二類JDBC驅動程序是部分JAVAAPI代碼的驅動程序,用於把JDBC調用轉換成主流數據庫API的本機調用。
第三類JDBC驅動程序是面向數據庫中間件的純JAVA驅動程序,JDBC調用被轉換成一種中間件廠商的協議。中間件再把這些調用轉換到數據庫API。
第四類JDBC驅動程序是直接面向數據庫的純JAVA驅動程序。
是使用JDBC驅動程序訪問數據庫的首選方式
通過JDBC操作數據庫——步驟:
第1步:註冊驅動 (僅僅做一次)
第2步:建立連接(Connection)
第3步:創建運行SQL的語句(Statement)
第4步:運行語句
第5步:處理運行結果(ResultSet)
第6步:釋放資源
使用JDBC第一步:載入驅動
註冊驅動有三種方式:
1. Class.forName(“com.mysql.jdbc.Driver”);
推薦這樣的方式,不會對詳細的驅動類產生依賴
2. DriverManager.registerDriver(com.mysql.jdbc.Driver);
會對詳細的驅動類產生依賴
3. System.setProperty(“jdbc.drivers”, “driver1:driver2”);
盡管不會對詳細的驅動類產生依賴;但註冊不太方便。所以非常少使用
使用JDBC第二步:建立連接
通過Connection建立連接,Connection是一個接口類。其功能是與數據庫進行連接(會話)。
建立Connection接口類對象:
Connection conn =DriverManager.getConnection(url, user, password);
當中URL的格式要求為:
JDBC:子協議:子名稱//主機名:port/數據庫名?屬性名=屬性值&…
如:"jdbc:mysql://localhost:3306/test“
user即為登錄數據庫的username,如root
password即為登錄數據庫的密碼,為空就填””
使用JDBC第三步:創建運行對象
運行對象Statement負責運行SQL語句。由Connection對象產生。
Statement接口類還派生出兩個接口類PreparedStatement和CallableStatement,這兩個接口類對象為我們提供了更加強大的數據訪問功能。
創建Statement的語法為:
Statement st = conn.createStatement();
使用JDBC第四步:運行SQL語句
運行對象Statement提供兩個經常使用的方法來運行SQL語句。
executeQuery(Stringsql),該方法用於運行實現查詢功能的sql語句。返回類型為ResultSet(結果集)。
如:ResultSet rs =st.executeQuery(sql);
executeUpdate(Stringsql),該方法用於運行實現增、刪、改功能的sql語句,返回類型為int,即受影響的行數。
如:int flag = st.executeUpdate(sql);
使用JDBC第五步:處理運行結果
ResultSet對象
ResultSet對象負責保存Statement運行後所產生的查詢結果。
結果集ResultSet是通過遊標來操作的。
遊標就是一個可控制的、能夠指向隨意一條記錄的指針。
有了這個指針我們就能輕易地指出我們要對結果集中的哪一條記錄進行改動、刪除,或者要在哪一條記錄之前插入數據。一個結果集對象中僅僅包括一個遊標。
使用JDBC 第六步——釋放資源
Connection對象的close方法用於關閉連接,並釋放和連接相關的資源。
使用JDBC——模板
一些重要的接口----------------------------------------------------------------------------------------------------
PreperedStatement接口
PreperedStatement從Statement擴展而來。
須要多次運行SQL語句,能夠使用PreparedStatement。
PreparedStatement能夠對SQL語句進行預編譯
而且能夠存儲在PreparedStatement對象中。當多次運行SQL語句時能夠提高效率。
作為Statement的子類,PreparedStatement繼承了Statement的全部函數。
創建PreperedStatement
PreparedStatementstr=con.prepareStatement("update user set id=? where username=?”);//此處?為通配符
其它的CRUD方法和Statement基本一致。
CallableStatement接口
CallableStatement類繼承了PreparedStatement類,他主要用於運行SQL存儲過程。
在JDBC中運行SQL存儲過程須要轉義。
JDBC API提供了一個SQL存儲過程的轉義語法:
{call<procedure-name>[<arg1>,<arg2>, ...]}
procedure-name:是所要運行的SQL存儲過程的名字
[<arg1>,<arg2>, ...]:是相相應的SQL存儲過程所須要的參數
ResultSetMeta接口
前面使用ResultSet接口類的對象來獲取了查詢結果集中的數據。
但ResultSet功能有限,假設我們想要得到諸如查詢結果集中有多少列、列名稱各自是什麽就必須使用ResultSetMeta接口了。
ResultSetMeta是ResultSet的元數據。
元數據就是數據的數據, “有關數據的數據”或者“描寫敘述數據的數據”。
ResultSetMeta的使用
獲得元數據對象
ResultSetMetaData rsmd=rst.getMetaData();
返回全部字段的數目
public int getColumCount() throwsSQLException
依據字段的索引值取得字段的名稱
public String getColumName (int colum)throws SQLException
依據字段的索引值取得字段的類型
public String getColumType (int colum)throws SQLException
PreperedStatement接口和Statement的差別
(1) 使用Statement發送和運行sql語句
Statement stmt = con.creatStatement();//載入時,無參數。不編譯sql語句
String sql = "selete * from emp";
ResultSet rs = stmt.executeQuery(sql);//運行時編譯sql語句。返回查詢結果集
(2) 使用PreparStatement發送和運行sql語句
String sql = "selete * from emp";
PreparStatement ps=con.prepareStatement(sql);//載入時就編譯sql語句
ResultSet rs = ps.executeQuery();//此處運行時,不須要傳參
還有就是
Statement stmt;支持能夠通過字符串拼接(來傳遞參數),如StringdeleteStu = "delete from student where id="+id;但easySQL註入
PreparedStatement ps; 不支持字符串拼接,提供?通配符傳遞參數。更安全;如String deleteStu = "delete from student where id=?
";
ps.setInt(1, id); //設置第一個?通配值為id
JDBC事務
何謂事務?
所謂事務是指一組邏輯操作單元,使數據從一種狀態變換到還有一種狀態。
事務的ACID屬性:
1. 原子性(Atomicity):指事務是一個不可切割的工作單位,事務中的操作要麽都發生。要麽都不發生。
2. 一致性(Consistency)事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。
3. 隔離性(Isolation)事務的隔離性是指一個事務的運行不能被其它事務幹擾。
4. 持久性(Durability)持久性是指一個事務一旦被提交。它對數據庫中數據的改變就是永久性的,接下來的其它操作和數據庫故障不應該對其有不論什麽影響。
JDBC中使用COMMIT 和 ROLLBACK語句來實現事務。
COMMIT用於提交事務,ROLLBACK用於數據庫回滾。
通過這兩個語句能夠確保數據完整性。數據改變被提交之前預覽;將邏輯上相關的操作分組。
RollBack語句數據改變被取消使之再一次事務中的改動前的數據狀態能夠被恢復。
為了讓多個 SQL 語句作為一個事務運行,基本步驟為:
先調用 Connection 對象的 setAutoCommit(false); 以取消自己主動提交事務。
然後在全部的 SQL 語句都成功運行後,調用 commit();
假設在出現異常時,能夠調用 rollback();使方法回滾事務。
JTA事務
在實際應用中常常會涉及到多個數據源的不同的連接,而且數據的操作要處於一個事務之中。
如去銀行進行轉賬,轉賬的兩個賬戶是不同的銀行,當然數據的操作就跨數據庫了,或者叫處於不同的數據源之中。
跨越多個數據源的事務,就要使用JTA容器實現事務。
在分布式的情況下的JTA容指的是Web容器,大家很熟悉的Tomcat不能實現JTA的操作。
眼下支持JTA的容器有很著名的BEA公司的 Weblogic,IBM公司的WebSphere等企業級的Web應用server。
JTA分成兩階段提交
第一步。通過JNDI在分布式的環境中查找相關資源。
javax.transaction.UserTransactiontx = (UserTransaction)ctx.lookup(“jndiName");
tx.begin()
第二步,提交
tx.commit();
學習Java JDBC,看這篇就夠了