Java程序設(shè)計(jì)-第6章線程_第1頁
Java程序設(shè)計(jì)-第6章線程_第2頁
Java程序設(shè)計(jì)-第6章線程_第3頁
Java程序設(shè)計(jì)-第6章線程_第4頁
Java程序設(shè)計(jì)-第6章線程_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java的多線程

目錄和要求

Java程序通過流控制來執(zhí)行程序流,程序中單個(gè)順序的流控制稱為線程,多線程則指的是在單個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程,執(zhí)行不同的任務(wù)。多線程意味著一個(gè)程序的多行語句可以看上去幾乎在同一時(shí)間內(nèi)同時(shí)運(yùn)行。線程與進(jìn)程相似,是一段完成某個(gè)特定功能的代碼,是程序中單個(gè)順序的流控制;但與進(jìn)程不同的是,系統(tǒng)在產(chǎn)生一個(gè)線程,或者在各個(gè)線程之間切換時(shí),負(fù)擔(dān)要比進(jìn)程小的多,正因如此,線程被稱為輕負(fù)荷進(jìn)程(light-weightprocess)。一個(gè)進(jìn)程中可以包含多個(gè)線程。

學(xué)時(shí):1學(xué)時(shí)Java的多線程講義1多線程的概述

2多線程的實(shí)現(xiàn)方法與控制3多線程的互斥

4多線程的同步

5多線程的應(yīng)用

6總結(jié)多線程的概念

線程是程序中的一條執(zhí)行路徑。多線程是指程序中包含多條執(zhí)行路徑。在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程來執(zhí)行不同的任務(wù),即允許單個(gè)程序創(chuàng)建多個(gè)并行執(zhí)行的線程來完成各自的任務(wù)。瀏覽器程序就是一個(gè)多線程的例子,在瀏覽器中可以在下載Java小程序或圖像的同時(shí)滾動(dòng)頁面,在訪問新頁面時(shí),播放動(dòng)畫和聲音,打印文件等。Java對(duì)多線程的支持

Java語言里,線程表現(xiàn)為線程類。Thread線程類封裝了所有需要的線程操作控制。在線程對(duì)象里有很多方法來控制一個(gè)線程是否運(yùn)行,睡眠,掛起或停止。線程類是控制線程行為的唯一的手段。一旦一個(gè)Java程序啟動(dòng)后,就已經(jīng)有一個(gè)線程在運(yùn)行。可通過調(diào)用Thread.currentThread方法來查看當(dāng)前運(yùn)行的是哪一個(gè)線程。多線程的概述下面是一些常用線程類的方法。(1)類方法currentThread():返回正在運(yùn)行的Thread對(duì)象。yield():停止運(yùn)行當(dāng)前線程,將CPU控制權(quán)主動(dòng)移交到下一個(gè)可運(yùn)行線程。sleep(intn):讓當(dāng)前線程睡眠n毫秒,n毫秒后,線程可以再次運(yùn)行。(2)實(shí)例(對(duì)象)方法start():為本線程建立一個(gè)執(zhí)行環(huán)境,然后調(diào)用本線程的run()方法。run():在其中書寫運(yùn)行本線程的將要執(zhí)行的代碼,也是Runnable接口的唯一方法。當(dāng)一個(gè)線程初始化后,由start()方法來調(diào)用它,一旦run()方法返回,本線程也就終止了。

stop():讓某線程馬上終止,系統(tǒng)將刪除本線程的執(zhí)行環(huán)境。suspend():將線程掛起,暫停運(yùn)行,但系統(tǒng)不破壞線程的執(zhí)行環(huán)境,可以用resume()來恢復(fù)本線程的執(zhí)行。resume():恢復(fù)被掛起的線程進(jìn)入可運(yùn)行狀態(tài)。setPriority(intp):給線程設(shè)置優(yōu)先級(jí)1<=p<=10。getPriority():返回線程的優(yōu)先級(jí)。setName(Stringname):賦予線程一個(gè)名字name。getName():取得由setName()方法設(shè)置的線程名字的字符串。wait(longtimeout):停止當(dāng)前線程,直到另外的線程對(duì)這個(gè)對(duì)象使用notify()或notifyAll()方法。notify()或notifyAll():喚醒指定對(duì)象的一個(gè)或所有線程。線程的狀態(tài)和生命周期一個(gè)線程從創(chuàng)建、啟動(dòng)到終止期間的任何時(shí)刻,總是處于下面五個(gè)狀態(tài)中的某個(gè)狀態(tài)。1.創(chuàng)建狀態(tài)

