JAVA程序設(shè)計(jì)技能教程第11章.ppt_第1頁(yè)
JAVA程序設(shè)計(jì)技能教程第11章.ppt_第2頁(yè)
JAVA程序設(shè)計(jì)技能教程第11章.ppt_第3頁(yè)
JAVA程序設(shè)計(jì)技能教程第11章.ppt_第4頁(yè)
JAVA程序設(shè)計(jì)技能教程第11章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java程序設(shè)計(jì)技能教程,主編 彭德林 李德有 中國(guó)水利水電出版社 ,第11章 數(shù)據(jù)庫(kù)編程,任務(wù)一 :使用JDBC連接數(shù)據(jù)庫(kù),任務(wù)三 :數(shù)據(jù)庫(kù)編程,任務(wù)二 :建立數(shù)據(jù)源,任務(wù)四 :實(shí)訓(xùn)十一 數(shù)據(jù)庫(kù)編程實(shí)訓(xùn),11.1 任務(wù)一 使用JDBC連接數(shù)據(jù)庫(kù),11.1.1 JDBC簡(jiǎn)介 1JDBC概述 JDBC(Java Database Connectivity,即Java數(shù)據(jù)庫(kù)連接),是一種在Java應(yīng)用程序中訪問(wèn)數(shù)據(jù)庫(kù)的綜合技術(shù),可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成,主要提供三方面的功能:建立同數(shù)據(jù)庫(kù)的連接,然后向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句,處理從數(shù)據(jù)庫(kù)中返回的SQL執(zhí)行結(jié)果。,圖 4-1 簡(jiǎn)單的條件語(yǔ)句,JDBC在Web和Internet應(yīng)用程序中的作用和ODBC在 Windows系列平臺(tái)應(yīng)用程序中的作用類(lèi)似,但ODBC只針對(duì)Windows平臺(tái),而且ODBC需要在客戶(hù)機(jī)上安裝和注冊(cè),因而維護(hù)成本相對(duì)較大。而JDBC是由Java語(yǔ)言編寫(xiě)的,使得JDBC代碼可在所有Java平臺(tái)上運(yùn)行,這樣使得程序的可移植性和安全性顯著提高了。 應(yīng)用程序通過(guò)相應(yīng)接口(API)訪問(wèn)數(shù)據(jù)庫(kù),JDBC是Java應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的通用接口,稱(chēng)為JDBC API。,使用JDBC來(lái)完成對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)包括以下四個(gè)主要組件: Java的應(yīng)用程序、JDBC驅(qū)動(dòng)器管理器、驅(qū)動(dòng)器和數(shù)據(jù)源。 圖 11-1 JDBC框架圖,2JDBC的結(jié)構(gòu) (1)、面向應(yīng)用程序設(shè)計(jì)的JDBC API:它主要是由一系列的接口組成,通過(guò)調(diào)用此API從而實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)、執(zhí)行SQL語(yǔ)句并返回結(jié)果集等編程數(shù)據(jù)庫(kù)的能力,如: java.sql.DriveManager:該接口主要定義了用來(lái)處理裝載驅(qū)動(dòng)程序并且為創(chuàng)建新的數(shù)據(jù)庫(kù)連接提供支持。 java.sql.Connection:該接口主要定義了實(shí)現(xiàn)對(duì)某一種指定數(shù)據(jù)庫(kù)連接的功能。 java.sql.Statement:該接口主要定義了在一個(gè)給定的連接中作為SQL語(yǔ)句執(zhí)行聲明的容器以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。它主要包含有如下的兩種子類(lèi)型。 java.sql.PreparedStatement:該接口主要定義了用于執(zhí)行帶或不帶 IN 參數(shù)的預(yù)編譯 SQL 語(yǔ)句。,java.sql.CallableStatement:該接口主要定義了用于執(zhí)行數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程的雕用。 java.sql.ResultSet:該接口主要定義了用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)的操作所返回的結(jié)果集。 (2)、面向數(shù)據(jù)庫(kù)廠商的JDBC Drive API : 數(shù)據(jù)庫(kù)廠商必須提供相應(yīng)的驅(qū)動(dòng)程序并實(shí)現(xiàn)JDBC API所要求的基本接口(每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)廠商必須提供對(duì)DriveManager、Connection、Statement、ResultSet等接口的具體實(shí)現(xiàn)),從而最終保證Java程序員通過(guò)JDBC實(shí)現(xiàn)對(duì)不同的數(shù)據(jù)庫(kù)操作。,11.1.2 JDBC驅(qū)動(dòng) 目前比較常見(jiàn)的JDBC驅(qū)動(dòng)程序可分為以下四個(gè)種類(lèi)型: 1JDBC-ODBC橋接 通過(guò)JDBC-ODBC橋接可以很容易地使用JDBC訪問(wèn)ODBC數(shù)據(jù)源。JDBC-ODBC 橋接方式是利用微軟的開(kāi)放數(shù)據(jù)庫(kù)互連接口(ODBC API)同數(shù)據(jù)庫(kù)服務(wù)器通訊的,它要求客戶(hù)端上都要安裝ODBC驅(qū)動(dòng),同時(shí)還要求配置ODBC數(shù)據(jù)源。這種連接方式雖然簡(jiǎn)單但效率低。這種類(lèi)型的驅(qū)動(dòng)程序最適合于企業(yè)網(wǎng)絡(luò),或者是用Java編寫(xiě)的三層結(jié)構(gòu)的應(yīng)用程序服務(wù)器代碼。 2部分Java的本地API驅(qū)動(dòng)程序 這種類(lèi)型的驅(qū)動(dòng)程序把客戶(hù)機(jī)API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、Informix、DB2或其它DBMS的調(diào)用。注意,象橋驅(qū)動(dòng)程序一樣,這種類(lèi)型的驅(qū)動(dòng)程序要求將某些二進(jìn)制代碼加載到每臺(tái)客戶(hù)機(jī)上。它比第一種驅(qū)動(dòng)要快。,3JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序 這種驅(qū)動(dòng)程序?qū)DBC轉(zhuǎn)換為與DBMS無(wú)關(guān)的網(wǎng)絡(luò)協(xié)議,之后這種協(xié)議又被某個(gè)服務(wù)器轉(zhuǎn)換為一種DBMS協(xié)議。這種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺募僇ava客戶(hù)機(jī)連接到多種不同的數(shù)據(jù)庫(kù)上。所用的具體協(xié)議取決于提供者。通常,這是最為靈活的JDBC驅(qū)動(dòng)程序。此種驅(qū)動(dòng)很適合Internet應(yīng) 4本地協(xié)議純Java驅(qū)動(dòng)程序,11.2 任務(wù)二 建立數(shù)據(jù)源 11.2.1 建立Access數(shù)據(jù)庫(kù) 1ACCESS數(shù)據(jù)庫(kù)的設(shè)計(jì) 在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)要確定設(shè)計(jì)數(shù)據(jù)庫(kù)的目的、庫(kù)中需要的表及表中需要的字段。每張表只包含關(guān)于一個(gè)主題的信息,在設(shè)計(jì)表時(shí),應(yīng)注意: 明確有唯一值的字段 確定表間的關(guān)系 優(yōu)化設(shè)計(jì) 添加數(shù)據(jù)和新建其他數(shù)據(jù)庫(kù)對(duì)象 根據(jù)用戶(hù)需求,表的結(jié)構(gòu)設(shè)計(jì)完成后,就可以繼續(xù)創(chuàng)建所需的任何查詢(xún)、窗體、報(bào)表、宏和模塊等。,2表的創(chuàng)建及操作 Access提供了四種創(chuàng)建空表的方法: (1)、使用數(shù)據(jù)庫(kù)向?qū)?,可以在一個(gè)操作中創(chuàng)建整個(gè)數(shù)據(jù)庫(kù)所需的全部表、窗體及報(bào)表。數(shù)據(jù)庫(kù)向?qū)в糜谛陆〝?shù)據(jù)庫(kù),但不能用來(lái)將新表、窗體或報(bào)表添加到已有的數(shù)據(jù)庫(kù)中。 (2)、使用表向?qū)?lái)選擇表的字段,這些字段可以從各種各樣預(yù)先定義好的表中選擇。 (3)、將數(shù)據(jù)直接輸入到空白的數(shù)據(jù)表中。當(dāng)保存新的數(shù)據(jù)表時(shí),Access將分析數(shù)據(jù)并且自動(dòng)為每一字段指定適當(dāng)?shù)臄?shù)據(jù)類(lèi)型及格式。 (4)、使用“設(shè)計(jì)”視圖從無(wú)到有指定表的全部細(xì)節(jié)。 創(chuàng)建了數(shù)據(jù)表后,可以針對(duì)表進(jìn)行添加記錄 、定位記錄 、編輯數(shù)據(jù) 、插入記錄、選擇記錄、刪除記錄和記錄的復(fù)制等操作了。,11.2.2 建立數(shù)據(jù)源 1在window xp系統(tǒng)中,單擊【開(kāi)始】-【設(shè)置】-【控制面板】-【管理工具】 。 2在彈出的窗口中雙擊打開(kāi)【數(shù)據(jù)源ODBC】應(yīng)用程序圖標(biāo),再在打開(kāi)的【ODBC數(shù)據(jù)源管理器】窗口中選擇【系統(tǒng)DSN】標(biāo)簽。 3單擊【添加】按鈕,在彈出的對(duì)話框中選擇【Microsoft Access Driver (*.mdb) 】標(biāo)簽。 4點(diǎn)擊【完成】后,在彈出的Access數(shù)據(jù)源設(shè)置對(duì)話框中,輸入【數(shù)據(jù)源名】為”mylibDB”,然后單擊【選擇】按鈕,找到剛才建立的數(shù)據(jù)庫(kù)(即E盤(pán)jpp文件夾下的library.mdb文件),選中它并確定即可。(如果想設(shè)置訪問(wèn)密碼,可以單擊【高級(jí)】按鈕,會(huì)彈出“高級(jí)設(shè)置選項(xiàng)”對(duì)話框)。 5單擊確定后,ODBC數(shù)據(jù)源的設(shè)置就完成了。,11.3 任務(wù)三 數(shù)據(jù)庫(kù)編程,11.3.1 數(shù)據(jù)庫(kù)編程過(guò)程 1JDBC數(shù)據(jù)庫(kù)編程用到的相關(guān)類(lèi)和接口 (1)、DriverManager類(lèi): 負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序。使用JDBC驅(qū)動(dòng)程序之前,必須先將驅(qū)動(dòng)程序加載并向DriverManager注冊(cè)后才可以使用,同時(shí)提供方法來(lái)建立與數(shù)據(jù)庫(kù)的連接。 方法如下: Class.forName(String driver):加載注冊(cè)驅(qū)動(dòng)程序 。 Static Connection getConnection(String url,String user,String password) throws SQLException:取得對(duì)數(shù)據(jù)庫(kù)的連接 。 Static Driver getDriver(String url) throws SQLExcetion:在已經(jīng)向DriverManager注冊(cè)的驅(qū)動(dòng)程序中尋找一個(gè)能夠打開(kāi)url所指定的數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序。,(2)、Connection類(lèi) Connection對(duì)象是通過(guò)DriverManager.getConnection()方法獲得的,主要負(fù)責(zé)維護(hù)JSP/JAVA數(shù)據(jù)庫(kù)程序和數(shù)據(jù)庫(kù)之間的聯(lián)機(jī),建立Java程序與數(shù)據(jù)庫(kù)之間的連接,并生成三個(gè)非常有用的類(lèi)對(duì)象:Statement類(lèi)對(duì)象、DatabaseMetaData類(lèi)對(duì)象和PreparedStatement類(lèi)對(duì)象。 建立Statement類(lèi)對(duì)象的方法如下: Statement createStatement() throws SQLException; Statement createStatement(int resultSetType,int resultSetConcurrency) throws SQLException; 建立DatabaseMetaData類(lèi)對(duì)象的方法如下 : DatabaseMetaData getMetaData() throws SQLException; 建立PreparedStatement類(lèi)對(duì)象的方法如下: PreparedStatement prepareStatement(String sql) throws SQLException;,(3)、Statement類(lèi) Statement類(lèi)用于將SQL語(yǔ)句發(fā)送到已連接的數(shù)據(jù)庫(kù)中,通過(guò)Statement類(lèi)所提供的方法(見(jiàn)表11-4),可以利用標(biāo)準(zhǔn)的SQL命令,對(duì)數(shù)據(jù)庫(kù)直接新增、刪除或修改等操作。 (4)、PreparedStatement類(lèi) PreparedStatement類(lèi)和Statement類(lèi)的不同之處在于PreparedStatement類(lèi)對(duì)象會(huì)將傳入的SQL命令事先編好等待使用,當(dāng)有單一的SQL指令比多次執(zhí)行時(shí),用PreparedStatement類(lèi)會(huì)比Statement類(lèi)有效率。,(5)、DatabaseMetaData類(lèi) DatabaseMetaData類(lèi)保存了數(shù)據(jù)庫(kù)的所有特性,并且提供許多方法(見(jiàn)表11-6)來(lái)取得這些信息。 (6)、ResultSet類(lèi) ResultSet類(lèi)是Statement類(lèi)招待SQL語(yǔ)句后生成的記錄集。可以認(rèn)為它是一個(gè)二維的表格,主要負(fù)責(zé)存儲(chǔ)查詢(xún)數(shù)據(jù)庫(kù)的結(jié)果。并提供一系列的方法(見(jiàn)表11-7)對(duì)數(shù)據(jù)庫(kù)進(jìn)行新增、刪除和修改操作。也負(fù)責(zé)維護(hù)一個(gè)記錄指針(Cursor),記錄指針指向數(shù)據(jù)表中的某個(gè)記錄,通過(guò)適當(dāng)?shù)囊苿?dòng)記錄指針,可以隨心所欲的存取數(shù)據(jù)庫(kù),加強(qiáng)程序的效率。 (7)、ResultSetMetaData類(lèi) ResultSetMetaData類(lèi)對(duì)象保存了所有ResultSet類(lèi)對(duì)象中關(guān)于字段的信息,提供許多方法(見(jiàn)表11-8)來(lái)取得這些信息:,2. 數(shù)據(jù)庫(kù)訪問(wèn)過(guò)程 (1)、 首先裝載驅(qū)動(dòng)程序 裝載驅(qū)動(dòng)程序DriverManager類(lèi)使用Class類(lèi)的forName方法。語(yǔ)法如下: Class.forName(“)或Class.forName(“).newInstance() 根據(jù)需要裝載的驅(qū)動(dòng)的不同,具體方法也不同。這里是加載ODBCJDBC橋接的例子: String jdbcDriver=“sun.jdbc.odbc.JdbcOdbcDriver“ try Class.forName(jdbcDriver); catch(java.lang.ClassNotFoundException e) System.out.println(“類(lèi)未找到錯(cuò)誤!“+e); 注意: 裝載驅(qū)動(dòng)程序要處理異常。,(2)、 建立連接 指定裝載的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序后,可用DriverManager類(lèi)來(lái)進(jìn)行數(shù)據(jù)源或數(shù)據(jù)庫(kù)的連接。DriverManager類(lèi)是JDBC基礎(chǔ),用來(lái)管理JDBC驅(qū)動(dòng)程序。該類(lèi)有靜態(tài)的getConnection()方法,用于驗(yàn)證JDBC數(shù)據(jù)源,并返回接口Connection對(duì)象。 使用JDBCODBC橋接器的例子: Connection con = DriverManager.getConnection (“jdbc:odbc:mylibDB“); 其中的“mylibDB“為建立的數(shù)據(jù)源的名稱(chēng)。,根據(jù)需要裝載的驅(qū)動(dòng)的不同,具體的連接方法也不同。 A、這里是加載mySQL JDBC驅(qū)動(dòng)程序 Class.forName(“org.gjt.mm.mysql.Driver “).newInstance(); String url=“jdbc:mysql:/localhost/myDB? user=mymouse&password=mouse2008&useUnicode=true&characterEncoding=8859_1“ Connection con=DriverManager.getConnection(url),B、裝載Oracle JDBC OCI驅(qū)動(dòng)程序(用thin模式) Class.forName(“oracle.jdbc.driver.OracleDriver “); String url=“jdbc:oracle:thin:localhost:1521:orcl“; String user=“bigmouse“; String password=“mouse“; Connection con=DriverManager.getConnection(url,user,password); 注意:也可以通過(guò)con.setCatalog(“MyDatabase“)來(lái)加載數(shù)據(jù)庫(kù)。,C、裝載DB2驅(qū)動(dòng)程序 Class.forName(“COM.ibm.db2.jdbc.app.DB2Driver “) String url=“jdbc:db2:/localhost:5000/mydata“; / mydata為你的數(shù)據(jù)庫(kù)名 String user=“admin“; String password=“; Connection con= DriverManager.getConnection(url,user,password);,D、裝載MicroSoft SQLServer驅(qū)動(dòng)程序 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver“); String url=“jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=bookstore“; / bookstore為你的數(shù)據(jù)庫(kù) String user=“book“; String password=“; Connection con= DriverManager.getConnection(url,user,password);,(3)、 獲取數(shù)據(jù)庫(kù)信息和創(chuàng)建接口Statement對(duì)象 數(shù)據(jù)庫(kù)連接成功后,可以使用Connection對(duì)象的getMetaData方法取得接口DatabaseMetaData(提供大量的方法)對(duì)象來(lái)了解數(shù)據(jù)源或數(shù)據(jù)庫(kù)的各種信息。 數(shù)據(jù)庫(kù)連接成功后,還可以使用向數(shù)據(jù)庫(kù)發(fā)送訪問(wèn)數(shù)據(jù)庫(kù)的SQL語(yǔ)句的方法來(lái)存取數(shù)據(jù)庫(kù)。JDBC使用接口Statement的對(duì)象(或執(zhí)行數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的子接口CallableStatement、發(fā)送帶參數(shù)的SQL語(yǔ)句的子接口PreparedStatement)來(lái)發(fā)送SQL語(yǔ)句,Statement對(duì)象可用Connection的方法createStatement()來(lái)返回。例如: Statement st = con.createStatement();,(4)、 執(zhí)行SQL語(yǔ)句以存取數(shù)據(jù)庫(kù) 希望執(zhí)行的SQL語(yǔ)句串作為Statement的方法execute()等的參數(shù)向數(shù)據(jù)庫(kù)傳送,以交給數(shù)據(jù)庫(kù)引擎,執(zhí)行SQL對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)操作。對(duì)數(shù)據(jù)庫(kù)訪問(wèn)結(jié)果是一個(gè)數(shù)據(jù)表的情況,可將這個(gè)表(結(jié)果集)存入接口ResultSet的對(duì)象。 提交SQL語(yǔ)句的Statement的方法有execute、executeQuery和executeUpdate等,分別用于不同類(lèi)型的SQL語(yǔ)句的提交。 executeQuery:用于產(chǎn)生單個(gè)結(jié)果集的語(yǔ)句,如查詢(xún)語(yǔ)句select。 executeUpdate:用于執(zhí)行不產(chǎn)生結(jié)果集的語(yǔ)句,如insert,delete,update等。 execute:可用于執(zhí)行產(chǎn)生多個(gè)結(jié)果集或?qū)?shù)據(jù)庫(kù)進(jìn)行多個(gè)操作的SQL語(yǔ)句。,(5)、 對(duì)執(zhí)行SQL語(yǔ)句的結(jié)果進(jìn)行處理 Statement對(duì)象將SQL語(yǔ)句封裝起來(lái)交給數(shù)據(jù)庫(kù)引擎,執(zhí)行select查詢(xún)語(yǔ)句,將得到結(jié)果集ResultSet對(duì)象(注意:執(zhí)行insert、delete、update等查詢(xún)語(yǔ)句無(wú)結(jié)果集)。 接口ResultSet對(duì)象封裝了執(zhí)行SQL語(yǔ)句的返回結(jié)果,以后可根據(jù)需要,以便在屏幕上顯示結(jié)果或做進(jìn)一步的處理。 在執(zhí)行select語(yǔ)句后的返回結(jié)果中,包含了數(shù)據(jù)表和數(shù)據(jù)表內(nèi)容的相關(guān)信息。關(guān)于數(shù)據(jù)表的信息可通過(guò)ResultSet的getMetaData方法來(lái)創(chuàng)建ResultSetMetaData對(duì)象,由這個(gè)對(duì)象可獲取所需數(shù)據(jù)庫(kù)的信息。,例如: ResultSetMetaData rsmd = rs.getMetaData(); rsmd.getColumnCount() / 獲取列(字段)數(shù) rsmd.getColumnName(列號(hào)) / 獲取指定列(字段)的列名 在ResultSet中,提供了一整套的getXXX方法(如getInt,getString,getFloat,getDouble等)來(lái)訪問(wèn)結(jié)果集中當(dāng)前行的不同列(用列序號(hào)或列標(biāo)題作為這些方法的參數(shù))的數(shù)據(jù)(類(lèi)型不同時(shí)可將字段類(lèi)型按照XXX類(lèi)型來(lái)進(jìn)行類(lèi)型轉(zhuǎn)換),而next方法可使得訪問(wèn)可對(duì)不同的行來(lái)進(jìn)行。,例如,可用下面的程序段對(duì)book表的書(shū)名(name)和作者(author)進(jìn)行訪問(wèn): ResultSet rs = st.executeQuery( “select name,author from book“); while(rs.next() System.out.println(rs.getString(name) +“ “ + rs.getString(3); ,ResultSet自動(dòng)維護(hù)結(jié)果集當(dāng)前數(shù)據(jù)行的指向光標(biāo),首先獲得結(jié)果集時(shí),指向光標(biāo)置于結(jié)果集的第一行前,以后每調(diào)用一次next方法,光標(biāo)就向下移動(dòng)一行,這樣可按照順序從第一行到最后一行逐行訪問(wèn)結(jié)果集的每一行(訪問(wèn)結(jié)束時(shí)next返回false值)。 在有些情況下,可能希望任意訪問(wèn)而不是順序訪問(wèn)結(jié)果集的數(shù)據(jù)行,對(duì)某些結(jié)果集,可能還希望通過(guò)結(jié)果集修改數(shù)據(jù)庫(kù)的數(shù)據(jù),則應(yīng)在createStatement 方法中加入如下的兩個(gè)參數(shù),即: Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);,如果只希望任意滾動(dòng)結(jié)果集的指向光標(biāo),而不修改數(shù)據(jù)庫(kù)的數(shù)據(jù),則可在上述兩個(gè)參數(shù)中將第二個(gè)參數(shù)設(shè)置為ResultSet.CONCUR_READ_ONLY。 通過(guò)參數(shù)的設(shè)置,就可以用ResultSet的first,last,previous,absolute,relative等方法來(lái)設(shè)置當(dāng)前行,并且還可以根據(jù)參數(shù)的更新設(shè)置,用insertRow(插入行)、deleteRow(刪除行)、updateRow(更新行)等方法來(lái)對(duì)數(shù)據(jù)庫(kù)表進(jìn)行增、刪、改的操作。 (6)、 關(guān)閉連接 數(shù)據(jù)庫(kù)訪問(wèn)結(jié)束,為保證數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性和釋放系統(tǒng)資源,應(yīng)明確地關(guān)閉數(shù)據(jù)庫(kù)的連接:一般是關(guān)閉結(jié)果集、關(guān)閉數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象和關(guān)閉連接。,11.3.2 數(shù)據(jù)庫(kù)編程實(shí)例 1查詢(xún)數(shù)據(jù)庫(kù)舉例 利用前面創(chuàng)建的數(shù)據(jù)庫(kù)library.MDB和數(shù)據(jù)源mylibDB來(lái)對(duì)數(shù)據(jù)庫(kù)中的表book進(jìn)行查詢(xún),顯示表中所有圖書(shū)的編號(hào)(no)、書(shū)名(name)、作者(author)、出版日期(printdate)和版次(times)。 【例11-2】查詢(xún)數(shù)據(jù)庫(kù)舉例。 import java.sql.*; class jdbccx public static void main(String args) try Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); catch(ClassNotFoundException ce) System.out.println(“SQLException:“+ce.getMessage(); ,try Connection conn= DriverManager.getConnection(“jdbc:odbc:mylibDB“); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery(“select * from book“); while(rs.next() System.out.println(“編號(hào):”+rs.getString(“no”)+“t”+ “書(shū) 名:“+rs.getString(“name“)+“t“+“作者:“+rs.getString (“author“)+“t“+“出版日期:“+rs.getDate(4)+“t“ +“印刷次數(shù):“+rs.getInt(5)+“t“+“價(jià)格:“+rs.getFloat(6); rs.close(); stmt.close(); catch(SQLException ce) System.out.println(“SQLException“+ce.getMessage(); ,【程序解析】 (1)、首先引入包:java.sql中的所有類(lèi)。 (2)、利用查詢(xún)語(yǔ)句:select*from book查詢(xún)表中的記錄,查詢(xún)結(jié)果保存在結(jié)果集rs中。 (3)、通過(guò)while循環(huán),將查詢(xún)結(jié)果中的每一行記錄顯示在屏幕上。 (4)、 取得rs中的列值時(shí),可以使用方法getXXX(列名),如程序中的rs.getString(“no”);表示取得列名為“no”的數(shù)據(jù)。XXX取決于該列的數(shù)據(jù)類(lèi)型。如果該列為字符串型,則使用getString(),如果該列為整型,則使用getInt(),如果該列為浮點(diǎn)型,則使用getFloat()。 (5)、有時(shí)候,使用方法getXXX(列名)時(shí),參數(shù)可以不使用列名,可以使用列的序號(hào)。 (6)、注意捕獲例外,見(jiàn)程序中的幾種例外類(lèi)型。 (7)、程序中,在while循環(huán)體中“t”表示水平制表 (8)、在實(shí)際查詢(xún)中,往往只要查詢(xún)數(shù)據(jù)庫(kù)中的一些特定數(shù)據(jù),而不要查詢(xún)整個(gè)表中的所有記錄,使用參數(shù)查詢(xún)數(shù)據(jù)庫(kù)可以實(shí)現(xiàn)按條件查詢(xún),SQL查詢(xún)語(yǔ)句SELECT中,應(yīng)用條件選項(xiàng)WHERE實(shí)現(xiàn)有條件地查詢(xún)。,2插入記錄舉例 通過(guò)Java程序,可以向數(shù)據(jù)庫(kù)中的表student中插入記錄。 見(jiàn)書(shū)【例11-3】插入記錄舉例。 【程序解析】 (1)、插入記錄使用方法是executeUpdate(),此方法不產(chǎn)生結(jié)果集。 (2)、需要注意的是:向表中插入記錄只允許插入不重復(fù)的記錄。 (3)、A行也可以改成: PreparedStatement pstmt=conn.prepareStatement(“insert into book values(?,?,?,?,?,?)“); pstmt.setString(1,“85492“); pstmt.setString(2,“java2實(shí)務(wù)“); pstmt.setString(3,“杜江“); pstmt.setDate(4,Date.valueOf(“2008-12-12“); pstmt.setInt(5,4); pstmt.setFloat(6,34.5f); pstmt.executeUpdate(); 用PreparedStatement語(yǔ)句時(shí),可使用“占位符”?來(lái)表示SQL命令中可變部分提高效率。setXXX()方法中的第一個(gè)參數(shù)是所對(duì)應(yīng)“?”的參數(shù)序號(hào),第二個(gè)參數(shù)是“?”代表的參數(shù)的值。,3修改記錄舉例 修改表book中的第1條記錄:將java程序設(shè)計(jì)的no改為20090110。 【例11-4】修改記錄舉例。,4刪除記錄舉例 【例11-5】將表book中的作者是杜江的圖書(shū)記錄。,5建立表舉例 不但可以在數(shù)據(jù)庫(kù)中創(chuàng)建表,也可以在程序中通過(guò)JDBC來(lái)建立一個(gè)新表,建立表包括建立的表的結(jié)構(gòu)和記錄。例如,建立表publishing,表結(jié)構(gòu)有press(出版社)和num(銷(xiāo)量),然后向表中插入如下兩條記錄: 清華大學(xué) ,120000000 中國(guó)水利水電,110000000,【例11-6】建立表舉例。 import java.sql.*; class jdbcjianlibiao public

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論