Java JDBC学习
JDBC (Java DB Connection)---Java數據庫連接
JDBC是一種可用于執行SQL語句的JAVA API(ApplicationProgramming Interface應用程序設計接口)。它由一些Java語言編寫的類和界面組成。
JDBC為數據庫應用開發人員和數據庫前臺工具開發人員提供了一種標準的應用程序設計接口,使開發人員可以用純JAVA語言編寫完整的數據庫應用程序。
JDBC代表JAVA數據庫連接。它是一個軟件層,允許開發者在JAVA中編寫客戶端/服務器應用。
一、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的有其不足之處,比如它并不容易使用,沒有面向對象的特性等等,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驅動;體現在我們的工程中也就是要導入驅動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:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&…
如:"jdbc:mysql://localhost:3306/test“
user即為登錄數據庫的用戶名,如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;但容易SQL注入
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應用服務器。
JTA分成兩階段提交
??????第一步,通過JNDI在分布式的環境中查找相關資源。
?????????????????? javax.transaction.UserTransactiontx = ?????????????????????????? ????????????(UserTransaction)ctx.lookup(“jndiName");
?????????????????? tx.begin()
??????第二步,提交
?????????????????? tx.commit();
原貼:http://blog.csdn.net/ljheee/article/details/50988796
總結
以上是生活随笔為你收集整理的Java JDBC学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse——恢复的默认窗口设置篇
- 下一篇: Git丢弃修改