用new運(yùn)算符創(chuàng)建一個(gè)Thread類或子類的實(shí)例對(duì)象時(shí),形成的新線程就進(jìn)入創(chuàng)建狀態(tài),但此時(shí)還未對(duì)這個(gè)線程分配任何資源,沒有真正執(zhí)行它。2.可運(yùn)行狀態(tài)在創(chuàng)建線程后,若要執(zhí)行它,系統(tǒng)要對(duì)這個(gè)線程進(jìn)行登記,并為它分配系統(tǒng)資源,這些工作由start()啟動(dòng)方法來完成。線程啟動(dòng)后,將進(jìn)入線程隊(duì)列排隊(duì)等待CPU時(shí)間片,成為可運(yùn)行狀態(tài)(或稱為就緒狀態(tài))。此時(shí)線程已經(jīng)具備了運(yùn)行的條件,一旦它獲得CPU等資源時(shí),就可以脫離開創(chuàng)建它的主線程而獨(dú)立運(yùn)行。3.運(yùn)行狀態(tài)當(dāng)可運(yùn)行狀態(tài)的線程被調(diào)度并獲得CPU等資源時(shí),便進(jìn)入運(yùn)行狀態(tài)。4.阻塞狀態(tài)由于人為或系統(tǒng)的原因,線程必須停止運(yùn)行,以后還可以恢復(fù)運(yùn)行的狀態(tài)稱為阻塞狀態(tài)。發(fā)生以下幾種情況之一后,線程進(jìn)入阻塞狀態(tài)。(1)調(diào)用了該線程的sleep()休眠方法。(2)該線程正在等待I/O操作完成。(3)調(diào)用了wait()等待方法。(4)調(diào)用了suspend()掛起方法。5.終止?fàn)顟B(tài)運(yùn)行run()方法完成后或調(diào)用stop()或destroy()方法就進(jìn)入線程的終止態(tài)(或稱為死亡狀態(tài))。處于這種狀態(tài)的線程不具有繼續(xù)運(yùn)行的能力。線程的調(diào)度和優(yōu)先級(jí)處于可運(yùn)行狀態(tài)的線程進(jìn)入線程隊(duì)列排隊(duì)等待CPU等資源時(shí),同一時(shí)刻在隊(duì)列中的線程可能有多個(gè),它們完成各自任務(wù)的輕重緩急程度是不同的。為了體現(xiàn)上述差別,多線程系統(tǒng)會(huì)給每個(gè)線程自動(dòng)分配一個(gè)線程的優(yōu)先級(jí)。任務(wù)較重要或緊急的線程,分配較高的優(yōu)先級(jí),在可運(yùn)行態(tài)的線程隊(duì)列中就往前排;否則,就分配較低的優(yōu)先級(jí)。優(yōu)先級(jí)低的線程只能等到優(yōu)先級(jí)高的線程執(zhí)行完后才被執(zhí)行。對(duì)于優(yōu)先級(jí)相同的線程,則遵循隊(duì)列的“先進(jìn)先出”原則,即先到的線程先獲得系統(tǒng)資源來運(yùn)行。在Java語言中,對(duì)一個(gè)新建的線程,系統(tǒng)會(huì)分配一個(gè)缺省的線程優(yōu)先級(jí):繼承創(chuàng)建這個(gè)線程的主線程的優(yōu)先級(jí)(一般為普通優(yōu)先級(jí))。Thread類也提供了方法setPriority()來修改線程的優(yōu)先級(jí)。該方法的參數(shù)一般可用Thread類的優(yōu)先級(jí)靜態(tài)常量:

