




已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
簡(jiǎn)介眾所周知,JDBC(Java數(shù)據(jù)庫(kù)連接)是Java 2企業(yè)版的重要組成部分。它是基于SQL層的API。通過(guò)把SQL語(yǔ)句嵌入JDBC接口的方法中,用戶可以通過(guò)Java程序執(zhí)行幾乎所有的數(shù)據(jù)庫(kù)操作。JDBC只提供了接口,具體的類的實(shí)現(xiàn)要求數(shù)據(jù)庫(kù)的設(shè)計(jì)者完成。通過(guò)生成這些接口的實(shí)例,即使對(duì)于不同的數(shù)據(jù)庫(kù),Java程序也可以正確地執(zhí)行SQL調(diào)用。所以對(duì)于程序員來(lái)說(shuō),不必把注意力放在如何向數(shù)據(jù)庫(kù)發(fā)送SQL指令,因?yàn)槌绦騿T需要了解和用到的只是JDBC的接口,只有在極少數(shù)情況下會(huì)用到面向特定數(shù)據(jù)庫(kù)的類,例如程序員希望使用ORACLE的擴(kuò)展API。在JDBC程序中,首先需要做的是實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接。在示例程序中,我們使用的是ORACLE8i的JDBC包。連接數(shù)據(jù)庫(kù)通常需要實(shí)現(xiàn)以下幾個(gè)步驟:1. 注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(driver)。可以通過(guò)調(diào)用java.sql.DriverManager類的registerDriver方法顯式注冊(cè)驅(qū)動(dòng)程序,也可以通過(guò)加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類隱式注冊(cè)驅(qū)動(dòng)程序。例如我們希望向虛擬機(jī)注冊(cè) / 顯式注冊(cè)DriverManager.registerDriver(new oracle.jdbc.driver./ 隱式注冊(cè)Class.forName(“oracle.jdbc.driver.關(guān)于虛擬機(jī)如何自動(dòng)注冊(cè)通過(guò)類加載器(ClassLoader)加載的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序超過(guò)了本文討論的范圍,在此不做詳細(xì)討論。2 建立連接。調(diào)用java.sql.DriverManager類的getConnection()方法可以建立與數(shù)據(jù)庫(kù)的連接。GetConnection()方法返回一個(gè)Connection對(duì)象。需要注意的是,getConnection()方法會(huì)自動(dòng)從數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序注冊(cè)表中選擇一個(gè)最合適的驅(qū)動(dòng)程序。3 建立連接后,允許自動(dòng)更新(AutoCommit)。調(diào)用java.sql.Connection接口的serAutoCommit()方法可以設(shè)定當(dāng)程序向數(shù)據(jù)庫(kù)發(fā)出一條SQL指令后,數(shù)據(jù)庫(kù)是否立即更新。下面是一個(gè)具體的實(shí)例。在該實(shí)例中,作為getConnection()方法參數(shù)的url使用的是Net8 keyword-value pair格式。當(dāng)然也可以使用普通格式。數(shù)據(jù)庫(kù)安裝在名為Chicago的服務(wù)器上,使用的協(xié)議是TCP協(xié)議,使用的端口是1521,數(shù)據(jù)庫(kù)的SID是chidb,使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序是 import java.sql.*;/ 初始化常數(shù)private static String url =“jdbc:oracle:thin:(description=(address=(host=Chicago)” +“(protocol=tcp)(port=1521)(connect_data=(sid=chidb)”;/ 也可以設(shè)定url為“jdbc:oracle:thin: Chicago:1521:chidb”private static String username = “guest”;private static String password = “guest”;try/ 注冊(cè)數(shù)據(jù)庫(kù)Class.forName(“oracle.jdbc.driver./ 建立連接Connection conn =DriverManager.getConnection(url, username, password);/ 允許自動(dòng)更新Conn.setAutoCommit(true);catch(ClassNotFoundException e )e.printStackTrace();catch(SQLException e)e.printStackTrace();從實(shí)際應(yīng)用的角度出發(fā),我們可以看出采取這種方式連接到數(shù)據(jù)庫(kù)存在幾個(gè)問(wèn)題。第一是安全性問(wèn)題,由于程序代碼中包含用戶名和密碼,其他人如果能得到bytecode,可以通過(guò)反編譯工具獲得用戶名和密碼。第二是代碼的可移植性問(wèn)題。如果希望連接的數(shù)據(jù)庫(kù)名稱或用戶名有所更改,程序員需要修改源程序,然后把修改過(guò)的程序發(fā)送給用戶。也就是說(shuō),軟件無(wú)法脫離數(shù)據(jù)庫(kù)獨(dú)立存在。這樣不僅會(huì)大大提高軟件的成本,也不利于軟件本身的發(fā)展。還可能出現(xiàn)這樣的情況:在某些情況下,提供數(shù)據(jù)的機(jī)構(gòu)不希望數(shù)據(jù)庫(kù)的用戶名和密碼讓編寫(xiě)程序的程序員知道知道。這樣就提出了一個(gè)問(wèn)題,如何使Java和數(shù)據(jù)庫(kù)之間建立連接時(shí)隱藏一些敏感的信息。數(shù)據(jù)源(Data Source)及JNDI數(shù)據(jù)源是在JDBC 2.0中引入的一個(gè)概念。在JDBC 2.0擴(kuò)展包中定義了javax.sql.DataSource接口來(lái)描述這個(gè)概念。如果用戶希望建立一個(gè)數(shù)據(jù)庫(kù)連接,通過(guò)查詢?cè)贘NDI服務(wù)中的數(shù)據(jù)源,可以從數(shù)據(jù)源中獲取相應(yīng)的數(shù)據(jù)庫(kù)連接。這樣用戶就只需要提供一個(gè)邏輯名稱(Logic Name),而不是數(shù)據(jù)庫(kù)登錄的具體細(xì)節(jié)。在這里有必要簡(jiǎn)單介紹一下JNDI。JNDI的全稱是Java Naming and Directory Interface, 可以理解為Java名稱和目錄服務(wù)接口。JNDI向應(yīng)用程序提供了一個(gè)查詢和使用遠(yuǎn)程服務(wù)的機(jī)制。這些服務(wù)可以是任何企業(yè)服務(wù)。對(duì)于JDBC應(yīng)用程序來(lái)說(shuō),JNDI提供的是數(shù)據(jù)庫(kù)連接服務(wù)。當(dāng)然JNDI也可以向數(shù)據(jù)庫(kù)提供其他服務(wù),但是這超出了本文范圍,在此不做論述。其實(shí)JNDI并不難理解。簡(jiǎn)單來(lái)說(shuō),名稱服務(wù)提供了一個(gè)把文件,打印機(jī),服務(wù)器等實(shí)體映射到一個(gè)邏輯名稱的機(jī)制。例如在操作系統(tǒng)中的名稱服務(wù)就把打印機(jī)映射到一個(gè)I/O端口。而目錄服務(wù)可以理解為名稱服務(wù)的一個(gè)擴(kuò)展,它允許在服務(wù)中的各項(xiàng)擁有自己的屬性。又以打印機(jī)為例,打印機(jī)可以是彩色打印機(jī),支持雙面打印,支持網(wǎng)絡(luò)打印,支持高速打印等。所有這些打印機(jī)的屬性都可以儲(chǔ)存在目錄服務(wù)中,和相應(yīng)的打印機(jī)聯(lián)系起來(lái)。一些常見(jiàn)的目錄服務(wù)有NIS,NIS+,LDAP和Novell的NDS等。JNDI使應(yīng)用程序通過(guò)使用邏輯名稱獲取對(duì)象和對(duì)象提供的服務(wù),從而使程序員可以避免使用與提供對(duì)象的機(jī)構(gòu)有關(guān)聯(lián)的代碼。例如在下面的例子中使用了在JNDI中的數(shù)據(jù)源,程序員就不需要提供 下面詳細(xì)介紹一下數(shù)據(jù)源和javax.sql.DataSource接口。在數(shù)據(jù)源中存儲(chǔ)了所有建立數(shù)據(jù)庫(kù)連接的信息。就象通過(guò)指定文件名你可以在文件系統(tǒng)中找到文件一樣,通過(guò)提供正確的數(shù)據(jù)源名稱,你可以找到相應(yīng)的數(shù)據(jù)庫(kù)連接。javax.sql.DataSource接口定義了如何實(shí)現(xiàn)數(shù)據(jù)源。在該接口中定義了九個(gè)屬性。表一列出了對(duì)這些屬性的描述。由于本文是以8i為例,在8i中沒(méi)有實(shí)現(xiàn)roleName屬性,所以在表中沒(méi)有對(duì)此屬性做描述。表一:數(shù)據(jù)源標(biāo)準(zhǔn)屬性屬性名稱屬性數(shù)據(jù)類型描述databaseNameString數(shù)據(jù)庫(kù)名稱,即數(shù)據(jù)庫(kù)的SID。dataSourceNameString數(shù)據(jù)源接口實(shí)現(xiàn)類的名稱。descriptionString對(duì)數(shù)據(jù)源的描述。networkProtocolString和服務(wù)器通訊使用的網(wǎng)絡(luò)協(xié)議名。在8i中,該屬性只在使用OCI驅(qū)動(dòng)程序時(shí)有效,缺省協(xié)議是TCP協(xié)議。passwordString用戶登錄密碼。portNumberInt數(shù)據(jù)庫(kù)服務(wù)器使用的端口,缺省值為1521。serverNameString數(shù)據(jù)庫(kù)服務(wù)器名稱。userString用戶登錄名。在javax.sql.DataSource接口中定義了以下方法:* public synchronized void setDatabaseName(String dbname)* public synchronized String getDatabaseName()* public synchronized void setDataSourceName(String dsname)* public synchronized String getDataSourceName()* public synchronized void setDescription(String desc)* public synchronized String getDescription()* public synchronized void setNetworkProtocol(String np)* public synchronized String getNetworkProtocol()* public synchronized void setPassword(String pwd)* public synchronized void setPortNumber(int pn)* public synchronized int getPortNumber()* public synchronized void setServerName(String sn)* public synchronized String getServerName()* public synchronized void setUser(String user)* public synchronized String getUser() 通過(guò)這些方法,程序員可以獲得建立連接需要的所有信息。需要注意的是,程序員不可以獲取登陸密碼,這就在一定程度上保證了安全性。需要注意的另一點(diǎn)是所有的方法都是synchronized方法,這是為了保證應(yīng)用程序的線程安全(Thread-safe)。如果在調(diào)用該方法時(shí),即使數(shù)據(jù)源實(shí)例發(fā)生變化不會(huì)影響程序的正確運(yùn)行。除了實(shí)現(xiàn)由SUN定義的屬性和方法外,8i還提供了自己的數(shù)據(jù)源屬性和方法。這些方法和屬性是在oracle.jdbc.pool.DataSource中實(shí)現(xiàn)的。 8i擴(kuò)展數(shù)據(jù)源屬性如表二所示:表二:屬性名稱屬性數(shù)據(jù)類型描述driverTypeString使用的 JDBC驅(qū)動(dòng)程序的類型,包括oci8, thin和kprburlString數(shù)據(jù)庫(kù)連接的URL。tnsEntryStringTNS條目名稱在oracle.jdbc.pool.DataSource中除了實(shí)現(xiàn)javax.sql.DataSource接口中定義的方法外,還實(shí)現(xiàn)了以下方法:* public synchronized void setDriverType(String dt)* public synchronized String getDriverType()* public synchronized void setURL(String url)* public synchronized String getURL()* public synchronized void setTNSEntryName(String tns)* public synchronized String getTNSEntryName()同時(shí),DataSource還實(shí)現(xiàn)了java.io.Serializable和javax.naming.Referenceable接口。獨(dú)立使用數(shù)據(jù)源實(shí)際應(yīng)用中,你可以把DataSource注冊(cè)到JNDI,也可以單獨(dú)使用。下面先給出一個(gè)單獨(dú)使用DataSource的例子:/ 初始化數(shù)據(jù)源實(shí)例DataSource ods = new DataSource();ods.setDriverType(thin);ods.setServerName(Chicago);ods.setNetworkProtocol(tcp);ods.setDatabaseName(chidb);ods.setPortNumber(1521);ods.setUser(guest);ods.setPassword(guest);/ 從數(shù)據(jù)源中獲取數(shù)據(jù)庫(kù)連接Connection conn = ods.getConnection();/ 通過(guò)數(shù)據(jù)庫(kù)連接進(jìn)行數(shù)據(jù)操作 使用DataSource時(shí)有幾點(diǎn)需要注意:1. 如果使用的時(shí)服務(wù)器端內(nèi)部驅(qū)動(dòng)程序(server-side internal driver),driverType屬性會(huì)被設(shè)置為kprb,其它所有屬性失效。 2. 如果使用Thin或OCI驅(qū)動(dòng)程序: a. URL中可以包括用戶登錄名和用戶登錄密碼。例如:jdbc:oracle:thin:guest/guestChicago:1521:chidb; b. 如果設(shè)定了url屬性,tnsEntry, driverType, portNumber, networkProtocol, serverName,和databaseName屬性將失效。 c. 在沒(méi)有設(shè)定url屬性的情況下,如果設(shè)定了tnsEntry屬性,portNumber, networkProtocol, serverName,和databaseName屬性將失效。 d. 如果使用OCI驅(qū)動(dòng)程序,并且networkProtocol屬性被設(shè)定為ipc,除user和password外的所有其他屬性將失效。通過(guò)JNDI使用數(shù)據(jù)源在本節(jié)首先給出了一個(gè)實(shí)際程序,然后通過(guò)程序來(lái)講解如何通過(guò)JNDI查詢數(shù)據(jù)源。import java.sql.*;import javax.sql.*;import oracle.jdbc.driver.*;import oracle.jdbc.pool.DataSource;import javax.naming.*;import javax.naming.spi.*;import java.util.Hashtable;public class DataSourceJNDIpublic static void main (String args )throws SQLException/ 初始化名稱服務(wù)環(huán)境Context ctx = null;tryHashtable env = new Hashtable (5);env.put (Context.INITIAL_CONTEXT_FACTORY,com.sun.jndi.fscontext.RefFSContextFactory);env.put (Context.PROVIDER_URL, file:JNDI);ctx = new InitialContext(env);catch (NamingException ne)ne.printStackTrace();bind(ctx, jdbc/chidb);lookup(ctx, jdbc/chidb);static void bind (Context ctx, String ln)throws NamingException, SQLException/ 創(chuàng)建一個(gè)DataSource實(shí)例DataSource ods = new DataSource();ods.setDriverType(thin);ods.setServerName(Chicago);ods.setNetworkProtocol(tcp);ods.setDatabaseName(chidb);ods.setPortNumber(1521);ods.setUser(guest);ods.setPassword(guest);/ 把DataSource實(shí)例注冊(cè)到JNDI中System.out.println (Doing a bind with the logical name : + ln);ctx.bind (ln,ods);System.out.println (Successfully bound);static void lookup (Context ctx, String ln)throws NamingException, SQLException/ 從JNDI中查詢DataSource實(shí)例System.out.println (Doing a lookup with the logical name : + ln);DataSource ods = (DataSource) ctx.lookup (ln);System.out.println (Successful lookup);/ 從查詢到的DataSource實(shí)例中獲取數(shù)據(jù)庫(kù)連接Connection conn = ods.getConnection();/ 進(jìn)行數(shù)據(jù)庫(kù)操作getUserName(conn);/ 關(guān)閉連接conn.close();conn = null;static void getUserName(Connection conn)throws SQLException/ 生成一個(gè)Statement實(shí)例Statement stmt = conn.createStatement ();/ 從addressbook表中選中姓名列ResultSet rset = stmt.executeQuery (select NAME from addressbook);/ 列出addressbook表所有人的姓名while (rset.next ()System.out.println (Name is + rset.getString (1);/ 關(guān)閉RseultSet實(shí)例rset.close();rset = null;/ 關(guān)閉Statement實(shí)例stmt.close();stmt = null;程序首先生成了一個(gè)Context實(shí)例。javax.naming.Context接口定義了名稱服務(wù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 校招:無(wú)人機(jī)操控員面試題及答案
- 幼兒園課程故事:油菜花的奇妙世界
- 手術(shù)室感染預(yù)防與控制
- 指數(shù)函數(shù)電子課件
- 2.4 用估算解決問(wèn)題 課件人教版 三年級(jí)上冊(cè)數(shù)學(xué)
- 幼兒園隨機(jī)教育的重要性
- 2025年壓瘡護(hù)理新進(jìn)展
- 黑龍江綏化公開(kāi)招聘農(nóng)村(村務(wù))工作者筆試題含答案2024年
- 新建年加工20000噸H型鋼材和1000套活動(dòng)板房項(xiàng)目可行性研究報(bào)告寫(xiě)作模板-備案審批
- 租賃稅費(fèi)合同協(xié)議
- 電商倉(cāng)儲(chǔ)外包合同協(xié)議
- GB/T 1229-2006鋼結(jié)構(gòu)用高強(qiáng)度大六角螺母
- 多中心結(jié)直腸癌臨床研究生物樣本庫(kù)信息系統(tǒng)的建設(shè)與管理
- 消防管道支架制作安裝標(biāo)準(zhǔn)2017.噴淋
- 曲柄連桿機(jī)構(gòu)拆裝教學(xué)教材課件
- 合格供應(yīng)商年度評(píng)審計(jì)劃
- 培訓(xùn)考試匯總金屬膠接工藝簡(jiǎn)介
- Q-RJ 557-2017 航天型號(hào)產(chǎn)品禁(限)用工藝目錄(公開(kāi))
- ZGM95G-1型中速輥式磨煤機(jī)使用和維護(hù)說(shuō)明書(shū)
- SZ系列GPS標(biāo)準(zhǔn)時(shí)間同步鐘使用說(shuō)明
- 服裝工藝(各工序)單價(jià)表
評(píng)論
0/150
提交評(píng)論