




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
JAVA語言程序設(shè)計10.1數(shù)據(jù)庫連接方式10.2常用接口類的使用方法10.3反射的使用10.4數(shù)據(jù)庫編程案例本章小結(jié)第十章目錄教學(xué)目標(biāo):數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫。在當(dāng)今信息技術(shù)迅速發(fā)展的時代,數(shù)據(jù)庫在應(yīng)用程序中起著非常重要的作用。大型應(yīng)用程序開發(fā)中,數(shù)據(jù)庫開發(fā)是必不可少的技術(shù)。本章將介紹JAVA應(yīng)用程序和關(guān)系數(shù)據(jù)庫連接的JDBC技術(shù),并結(jié)合實例來說明JAVA應(yīng)用程序中的數(shù)據(jù)庫連接方法,將重點探討數(shù)據(jù)庫操作相關(guān)的JAVA類的應(yīng)用方法。數(shù)據(jù)庫保存著用戶個人隱私數(shù)據(jù),使用數(shù)據(jù)庫時應(yīng)遵守從業(yè)者的職業(yè)道德規(guī)范,避免主觀泄露數(shù)據(jù)庫中的信息,積極構(gòu)建健康、安全的數(shù)據(jù)庫系統(tǒng)。教學(xué)重點:了解JDBC技術(shù)。熟悉數(shù)據(jù)庫驅(qū)動程序的分類。掌握J(rèn)DBC訪問數(shù)據(jù)庫的兩種常用方法。第十章10.1.1JDBC的介紹JDBC是Java應(yīng)用程序與數(shù)據(jù)庫的溝通橋梁,它提供了訪問關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)接口。10.1數(shù)據(jù)庫連接方式Java應(yīng)用程序
JDBC驅(qū)動管理
JDBCAPIJDBCManagerJDBCDriverAPIDataBase數(shù)據(jù)庫DriverADriverBDriverD不同類型的驅(qū)動程序JDBC連接數(shù)據(jù)庫示意圖……JAVA的應(yīng)用程序:應(yīng)用程序包括JSP程序、JAVAApplication程序、JAVAApplet小程序等等。JDBCAPI:完成加載驅(qū)動程序、連接數(shù)據(jù)庫、對數(shù)據(jù)庫進(jìn)行處理和返回結(jié)果的功能。JDBCManager:將JDBCAPI的調(diào)用轉(zhuǎn)換成JDBCDriverAPI的調(diào)用,它是由SUN公司提供的。JDBCDriverAPI:針對不同數(shù)據(jù)庫驅(qū)動程序開發(fā)商的接口,開發(fā)商根據(jù)自己的數(shù)據(jù)庫實現(xiàn)這些接口。不同的Driver:由各個數(shù)據(jù)庫管理系統(tǒng)開發(fā)商編寫。JDBC要與不同的數(shù)據(jù)庫建立連接,必須獲取連接數(shù)據(jù)庫的驅(qū)動程序。10.1.1JDBC的介紹使用JDBC步驟1.裝載數(shù)據(jù)庫的JDBC驅(qū)動程序。2.與數(shù)據(jù)庫建立連接。3.將SQL語句傳遞到數(shù)據(jù)庫中,執(zhí)行操作,返回得到的結(jié)果。4.關(guān)閉數(shù)據(jù)庫連接。1.JDBC-ODBC橋JDBC-ODBC橋又稱JDBC-ODBC橋驅(qū)動。JDBC-ODBC橋驅(qū)動是SUN公司開發(fā)的一種技術(shù),將JDBC的調(diào)用轉(zhuǎn)換成對開放數(shù)據(jù)庫連接ODBC
的調(diào)用,起到了橋梁連接的作用。使用這種驅(qū)動在進(jìn)行數(shù)據(jù)庫連接時,需要在操作系統(tǒng)中創(chuàng)建某一數(shù)據(jù)庫管理系統(tǒng)的ODBC數(shù)據(jù)源,這樣就可以在Java/JSP程序中訪問數(shù)據(jù)庫了。這種技術(shù)在JDK中就已經(jīng)提供了,因此不需要額外安裝程序,獨立于具體數(shù)據(jù)庫。10.1.2數(shù)據(jù)庫驅(qū)動程序的分類本地API驅(qū)動程序是將JDBC的調(diào)用轉(zhuǎn)換成執(zhí)行數(shù)據(jù)庫開發(fā)商所提供的API來訪問數(shù)據(jù)庫。這種方法和具體的數(shù)據(jù)庫有很大的關(guān)系,采用不同的數(shù)據(jù)庫,驅(qū)動程序的名稱也就不同。因此,該方法不獨立于數(shù)據(jù)庫,后面會給出各種數(shù)據(jù)庫的驅(qū)動程序的名稱。2.本地API驅(qū)動程序本地協(xié)議驅(qū)動程序?qū)DBC的調(diào)用轉(zhuǎn)換為特定數(shù)據(jù)庫所使用的網(wǎng)絡(luò)協(xié)議,這樣允許客戶端直接調(diào)用數(shù)據(jù)庫服務(wù)器。但由于許多這樣的協(xié)議都是專用的,所以需要在客戶端與數(shù)據(jù)庫之間安裝中介軟件,讓客戶端的請求通過此中介軟件轉(zhuǎn)換成數(shù)據(jù)庫能夠接受處理的信息。3.本地協(xié)議驅(qū)動程序網(wǎng)絡(luò)協(xié)議的完全JAVA驅(qū)動程序?qū)DBC的調(diào)用轉(zhuǎn)換為獨立于特定數(shù)據(jù)庫的網(wǎng)絡(luò)協(xié)議??蛻舳瞬恍枰惭b任何中介軟件,而是通過一個網(wǎng)絡(luò)API,使用套接字來調(diào)用服務(wù)器上的中間件程序,服務(wù)器再將請求轉(zhuǎn)換為具體的API調(diào)用;執(zhí)行結(jié)果也能直接從服務(wù)器取回。目前,社會上廣泛使用的是前兩種技術(shù),本章將詳細(xì)介紹這兩種技術(shù)的具體應(yīng)用。4.網(wǎng)絡(luò)協(xié)議的完全Java驅(qū)動程序優(yōu)點是提供了數(shù)據(jù)庫訪問的通用平臺。缺點是應(yīng)用程序依賴于ODBC,移植性差。JDBC-ODBC橋訪問數(shù)據(jù)庫需要完成三個步驟:①創(chuàng)建ODBC數(shù)據(jù)源。②加載JDBC-ODBC橋驅(qū)動。③應(yīng)用程序和ODBC數(shù)據(jù)源建立連接。10.1.3JDBC-ODBC橋連接數(shù)據(jù)庫連接過程舉例數(shù)據(jù)庫Student,包含四張數(shù)據(jù)庫表:學(xué)生登錄表StudentLog學(xué)生信息表StudentInfo學(xué)生成績表StudentScore教師登錄表TeacherLog學(xué)生信息表StudentInfo學(xué)生登錄表StudentLog學(xué)生成績表StudentScore教師登錄表TeacherLog控制面板——管理工具——ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源1.創(chuàng)建ODBC數(shù)據(jù)源在ODBCC數(shù)據(jù)源配置成功后,就可以在連接數(shù)據(jù)庫的文件中加載
JDBC-ODBC橋驅(qū)動。Class是java.lang.*包中的一個類,該類調(diào)用它的靜態(tài)方法forName()就可以建立
JDBC-ODBC橋連接,標(biāo)準(zhǔn)格式如下:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.print(e.toString());}因為在加載驅(qū)動時可能會出現(xiàn)異常情況,所以此處需要用異常處理機(jī)制捕獲異常。2.加載
JDBC-ODBC橋驅(qū)動(1)連接數(shù)據(jù)庫Stringurl="jdbc:odbc:mydata";Stringusername="sa";Stringpwd="111111";Connectioncon;con=DriverManager.getConnection(dbconn,username,pwd);3.應(yīng)用程序和數(shù)據(jù)庫建立連接(2)聲明并創(chuàng)建statement接口的對象
Statementstat;stat=con.createStatement();(3)發(fā)送SQL語句并處理查詢結(jié)果
ResultSetrs;rs=stat.executeQuery("select*fromStudentInfo");
(4)關(guān)閉數(shù)據(jù)庫連接
con.close();3.應(yīng)用程序和數(shù)據(jù)庫建立連接importjava.sql.*;//導(dǎo)入數(shù)據(jù)庫包;publicclassExample10_1{ publicstaticvoidmain(Stringargs[]){ Connectioncon=null; Statementstat=null;//聲明對象;
ResultSetrs=null; Stringuser="sa";//數(shù)據(jù)庫用戶名;
Stringpwd="111111";//數(shù)據(jù)庫連接密碼;
Stringurl="jdbc:odbc:mydata";//連接數(shù)據(jù)源;Stringsql="select*fromStudentInfowhereclass='120421'";try{ //加載驅(qū)動Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con=DriverManager.getConnection(url,user,pwd);【例10-1】用JDBC-ODBC橋的方式連接SQLServer數(shù)據(jù)庫Student,取出學(xué)生信息表StudentInfo中“120421”班的所有學(xué)生并打印stat=con.createStatement();//建立數(shù)據(jù)庫連接;rs=stat.executeQuery(sql); //傳遞SQL語句; while(rs.next()){//需要捕獲異常;
System.out.print("學(xué)號:"+rs.getString("stuid")+""); System.out.println("姓名:"+rs.getString("name"));} }catch(Exceptione1){ e1.printStackTrace();}finally{ try{con.close();}//關(guān)閉數(shù)據(jù)庫連接;catch(SQLExceptione2){e2.printStackTrace();}}}}【例10-1】用JDBC-ODBC橋的方式連接SQLServer數(shù)據(jù)庫Student,取出學(xué)生信息表StudentInfo中“120421”班的所有學(xué)生并打印【例10-1】用JDBC-ODBC橋的方式連接SQLServer數(shù)據(jù)庫Student,取出學(xué)生信息表StudentInfo中“120421”班的所有學(xué)生并打印優(yōu)點是可移植性好,不依賴于本機(jī)配置。缺點是需要在加載與數(shù)據(jù)庫類型相關(guān)的特定驅(qū)動程序。需要完成三個步驟:①從網(wǎng)上下載特定的驅(qū)動程序。②加載本地API驅(qū)動。③應(yīng)用程序和數(shù)據(jù)庫建立連接。10.1.4使用本地API驅(qū)動程序1.下載特定的純JAVA驅(qū)動程序1.下載特定的純JAVA驅(qū)動程序SQL2000需要三個jar包:mssqlservice.jar、msutil.jar、msbase.jar1.下載特定的純JAVA驅(qū)動程序1.下載特定的純JAVA驅(qū)動程序1.下載特定的純JAVA驅(qū)動程序try{Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");}catch(ClassNotFoundExceptione){System.out.print(e.toString());}2.加載JAVA驅(qū)動(1)連接數(shù)據(jù)庫Stringurl;url="jdbc:sqlserver://localhost:1433;DatabaseName=Student";Stringusername=“sa”;Stringpwd="1111";Connectioncon;con=DriverManager.getConnection(dbconn,username,pwd);(2)聲明并創(chuàng)建statement接口對象(3)發(fā)送SQL語句并處理查詢結(jié)果(4)關(guān)閉數(shù)據(jù)庫連接3.應(yīng)用程序和數(shù)據(jù)庫建立連接importjava.sql.*;//導(dǎo)入數(shù)據(jù)庫包;
publicclassExample10_2{ publicstaticvoidmain(Stringargs[]){ Connectioncon=null; Statementstat=null;//聲明數(shù)據(jù)庫連接時用到的對象;
ResultSetrs=null; Stringuser="sa";//數(shù)據(jù)庫用戶名;
Stringpwd="111111";//數(shù)據(jù)庫連接密碼;
Stringurl;url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Student";Stringsql="select*fromStudentInfowhereclass='120421'";try{ //加載驅(qū)動【例10-2】用本地API驅(qū)動程序方式連接SQLServer數(shù)據(jù)庫Student,取出學(xué)生信息表StudentInfo中“120421”班的所有學(xué)生并打印Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);con=DriverManager.getConnection(url,user,pwd);stat=con.createStatement();//建立數(shù)據(jù)庫連接;rs=stat.executeQuery(sql); //傳遞SQL語句
while(rs.next()){//打印結(jié)果;System.out.print("學(xué)號:"+rs.getString("stuid")+""); System.out.println("姓名:"+rs.getString("name"));}}catch(SQLExceptione1){ e1.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}finally{ try{con.close();}//關(guān)閉數(shù)據(jù)庫連接;catch(SQLExceptione2){e2.printStackTrace();}}}}【例10-2】用本地API驅(qū)動程序方式連接SQLServer數(shù)據(jù)庫Student,取出學(xué)生信息表StudentInfo中“120421”班的所有學(xué)生并打印1.任務(wù)打開一個學(xué)生管理的應(yīng)用程序,輸入用戶名和密碼登錄系統(tǒng)。在數(shù)據(jù)庫中查找用戶表,判斷是否存在該用戶,如果存在該用戶,且輸入的密碼與數(shù)據(jù)表中存儲的用戶密碼一致,用戶登錄成功,進(jìn)入主界面。否則,提示密碼錯誤。2.目的實現(xiàn)一個簡單的用戶登錄過程,完成與數(shù)據(jù)庫的連接?!纠?0-3】案例描述3.設(shè)計思路在用戶登錄界面中接收用戶名和密碼,放入變量userid和userpassword中。連接數(shù)據(jù)庫,在數(shù)據(jù)庫中查找是否存在用戶名為userid的用戶,如果存在,獲取該用戶的正確密碼,放入變量password中。如果不存在,提示用戶名不存在。將兩個變量userpassword和password進(jìn)行比較,如果一致,則成功登錄,否則提示密碼錯誤。【例10-3】案例描述4.遇到問題使用什么方法搭建界面?用什么數(shù)據(jù)庫,如何連接數(shù)據(jù)庫?查詢語句怎樣寫?要定義多少類文件?【解決問題1】二個Label,二個TextField,二個Button。【解決問題2】采用本地API驅(qū)動程序方法連接數(shù)據(jù)庫【解決問題3】"select*fromStudentlogwherestuid='"+userid+"'"?!窘鉀Q問題4】用戶登錄UserLogGUI.java,主界面MainGUI.java,連接數(shù)據(jù)庫類DBconnect.java?!纠?0-3】案例描述5.實現(xiàn)過程(1)用戶登錄界面UserLogGUI.java登錄頁面
(2)連接數(shù)據(jù)庫文件DBconnect.java(3)連接數(shù)據(jù)庫文件DBconnect.java
主頁面
用戶名錯誤密碼錯誤【例10-3】案例描述2018年9月19日,順豐一位工程師在升級系統(tǒng)數(shù)據(jù)庫的時候,不慎將RUSS數(shù)據(jù)庫刪除,導(dǎo)致很長一段時間順豐線上發(fā)車功能無法使用,產(chǎn)生了很嚴(yán)重的負(fù)面影響。此前也曾有新聞報道,北京一軟件工程師離職后因公司未能如期結(jié)清工資,便在其所設(shè)計的網(wǎng)站中安插后門文件,將網(wǎng)站源代碼全部刪除,結(jié)果因破壞計算機(jī)信息系統(tǒng)罪而獲刑5年。我們在工作中要講究誠信,無論發(fā)生什么事情,也不能將情緒發(fā)泄到工作中,更不能做出這種刪庫跑路的違法犯罪行為。課后思考:程序員刪庫跑路,什么原因?Connection接口Statement接口ResultSet接口PreparedStatement接口10.3常用接口類的使用方法Connection接口類存在于java.sql.*包中,該接口類的作用是與特定數(shù)據(jù)庫連接,執(zhí)行SQL語句并返回結(jié)果。在配置Connection接口時,JDBC應(yīng)用程序應(yīng)該使用適當(dāng)?shù)腃onnection方法。10.2.1Connection接口類Connection接口類常用方法importjava.sql.*;//導(dǎo)入數(shù)據(jù)庫包;publicclassExample10_4{ publicstaticvoidmain(Stringargs[]){Connectioncon=null; Stringuser="sa";//數(shù)據(jù)庫用戶名;
Stringpwd=“111111”;//數(shù)據(jù)庫連接密碼;
Stringurl; url=“jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Student”;booleancommitvalue=false;try{ //加載驅(qū)動Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);con=DriverManager.getConnection(url,user,pwd);commitvalue=con.getAutoCommit();//查看系統(tǒng)的提交模式;【例10-4】連接SQLServer數(shù)據(jù)庫Student,查看系統(tǒng)的自動提交模式,關(guān)閉數(shù)據(jù)庫。System.out.println(“系統(tǒng)當(dāng)前的自動提交模式值為:”+commitvalue);if(!con.isClosed()){con.close();}//如果連接沒關(guān)閉,關(guān)閉數(shù)據(jù)庫;}catch(Exceptione){ //需要捕獲異常;
System.out.println(e.toString()); }}}【例10-4】連接SQLServer數(shù)據(jù)庫Student,查看系統(tǒng)的自動提交模式,關(guān)閉數(shù)據(jù)庫。Statement接口類存在于java.sql.*包中,用于向已經(jīng)建立連接的數(shù)據(jù)庫發(fā)送SQL語句。該接口包括執(zhí)行SQL語句和獲取返回結(jié)果的方法。executeQuery(Stringsql)方法:執(zhí)行一條查詢語句executeUpdate(Stringsql)方法:執(zhí)行一條插入、刪除、更新語句10.2.2Statement接口類Statement接口有三種:Statement對象用于執(zhí)行不帶參數(shù)的簡單SQL語句。PreparedStatement對象用于執(zhí)行帶或不帶入口參數(shù)的預(yù)編譯SQL語句。CallableStatement對象用于執(zhí)行對數(shù)據(jù)庫存儲過程的調(diào)用。10.2.2Statement接口類Statement對象最常用的方法是executeQuery(Stringsql)和executeUpdate(Stringsql)。executeQuery(Stringsql)方法用來執(zhí)行一條查詢語句,返回的是一個結(jié)果集,該方法的執(zhí)行對數(shù)據(jù)庫數(shù)據(jù)不會發(fā)生更改。executeUpdate(Stringsql)方法用來執(zhí)行一條插入、刪除、更新語句,返回的結(jié)果是整型,代表該語句影響數(shù)據(jù)庫記錄的條數(shù)。10.2.2Statement接口類Statement接口類的常用方法importjava.sql.*;//導(dǎo)入數(shù)據(jù)庫包;publicclassExample10_4{ publicstaticvoidmain(Stringargs[]){ Connectioncon=null; Statementstat=null;//聲明數(shù)據(jù)庫連接時用到的對象;
ResultSetrs=null; Stringuser="sa";//數(shù)據(jù)庫用戶名;
Stringpwd="111111";//數(shù)據(jù)庫連接密碼;
Stringurl;//插入三名學(xué)生信息;url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Student";Stringsql1="insertintoStudentInfovalues('12043104','李麗','120431',0,'計算機(jī)')";【例10-5】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中追加三名學(xué)生,然后查看結(jié)果。Stringsql2=“insertintoStudentInfovalues(‘12043105’,‘張文婷','120431',0,'計算機(jī)')";Stringsql3="insertintoStudentInfovalues('12043106','嚴(yán)格強(qiáng)','120431',1,'計算機(jī)')";Stringsql="select*fromStudentInfowhereclass='120431'";try{ //加載驅(qū)動Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);con=DriverManager.getConnection(url,user,pwd);stat=con.createStatement();//建立數(shù)據(jù)庫連接;stat.executeUpdate(sql1);stat.executeUpdate(sql2);stat.executeUpdate(sql3);//插入數(shù)據(jù);【例10-5】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中追加三名學(xué)生,然后查看結(jié)果。rs=stat.executeQuery(sql); //查詢信息; while(rs.next()){//打印學(xué)生;System.out.print("學(xué)號:"+rs.getString("stuid")+"");System.out.println(“姓名:”+rs.getString(“name”));}}catch(Exceptione1){ e1.printStackTrace();}finally{ try{con.close();}//關(guān)閉數(shù)據(jù)庫連接; catch(Exceptione2){ e2.printStackTrace();}}}}【例10-5】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中追加三名學(xué)生,然后查看結(jié)果。ResultSet表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。ResultSet用來暫時存放數(shù)據(jù)庫查詢操作獲得的結(jié)果。它包含了符合SQL語句中條件的所有行,并且提供了一套get()方法對這些行中的數(shù)據(jù)進(jìn)行訪問。ResultSet對象具有指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。最初,光標(biāo)被置于第一行之前。next()方法將光標(biāo)移動到下一行,因為該方法在ResultSet對象沒有下一行時返回false,所以可以在while循環(huán)中使用它來迭代結(jié)果集。ResultSet對象默認(rèn)不可更新,僅有一個向前移動的光標(biāo)。因此,只能對它迭代一次,并且只能按從第一行到最后一行的順序進(jìn)行。為了方便操作,可以生成可滾動和/或可更新的ResultSet對象。10.2.3ResultSet接口類可以用以下兩種方式使用更新方法。(1)更新當(dāng)前行中的列值。在可滾動的ResultSet對象中,可以向前和向后移動光標(biāo),將其置于絕對位置或相對于當(dāng)前行的位置。以下代碼片段更新ResultSet對象rs第五行中的NAME列,然后使用updateRow()方法更新導(dǎo)出rs的數(shù)據(jù)源表。rs.absolute(5);rs.updateString("NAME","AINSWORTH");rs.updateRow();10.2.3ResultSet接口類(2)將列值插入新插入行可更新的ResultSet對象具有一個與其關(guān)聯(lián)的特殊行,該行用作構(gòu)建要插入的行的暫存區(qū)域。以下代碼片段將光標(biāo)移動到插入行,構(gòu)建一個3列的行,并使用insertRow()方法將其插入rs和數(shù)據(jù)源表中。rs.moveToInsertRow();rs.updateString(1,"AINSWORTH");rs.updateInt(2,35);//更新第二個字段的值為35rs.updateBoolean(3,true);//更新第三個字段的值為truers.insertRow();//插入行rs.moveToCurrentRow();//移動光標(biāo)至當(dāng)前行當(dāng)生成ResultSet對象的Statement對象關(guān)閉、重新執(zhí)行或用來從多個結(jié)果的序列中獲取下一個結(jié)果時,ResultSet對象將自動關(guān)閉。10.2.3ResultSet接口類ResultSet接口類的常用方法ResultSet接口類的常用方法importjava.sql.*;//導(dǎo)入數(shù)據(jù)庫包;publicclassExample10_5{ publicstaticvoidmain(Stringargs[]){ Connectioncon=null; Statementstat=null;//聲明數(shù)據(jù)庫連接時用到的對象;
ResultSetrs=null; Stringuser="sa";//數(shù)據(jù)庫用戶名;
Stringpwd="111111";//數(shù)據(jù)庫連接密碼;
Stringurl;url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Student";Stringsql="select*fromStudentInfowhereclass='120431'";try{【例10-6】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中查詢學(xué)生,然后查看從第3條以后的結(jié)果。Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");con=DriverManager.getConnection(url,user,pwd);stat=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);//創(chuàng)建可以編輯Statment;
rs=stat.executeQuery(sql);//傳遞SQL語句; System.out.println("所有的學(xué)生記錄是:");while(rs.next()){//打印學(xué)生信息; System.out.print("學(xué)號:"+rs.getString("stuid")+""); System.out.println("姓名:"+rs.getString("name"));}rs.absolute(2);//將光標(biāo)移動到rs結(jié)果集的第2行;System.out.println("從第三行開始的學(xué)生記錄是:");【例10-6】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中查詢學(xué)生,然后查看從第3條以后的結(jié)果。while(rs.next()){//光標(biāo)下移一行;
System.out.print("學(xué)號:"+rs.getString("stuid")+"");System.out.println("姓名:"+rs.getString("name")); } }catch(Exceptione1)e1.printStackTrace(); }finally{ try{con.close();}catch(SQLExceptione2){ e2.printStackTrace();}}}}【例10-6】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中查詢學(xué)生,然后查看從第3條以后的結(jié)果。PreparedStatement接口類繼承了Statement接口類,該接口類可以傳遞經(jīng)過預(yù)編譯的SQL語句,因此可以獲得更高的執(zhí)行效率。在PreparedStatement語句中可以包含多個用“?”代表的字段,在程序中可以利用setXXX()方法設(shè)置該字段的內(nèi)容,從而增強(qiáng)程序設(shè)計的動態(tài)性。PreparedStatement與Statement的區(qū)別在于,它構(gòu)造的SQL語句不是完整的語句,需要在程序中進(jìn)行動態(tài)設(shè)置。一方面,這增強(qiáng)了程序設(shè)計的靈活性;另一方面,由于PreparedStatement語句是經(jīng)過預(yù)編譯的,所以它構(gòu)造的SQL語句的執(zhí)行效率比較高。因此,對于某些使用頻繁的SQL語句,用PreparedStatement比用Statement具有明顯的優(yōu)勢。10.2.4PreparedStatement接口類PreparedStatement接口類的主要成員方法importjava.sql.*;//導(dǎo)入數(shù)據(jù)庫包;publicclassExample10_6{ publicstaticvoidmain(Stringargs[]){ Connectioncon=null; PreparedStatementstat=null;//數(shù)據(jù)庫連接時的對象;
ResultSetrs=null; Stringuser="sa";//數(shù)據(jù)庫用戶名;
Stringpwd="111111";//數(shù)據(jù)庫連接密碼;
Stringurl; url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Student";Stringsql="select*fromStudentInfowhereclass=?andsex=?";try{ //加載驅(qū)動 【例10-7】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中查詢“120431”班的男同學(xué),然后查看結(jié)果。Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");con=DriverManager.getConnection(url,user,pwd);stat=con.prepareStatement(sql);//建立數(shù)據(jù)庫連接;stat.setString(1,"120431");//設(shè)置第一個參數(shù)的值;stat.setInt(2,1);//設(shè)置第二個參數(shù)的值為1,代表男生;
rs=stat.executeQuery(); while(rs.next()){//打印學(xué)生信息;
System.out.print("學(xué)號:"+rs.getString("stuid")+""); System.out.println("姓名:"+rs.getString("name"));}}catch(Exceptione){ //需要捕獲異常; System.out.println(e.toString()); }【例10-7】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中查詢“120431”班的男同學(xué),然后查看結(jié)果。}catch(Exceptione){ //需要捕獲異常; System.out.println(e.toString()); }finally{ try{con.close();}//關(guān)閉數(shù)據(jù)庫;
catch(SQLExceptione2){ e2.printStackTrace();}}}} //加載驅(qū)動 【例10-7】連接SQLServer數(shù)據(jù)庫Student,在學(xué)生信息表中查詢“120431”班的男同學(xué),然后查看結(jié)果。1.任務(wù)當(dāng)用戶進(jìn)入10.2.3案例中的應(yīng)用程序后,完成到數(shù)據(jù)庫表中查詢學(xué)生信息的功能。輸入學(xué)號或姓名,在表StudentInfo表中查詢該學(xué)生是否存在。如果存在,在界面中顯示該學(xué)生的信息。否則,提示“沒有該學(xué)生的信息”。2.目的根據(jù)指定信息,在數(shù)據(jù)庫中查找符合條件的數(shù)據(jù)顯示出來。3.設(shè)計思路在圖形用戶界面中接收用戶輸入的學(xué)生學(xué)號或姓名,存入變量userid和username中。判斷是否輸入了學(xué)號和姓名,如果只輸入一項,查詢時滿足一個查詢條件即可,如果同時輸入兩項,則要求查詢時兩個條件均要滿足。將得到的結(jié)果集顯示出來?!纠?0-8】案例描述4.遇到問題如何判斷在用戶界面上輸入的查詢條件?查詢出來的結(jié)果集怎樣顯示?查詢語句怎樣寫?涉及到多少類文件?【解決問題1】獲取文本框中數(shù)據(jù)去掉空格后長度大于0,表示該文本框用戶輸入了數(shù)據(jù)?!窘鉀Q問題2】rs.next()方法繼續(xù)提取結(jié)果集中的數(shù)據(jù)【例10-8】案例描述1.任務(wù)當(dāng)用戶進(jìn)入10.2.3案例中的應(yīng)用程序后,完成到數(shù)據(jù)庫表中查詢學(xué)生信息的功能。輸入學(xué)號或姓名,在表StudentInfo表中查詢該學(xué)生是否存在。如果存在,在界面中顯示該學(xué)生的信息。否則,提示“沒有該學(xué)生的信息”。2.目的根據(jù)指定信息,在數(shù)據(jù)庫中查找符合條件的數(shù)據(jù)顯示出來。3.設(shè)計思路在圖形用戶界面中接收用戶輸入的學(xué)生學(xué)號或姓名,存入變量userid和username中。判斷是否輸入了學(xué)號和姓名,如果只輸入一項,查詢時滿足一個查詢條件即可,如果同時輸入兩項,則要求查詢時兩個條件均要滿足。將得到的結(jié)果集顯示出來?!纠?0-8】案例描述4.遇到問題如何判斷在用戶界面上輸入的查詢條件?查詢出來的結(jié)果集怎樣顯示?查詢語句怎樣寫?涉及到多少類文件?【解決問題1】獲取文本框中數(shù)據(jù)去掉空格后長度大于0,表示該文本框用戶輸入了數(shù)據(jù)。【解決問題2】rs.next()方法繼續(xù)提取結(jié)果集中的數(shù)據(jù)【例10-8】案例描述【解決問題3】sql="select*fromStudentInfowherestudentid=?"。
sql=“select*fromStudentInfowherestudentname=?”。
sql=“select*fromStudentInfowherestudentid=?andstudentname=?”。使用PreparedStatement對象【解決問題4】
用戶登錄界面UserLogGUI.java
主界面類文件MainGUI.java
連接數(shù)據(jù)庫類文件DBconnect.java
查詢界面類文件SelectInfoGUI。【例10-8】案例描述【例10-8】案例描述選擇查詢信息功能查詢學(xué)生信息界面查詢學(xué)號結(jié)果查詢姓名結(jié)果鍵盤俠是一個網(wǎng)絡(luò)詞語,指部分在現(xiàn)實生活中膽小怕事,而在網(wǎng)絡(luò)上占據(jù)道德高點發(fā)表“個人正義感”和“個人評論”的人群。真正的“鍵盤俠”,應(yīng)該講究一個“俠”字,鍵盤可以成為兩種不同性格的分割線,但俠氣卻是不容分割的。網(wǎng)絡(luò)中玩轉(zhuǎn)文字,或犀利,或幽默,或溫情,這是俠氣;生活中默默無聞、低調(diào)文靜,但內(nèi)心善良充盈,這也是一種俠氣。我們需要做的,就是保留這種表現(xiàn)不同但實質(zhì)相同的俠客風(fēng)范。課后思考:不參與網(wǎng)絡(luò)暴力,不做“鍵盤俠”。如果程序在運行過程中允許改變程序結(jié)構(gòu)或變量的數(shù)據(jù)類型,就稱這個程序所使用的語言為動態(tài)語言。在IT界,一般認(rèn)為Java不是動態(tài)語言,但是Java有一個動態(tài)機(jī)制,那就是反射。Java的反射機(jī)制主要提供了以下功能(在程序運行時有效)。(1)構(gòu)造任意一個類的對象。(2)獲取任意一個類所具有的成員變量和方法。(3)調(diào)用任意一個對象的方法或?qū)傩浴?4)生成動態(tài)代理10.3反射的使用【例10-9】定義一個接口Person,包含方法display();定義一個Student類,包含普通類Information;定義Example10_9類,實現(xiàn)反射機(jī)制。大數(shù)據(jù)概念正在席卷全球,改變?nèi)藗兊纳罘绞健N⑿?、支付寶、朋友圈,滴水籌,百度地圖等軟件影響著人們的生活方式,而這些都是我們中國人的技術(shù)!科技發(fā)展改變了我們的生活!阿里巴巴在大數(shù)據(jù)方面的領(lǐng)先,使得他們在互聯(lián)網(wǎng)企業(yè)中一直居于領(lǐng)導(dǎo)者地位。而這一切都源于他們對國家的熱愛,對民族的熱愛,源于他們點點滴滴的付出。作為未來幾年后的計算機(jī)專業(yè)從業(yè)者,你打算在大學(xué)階段付出些什么?又期望收獲些什么呢?課后思考:大數(shù)據(jù)時代真的來臨了嗎?在第9章中,服務(wù)器判斷用戶發(fā)送過來的用戶名和密碼是否正確,仍然是判斷固定的用戶,但是現(xiàn)實中的例子是不可能這樣的。因此,我們需要借助數(shù)據(jù)庫來存儲用戶名和密碼,每次用戶登錄,服務(wù)器要到數(shù)據(jù)庫中查找是否存在該用戶,如果用戶名密碼都正確,則向客戶端返回成功信息,否則返回失敗信息。10.4數(shù)據(jù)庫編程案例1.設(shè)計思路①創(chuàng)建mysql數(shù)據(jù)庫qq。②在數(shù)據(jù)庫中添加所有用戶的用戶名和密碼。③在項目中添加mysql數(shù)據(jù)庫的驅(qū)動JAR包。④在服務(wù)器Chat_Server.java,得到客戶端的用戶名和密碼,再到數(shù)據(jù)庫中查詢是否存在該用戶。⑤如果用戶名和密碼都正確,則返回給客戶端成功信息,否則返回失敗信息。⑥其他幾個界面的程序不需要修改。10.4數(shù)據(jù)庫編程案例10.4數(shù)據(jù)庫編程案例2.遇到問題①數(shù)據(jù)庫應(yīng)保存什么。②應(yīng)該如何判斷是否存在該用戶?【解決問題1】數(shù)據(jù)庫需要保存的數(shù)據(jù)根據(jù)項目需求進(jìn)行設(shè)計,在這個網(wǎng)絡(luò)通信工具中,只需要保存用戶登錄時的用戶名和密碼即可。因此,創(chuàng)建數(shù)據(jù)庫qq,在數(shù)據(jù)庫建立用戶登錄表user,該表中保存用戶名和密碼。createdatabaseqq;useqq;createtableuser(usernamechar(20),passwordchar(20));【解決問題2】通過sql語句中的select語句查詢是否存在該用戶。Stringsql=”select*fromuserwhereusername=?andpassword=?”10.4數(shù)據(jù)庫編程案例3.實現(xiàn)過程①建立數(shù)據(jù)庫語句createdatabaseqq;useqq;createtableuser(usernamechar(10),passwordchar(10));insertintouservalues('admin','123456');insertintouservalues('aaa','111');select*fromuser;10.4數(shù)據(jù)庫編程案例② 服務(wù)器端程序Chat_Server.java在run()方法中新增代碼(用加粗字體表示)以完成在數(shù)據(jù)庫驗證:
publicvoidrun(){ try{ //接收用戶名和密碼;
InputStreamis=s.getInputStream(); InputStreamReaderisr=newInputStreamReader(is); BufferedReaderbr=newBufferedReader(isr); Stringname=br.readLine(); Stringpassword=br.readLine(); Stringresult; Conn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年遼寧省七校協(xié)作體高一下學(xué)期3月聯(lián)考語文試題及答案
- 2024-2025學(xué)年河北省保定市高一下學(xué)期開學(xué)考英語試題及答案
- 寵物常見疾病的營養(yǎng)干預(yù)試題及答案
- 堅實基礎(chǔ)的統(tǒng)計學(xué)試題與答案2024
- 2024計算機(jī)基礎(chǔ)考試復(fù)習(xí)計劃試題及答案
- 美容師考試情境模擬與試題答案
- 2024年汽車美容師技能操作評估試題及答案
- 小學(xué)語文拼音試題及答案
- 季節(jié)變化對寵物營養(yǎng)需求的影響分析試題及答案
- 六年級語文行為習(xí)慣培養(yǎng)題試題及答案
- 2025年國家公務(wù)員遴選考試全真模擬試卷及答案(共五套)
- 2024年晉城市城區(qū)城市建設(shè)投資經(jīng)營有限公司招聘考試真題
- 2025江蘇蘇豪控股集團(tuán)招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 社工證筆試題庫及答案
- 7.1影響深遠(yuǎn)的人文精神課件 -2024-2025學(xué)年統(tǒng)編版道德與法治七年級下冊
- 2025年企業(yè)規(guī)章制度試題及答案
- 2025春人教版七年級英語下冊重點知識默寫
- 2025年駐馬店全域礦業(yè)開發(fā)有限公司招聘27人筆試參考題庫附帶答案詳解
- 高考寫作專項突破之核心概念闡釋要訣 課件
- DB32T 5013-2025鎘污染耕地土壤減污修復(fù)黏土礦物-四氧化三鐵-海藻酸鈉基功能材料制備技術(shù)規(guī)程
- 高中語文整本書閱讀教學(xué)研究
評論
0/150
提交評論