PRIORITY.NORM_PRIORITY普通優(yōu)先級(jí)(5)

PRIORITY.MIN_PRIORITY最低優(yōu)先級(jí)(1)

PRIORITY.MAX_PRIORITY最高優(yōu)先級(jí)(10)當(dāng)一個(gè)在可運(yùn)行狀態(tài)隊(duì)列中排隊(duì)的線程被分配到CPU等資源而進(jìn)入運(yùn)行狀態(tài)后,這個(gè)線程就稱為是被“調(diào)度”或被線程調(diào)度管理器選中了。線程調(diào)度管理器負(fù)責(zé)管理線程排隊(duì)和CPU等資源在線程間的分配。多線程的實(shí)現(xiàn)方法與控制可以通過繼承Thread類或?qū)崿F(xiàn)Runnable接口這兩種途徑來構(gòu)造自己的run()方法。

多線程的實(shí)現(xiàn)方法1.繼承Thread類可通過繼承Thread類并重寫其中的run()方法來定義線程體以實(shí)現(xiàn)線程的具體行為,然后創(chuàng)建該子類的對(duì)象以創(chuàng)建線程。在繼承Thread類的子類ThreadSubclassName中重寫run()方法來定義線程體的一般格式為:

publicclassThreadSubclassNameextendsThread{publicThreadSubclassName(){.....//編寫子類的構(gòu)造方法,可缺省

}

publicvoidrun(){.....//編寫自己的線程代碼

}}用定義的線程子類ThreadSubclassName創(chuàng)建線程對(duì)象的一般格式為:

ThreadSubclassName

ThreadObject=newThreadSubclassName();然后,就可啟動(dòng)該線程對(duì)象表示的線程:

ThreadObject.start();//啟動(dòng)線程2.實(shí)現(xiàn)Runnable接口編寫多線程程序的另一種的方法是實(shí)現(xiàn)Runnable接口。在一個(gè)類中實(shí)現(xiàn)Runnable接口(以后稱實(shí)現(xiàn)Runnable接口的類為Runnable類),并在該類中定義run()方法,然后用帶有Runnable參數(shù)的Thread類構(gòu)造方法創(chuàng)建線程。創(chuàng)建線程對(duì)象可用下面的兩個(gè)步驟來完成:(1)生成Runnable類ClassName的對(duì)象

ClassName

RunnableObject=newClassName();(2)用帶有Runnable參數(shù)的Thread類構(gòu)造方法創(chuàng)建線程對(duì)象。新創(chuàng)建的線程的指針將指向Runnable類的實(shí)例。用該Runnable類的實(shí)例為線程提供run()方法---線程體。

ThreadThreadObject=newThread(RunnableObject);然后,就可啟動(dòng)線程對(duì)象ThreadObject表示的線程:ThreadObject.start();在Thread類中帶有Runnable接口的構(gòu)造方法有:publicThread(Runnable

target);publicThread(Runnable

target,String

name);publicThread(String

name);publicThread(ThreadGroup

group,Runnable

target);publicThread(ThreadGroup

group,Runnable

target,

String

name);其中,參數(shù)Runnable

target表示該線程執(zhí)行時(shí)運(yùn)行target的run()方法,String

name以指定名字構(gòu)造線程,ThreadGroup

group表示創(chuàng)建線程組。線程的建立舉例publicclassMyThreadextendsThread{publicMyThread(Stringname){

super(name);}publicvoidrun(){

for(inti=0;i<3;i++){

System.out.println(getName()+"isrunning");try{

sleep((long)(Math.random()*1000));}catch(InterruptedExceptione){

System.out.println(e);}}

System.out.println(getName()+"hasstopped.");}publicstaticvoidmain(String[]args){

MyThreadt1=newMyThread("Thread1");

MyThreadt2=newMyThread("Thread2");t1.start();t2.start();}}importjavax.swing.*;publicclassMyThread1extendsJFrameimplementsRunnable{privateJTextArea

textArea=newJTextArea();publicMyThread1(){

setTitle("TestMultithread");

add(textArea);setSize(300,200);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidrun(){

for(inti=0;i<3;i++){

textArea.append(Thread.currentThread().getName()+"isrunning.\n");try{

Thread.sleep((long)Math.random()*1000);}catch(InterruptedExceptione){System.out.println(e);}}

textArea.append(Thread.currentThread().getName()+"hasstopped.\n");}publicstaticvoidmain(String[]args){MyThread1t=newMyThread1();Threadt1=newThread(t,"Thread1");Threadt2=newThread(t,"Thread2");t1.start();t2.start();}}線程的建立舉例多線程的控制1.操作線程如果創(chuàng)建線程正常,可在線程的run()方法里控制線程。一旦進(jìn)入run()方法,便可執(zhí)行里面的任何程序。run()好象main()一樣。一旦run()執(zhí)行完,這個(gè)線程也就結(jié)束了。若想推遲一個(gè)線程的執(zhí)行,應(yīng)使用sleep(delay)休眠方法,delay是休眠的時(shí)間(毫秒)。當(dāng)線程休眠時(shí)并不占用系統(tǒng)資源。其他線程可繼續(xù)工作。2.暫停一個(gè)線程經(jīng)常需要掛起一個(gè)線程而不指定多少時(shí)間。例如,若創(chuàng)建了一個(gè)含有動(dòng)畫線程的小程序。也許讓用戶暫停動(dòng)畫直到他們想恢復(fù)為止。若不想將動(dòng)畫線程扔掉,但想讓它停止,象這種類似的線程可用suspend()方法來掛起。用suspend()方法掛起線程并不永久地停止線程,這可用resume()方法重新激活線程。3.停止一個(gè)線程線程的最后一個(gè)控制是停止方法stop()。用它可以停止線程的執(zhí)行。多線程的(同步)互斥程序中的多個(gè)線程一般是獨(dú)立運(yùn)行的,各個(gè)線程有自己的數(shù)據(jù)和方法。但有時(shí)需要在多個(gè)線程之間共享一些資源對(duì)象,這些資源對(duì)象的操作在某些時(shí)候必須要在線程間很好地協(xié)調(diào),以保證它們的正確使用。不考慮協(xié)調(diào)性,就可能產(chǎn)生錯(cuò)誤。

在Java語言中,為保證線程對(duì)共享資源操作的完整性,用關(guān)鍵字synchronized為共享資源加鎖來解決這個(gè)問題。從而達(dá)到對(duì)共享數(shù)據(jù)的互斥訪問。如果一個(gè)線程獲得了鎖,所有其他希望獲得該鎖從而對(duì)共享數(shù)據(jù)進(jìn)行訪問的線程將被暫停,進(jìn)入等待狀態(tài),直到前一個(gè)線程完成了對(duì)共享數(shù)據(jù)的訪問,釋放了該鎖為止,通常稱這個(gè)鎖為互斥鎖。synchronized可修飾一個(gè)代碼塊或一個(gè)方法,使修飾對(duì)象在任一時(shí)刻只能有一個(gè)線程訪問。從而提供了程序的異步執(zhí)行功能。使用synchronized的形式為:

synchronized(this){......}//修飾一個(gè)代碼塊

synchronizedmethodName(parameters){//修飾一個(gè)方法

......}多線程的交互有時(shí)候,多個(gè)線程需要相互協(xié)作來共同完成一個(gè)任務(wù),這需要在多個(gè)線程之間存在著一種交互機(jī)制。實(shí)現(xiàn)交互需要在這些線程之間相互通訊。Java提供了方法wait()和notify()等來使線程之間相互交談。一個(gè)線程可以進(jìn)入某一個(gè)對(duì)象的synchronized方法進(jìn)入等待狀態(tài),直到其他線程顯式地將它喚醒??梢杂卸鄠€(gè)線程進(jìn)入同一個(gè)方法并等待同一個(gè)喚醒消息。多線程的應(yīng)用【例】一個(gè)Java小程序。在屏幕上顯示時(shí)間,每隔一秒鐘刷新一次。為使小程序不影響其他程序的運(yùn)行,使用了多線程。importjava.awt.*;importjava.applet.*;importjava.util.Date;publicclassClockextendsAppletimplementsRunnable{ThreadclockThread;Fontfont;

publicvoidinit(){font=newFont("TimesRoman",Font.BOLD,64);}publicvoidstart(){if(clockThread==null){

clockThread=newThread(this,"Showtime");

clockThread.start();}}publicvoidrun(){while(clockThread!=null){repaint();try{clockThread.sleep(1000);}catch(InterruptedExceptione){}

}}publicvoidpaint(Graphicsg){Datenow=newDate();

g.setFont(font);

g.setColor(Color.red);

g.drawString(now.getHours()+":"+

now.getMinutes()+":"

+now.getSeconds(),5,50);}publicvoidstop(){

clockThread.stop();}}程序運(yùn)行結(jié)果如下圖所示。補(bǔ)充JDBC數(shù)據(jù)庫編程技術(shù)(1學(xué)時(shí))知識(shí)點(diǎn):了解常見的關(guān)系型數(shù)據(jù)庫熟悉JDBC的工作原理,掌握J(rèn)DBC操作數(shù)據(jù)庫所用到的類的使用方法掌握J(rèn)DBC開發(fā)數(shù)據(jù)庫的工作步驟本節(jié)主要介紹以下5個(gè)部分的內(nèi)容:1.關(guān)系數(shù)據(jù)庫簡介2.JDBC基礎(chǔ)3.主要JDBC類4.JDBC編程工作步驟5.實(shí)例一、關(guān)系數(shù)據(jù)庫簡介

(1)關(guān)系數(shù)據(jù)庫的特點(diǎn)有哪些?

一個(gè)數(shù)據(jù)庫由一個(gè)或多個(gè)表組成,每個(gè)表由行,列組成,列代表字段(即屬性),行代表記錄,表中的記錄應(yīng)該是唯一的,主關(guān)鍵字唯一。(2)對(duì)關(guān)系數(shù)據(jù)庫的操作有哪些?

搜索(查找),連接操作 添加,更新,刪除記錄

(3)SQL語句(1)SELECT[ALL|DISTINCT|DISTINCTROW|TOP]

{*|talbe.*|[table.]field1[ASalias1][,[table.]field2[ASalias2][,…]]}

FROMtableexpression[,…][INexternaldatabase]

[WHERE…]

(2)更新數(shù)據(jù)語法:

UPDATE表名

SET新值

WHERE條件

(3)DELETE子句的語法:

DELETE[表名.*]

FROM來源表

WHERE條件(4)INSERT子句的語法:

INSETRINTO目的表或查詢(字段1,字段2,…)

values(數(shù)值1,數(shù)值2,…)二ODBC概述30ODBC(OpenDatabaseConnectivity

)定義:

ODBC是一種用來在相關(guān)和不相關(guān)的DBMS中存取數(shù)據(jù)的標(biāo)準(zhǔn)應(yīng)用程序數(shù)據(jù)接口。ODBC組成:應(yīng)用程序接口為數(shù)據(jù)庫應(yīng)用程序開發(fā)者提供了統(tǒng)一的SQL編程接口數(shù)據(jù)庫驅(qū)動(dòng)器實(shí)現(xiàn)ODBCAPI(ODBC)的函數(shù)調(diào)用,ODBCAPI是數(shù)據(jù)庫廠商為程序設(shè)計(jì)者提供的一組直接訪問數(shù)據(jù)庫的函數(shù)驅(qū)動(dòng)程序管理器用于為應(yīng)用程序裝載數(shù)據(jù)庫驅(qū)動(dòng)器,為應(yīng)用程序與數(shù)據(jù)庫之間的操作選擇相互匹配的ODBCAPI函數(shù)數(shù)據(jù)源數(shù)據(jù)源是數(shù)據(jù)庫位置、數(shù)據(jù)庫類型以及ODBC驅(qū)動(dòng)程序等信息的集成三、JDBC基礎(chǔ)

JDBC是為Java提供的一個(gè)平臺(tái)無關(guān)的數(shù)據(jù)庫標(biāo)準(zhǔn)API,它提供了一個(gè)通用的SQL數(shù)據(jù)庫存取機(jī)制,該機(jī)制為多數(shù)關(guān)系型DBMS提供統(tǒng)一接口。

JDBC分為JDBCAPI與JDBC驅(qū)動(dòng)程序。前者即一組JDBC類庫,使用這個(gè)類庫可以以一種標(biāo)準(zhǔn)的方法、方便地訪問數(shù)據(jù)庫資源(在java.sql類包中)。

JDBC為訪問不同的數(shù)據(jù)庫提供了一種統(tǒng)一的途徑,象ODBC一樣,JDBC對(duì)開發(fā)者屏蔽了一些細(xì)節(jié)問題。二、JDBC基礎(chǔ)

JDBC包含一系列豐富的類,在java.sql包中(JDK.1.1以上).JDBC提供了一種API實(shí)現(xiàn)對(duì)數(shù)據(jù)庫透明存取的方法,這種存取依據(jù)驅(qū)動(dòng)程序來實(shí)現(xiàn),不同的數(shù)據(jù)庫制造尚提供它們不同的驅(qū)動(dòng)程序.JDBC的目標(biāo)是使應(yīng)用程序開發(fā)人員使用JDBC可以連接任何提供了JDBC驅(qū)動(dòng)程序的數(shù)據(jù)庫系統(tǒng),這樣就使得程序員無需對(duì)特定的數(shù)據(jù)庫系統(tǒng)的特點(diǎn)有過多的了解,從而大大簡化和加快了開發(fā)過程。與ODBC相類似,JDBC接口(API)也包括兩個(gè)層次:

面向應(yīng)用的API:JavaAPI,抽象接口,供應(yīng)用程序開發(fā)人員使用(連接數(shù)據(jù)庫,執(zhí)行SQL語句,獲得結(jié)果)。

面向數(shù)據(jù)庫的API:JavaDriverAPI,供開發(fā)商開發(fā)數(shù)據(jù)庫驅(qū)動(dòng)程序用。JDBC直接在應(yīng)用程序中加載驅(qū)動(dòng)程序并連接特定的數(shù)據(jù)庫。二、JDBC基礎(chǔ)三、主要JDBC類(1)Driver類:用來與數(shù)據(jù)庫通信的軟件.(2)DriverManager類:是JDBC基礎(chǔ),用來管理和卸載JDBC驅(qū)動(dòng)程序.該類有一個(gè)getConnection()方法,用于驗(yàn)證JDBC數(shù)據(jù)源,并返回Connection對(duì)象.(3)Connection類:該類的CreateStatement()方法連接JDBC數(shù)據(jù)源,返回Statement對(duì)象.(4)Statement類:將SQL行為封裝起來交給數(shù)據(jù)庫引擎,調(diào)用該類的execute(),executeQuery(),executeUpdate()等方法,執(zhí)行SQL語句,返回resultSet對(duì)象.(5)ResultSet類:封裝了一個(gè)由SQL查詢返回的結(jié)果.該類的getString(),getInt()等方法獲得一欄數(shù)據(jù)的存取,next()方法到下一行.四、JDBC編程工作步驟任何一個(gè)JDBC應(yīng)用程序,都需要以下四個(gè)步驟:加載JDBC驅(qū)動(dòng)程序建立與數(shù)據(jù)庫的連接進(jìn)行數(shù)據(jù)庫操作數(shù)據(jù)集結(jié)果分析關(guān)閉相關(guān)連接1、加載JDBC驅(qū)動(dòng)程序在應(yīng)用程序中,有三種方法可以加載驅(qū)動(dòng)程序:利用System類的靜態(tài)方法setProperty()System.setProperty(“jdbc.drivers”,“sun.jdbc.odbc.JdbcOdbcDriver”);

利用Class類的靜態(tài)方法forName()Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Class.forName(“oracle.jdbc.driver.OracleDriver”);

直接創(chuàng)建一個(gè)驅(qū)動(dòng)程序?qū)ο髇ew

sun.jdbc.odbc.JdbcOdbcDriver();2、通過JDBC訪問數(shù)據(jù)庫37JDBC驅(qū)動(dòng)程序分類JDBC-ODBC和ODBCDriver相關(guān)數(shù)據(jù)庫提供的JDBC驅(qū)動(dòng)程序2、通過JDBC訪問數(shù)據(jù)庫38通過JDBC-ODBC來連接數(shù)據(jù)庫設(shè)置ODBC數(shù)據(jù)源2、通過JDBC訪問數(shù)據(jù)庫39通過JDBC-ODBC來連接數(shù)據(jù)庫加載驅(qū)動(dòng)JDBC-ODBC驅(qū)動(dòng)器try{

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

}catch(ClassNotFoundExceptione){}

解釋:“sun.jdbc.odbc.JdbcOdbcDriver”是驅(qū)動(dòng)器類的名字以完整的Java類名為參數(shù),裝載此類,并返回一個(gè)Class對(duì)象同時(shí),自動(dòng)創(chuàng)建一個(gè)驅(qū)動(dòng)器類的實(shí)例并自動(dòng)調(diào)用驅(qū)動(dòng)器管理器DriverManager類中的RegisterDriver方法來注冊(cè)它2、通過JDBC訪問數(shù)據(jù)庫40通過JDBC-ODBC來連接數(shù)據(jù)庫建立與數(shù)據(jù)庫的連接Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","test","1234");解釋:將返回與指定數(shù)據(jù)庫建立的連接該方法有三個(gè)字符串參數(shù)第一個(gè)是JDBCURL,格式為jdbc:子協(xié)議:子名稱jdbc表示協(xié)議,JDBCURL中的協(xié)議總是jdbc;子協(xié)議是驅(qū)動(dòng)器名稱;子名稱是數(shù)據(jù)庫的名稱,如果是位于遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫,則還應(yīng)該包括網(wǎng)絡(luò)地址,//主機(jī)名:端口/數(shù)據(jù)庫名第二個(gè)是訪問數(shù)據(jù)庫所需的用戶名第三個(gè)是用戶密碼Connection是一個(gè)接口,表示與指定數(shù)據(jù)庫的連接通過JDBC訪問數(shù)據(jù)庫41通過JDBC-ODBC來連接數(shù)據(jù)庫對(duì)數(shù)據(jù)庫進(jìn)行操作使用Connection對(duì)象創(chuàng)建Statement對(duì)象使用Statement對(duì)象執(zhí)行SQL命令從上一步驟返回的ResultSet對(duì)象中提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫42Connection接口有3個(gè)方法可用來創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的對(duì)象createStatement創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的Statement對(duì)象,用于簡單的SQL語句

Statementstmt=con.createStatement();prepareStatement創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的PreparedStatement對(duì)象,用于帶有一個(gè)或多個(gè)參數(shù)的SQL語句。在SQL語句執(zhí)行前,這些參數(shù)將被賦值prepareCall創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的CallableStatement對(duì)象,用于調(diào)用數(shù)據(jù)庫中的存儲(chǔ)過程通過JDBC訪問數(shù)據(jù)庫43Statement接口提供了三種執(zhí)行SQL語句的方法,使用哪一個(gè)方法由SQL語句所產(chǎn)生的內(nèi)容決定executeQuery用于產(chǎn)生單個(gè)結(jié)果集的語句,例如SELECT語句

ResultSet

rs=stmt.executeQuery("Select*FromPerson");executeUpdate用于執(zhí)行INSERT、UPDATE或DELETE語句,以及CREATETABLE

stmt.executeUpdate("DELETEFROMPersonWHEREName='李四'");返回值是一個(gè)整數(shù),表示受影響的行數(shù)(即更新計(jì)數(shù)Execute用于執(zhí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論