版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第11章JDBC數據庫編程計算機科學與技術教研室龔平JDBC概述數據庫的連接數據庫操作應用實例2本章主要內容JDBCTMisaJavaTMAPIforexecutingSQLstatements.(Asapointofinterest,JDBCisatrademarkednameandisnotanacronym;nevertheless,JDBCisoftenthoughtofasstandingfor''JavaDatabaseConnectivity''.)
——摘自/docs/books/jdbc/intro.html11.1JDBC概述在JAVA技術系列中,訪問數據庫的技術叫做JDBC,它提供了一系列的API。JDBCAPI是Java程序語言內針對數據庫開發(fā)提供的編程接口,它由一組類和接口構成,JDBCAPI使得開發(fā)人員可以使用純Java的方式與關系型數據庫進行交互。4JDBCAPI基本功能包括:①指定JDBC驅動程序類型,并建立與指定數據庫的連接。②向數據庫發(fā)送SQL語句并處理返回結果。③獲得所連接數據庫的各種信息,包括驅動程序、數據庫、表、列的屬性等。有了JDBCAPI,就不必為訪問MySQL數據庫專門寫一個程序,為訪問Oracle數據庫又專門寫一個程序,為訪問SQLServer數據庫又寫另一個程序等。只須用JDBCAPI寫一個程序就夠了,它可以向相應數據庫發(fā)送SQL語句。11.1.1JDBC組件JDBC包含了4大組件:JDBCAPI、JDBCDriverManager、JDBCTestSuite、JDBC-ODBCBridge。71)JDBCAPIJDBCAPI提供了Java語言訪問關系數據的程序代碼支持,使用JDBCAPI可以執(zhí)行SQL命令,獲取返回結果和數據庫事務操作。目前的JDBCAPI被分割在了java.sql和javax.sql包下。java.sql基本功能這個包中的類和接口主要針對基本的數據庫編程服務,如生成連接、執(zhí)行語句以及預處理語句和運行批處理查詢等。同時也有一些高級的處理,比如批處理更新、事務隔離和可滾動結果集等。9java.sql常用類和接口DriverManager類DriverConnectionStatementPreparedStatementCallableStatementResultSetResultSetMetaDatajavax.sql擴展功能它主要為數據庫方面的高級操作提供了接口和類。如為連接管理、分布式事務和舊的連接提供了更好的抽象,它引入了容器管理的連接池、分布式事務和行集(RowSet)等。112)JDBC驅動管理器(JDBCDriverManager)JDBC驅動管理器是JDBCAPI定義了能夠通過JDBC連接到數據庫的一系列對象。它與實際連接到數據庫的第三方驅動進行通信,并返回查詢的信息,或是執(zhí)行由該SQL規(guī)定的操作。3)JDBCTestSuiteJDBC驅動程序測試套件幫助程序員確定JDBC驅動程序將運行的程序。4)JDBC-ODBCBridgeJDBC-ODBCBridge使得Java程序通過ODBC橋提供的JDBC驅動程序訪問關系型數據。//JDK8不再提供JDBC-ODBCBridge1211.1.2JDBC架構JDBCAPI通常提供“兩層”和“三層”兩種模型來訪問數據庫:1)兩層模型13在兩層模型中,Java程序直接與數據庫進行對話。這將需要一個JDBC驅動程序來與所訪問的特定數據庫管理系統進行通信。程序中的SQL語句被送往數據庫中,其結果將被返回給程序。2)三層模型14在三層模型中,命令先是被發(fā)送到中間層,然后由中間層將SQL語句發(fā)送給數據庫。數據庫對SQL語句進行處理并將結果返回到中間層,中間層再將結果返回給用戶。Java應用程序進行數據庫開發(fā)一般遵循下列幾個步驟:注冊(加載)JDBC驅動程序;建立到數據庫的連接;創(chuàng)建SQL語句對象;發(fā)送SQL語句;處理返回結果;從數據庫斷開連接;11.2數據庫的連接在連接數據庫前,首先必須下載數據庫對應的JDBC驅動程序。不同的數據庫廠商提供有不同的JDBC驅動。16SQLServerMySQLoracle下載相應的數據庫針對Java的驅動后,(解壓)找到具體的.jar文件,添加到Java項目中。SQLServerMySQL
加載JDBC驅動try{Class.forName(“驅動包.類")}catch(Exceptione){}SQLServer:com.microsoft.sqlserver.jdbc.SQLServerDriverMySQL:com.mysql.jdbc.Driver或org.git.mm.mysql.DriverOracle:oracle.jdbc.driver.OracleDriver結合實際的JAR包來寫建立連接Connection的對象代表與數據庫的連接。一個應用程序可與單個數據庫有一個或多個連接,也可與許多數據庫有連接。在連接的過程中需要用DriverManager類來處理驅動的調入并且對產生新的數據庫連接提供支持。多數情況下,讓DriverManager類管理建立連接的細節(jié)為上策。其中,DriverManager類中的getConnection方法有下邊3種定義:publicstaticConnectiongetConnection(String
url,Properties
info)throwsSQLExceptionpublicstaticConnectiongetConnection(String
url,String
user,String
password)throwsSQLExceptionpublicstaticConnectiongetConnection(String
url)throwsSQLException
如何創(chuàng)建Connection的對象url參數的格式:jdbc:<subprotocol>:<subname>參數url具體寫法:MySQL:jdbc:mysql://localhost:端口/數據庫名Oracle:jdbc:oracle:thin:@主機host:端口號:數據庫名SQLServer:jdbc:sqlserver://localhost:1433;DatabaseName=test24連接SQLServer2005/2008:Stringurl="jdbc:sqlserver://localhost:1433;DatabaseName=test";Connectioncon=DriverManager.getConnection(url,”sa”,”asdf”);操作演示:連接SQLServer11.3數據庫操作利用JDBCAPI對數據庫進行操作(數據查詢、數據新增、數據修改、數據刪除等)。對數據庫的操作主要會涉及到幾個類和接口:Connection、Statement、PreparedStatement、CallableStatement、ResultSet等。26Statement的對象用于將SQL語句發(fā)送到數據庫中。實際上有三種Statement:
StatementPreparedStatement(它從Statement繼承而來)和CallableStatement(它從PreparedStatement繼承而來)創(chuàng)建SQL語句對象做法1通過Connection接口的下列方法創(chuàng)建Statement接口的對象Statement
createStatement()throwsSQLExceptionStatement
createStatement(int
resultSetType,int
resultSetConcurrency)throwsSQLExceptionresultSetType
結果集的方式。值可以?。篟esultSet.TYPE_FORWARD_ONLY
結果集游標只能向前滾動。ResultSet.TYPE_SCROLL_INSENSITIVE
結果集的游標可以上下移動,當數據庫變化時,當前結果集不變。ResultSet.TYPE_SCROLL_SENSITIVE結果集的游標可以上下移動,當數據庫變化時,當前結果集同步改變。resultSetConcurrency
設定當前結果集與數據庫的關系。值可以?。篟esultSet.CONCUR_READ_ONLY
只讀,即不能用結果集更新數據庫中的表。ResultSet.CONCUR_UPDATABLE
可更新的,即可以用結果集更新數據庫中的表。通過Connection接口的下列方法創(chuàng)建PreparedStatement接口的對象PreparedStatement
prepareStatement(String
sql)throwsSQLExceptionPreparedStatement
prepareStatement(String
sql,int
resultSetType,int
resultSetConcurrency)throwsSQLExceptionCallableStatement
prepareCall(String
sql)throwsSQLException創(chuàng)建SQL語句對象做法2使用Statement接口提供的方法:ResultSet
executeQuery(String
sql)throwsSQLExceptionint
executeUpdate(String
sql)throwsSQLExceptionboolean
execute(String
sql)throwsSQLException代碼清單11-2發(fā)送SQL命令做法1使用PreparedStatement提供的方法ResultSetexecuteQuery()intexecuteUpdate()booleanexecute()31代碼清單11-3發(fā)送SQL命令做法2當向數據庫發(fā)送一個SQL語句,數據庫中的SQL解釋器負責把SQL語句生成底層的內部命令,然后執(zhí)行。如果不斷的發(fā)送SQL語句,勢必增加數據庫中SQL解釋器的負擔,影響執(zhí)行的速度。能不能事先就將SQL語句解釋為底層的內部命令,然后再發(fā)送到數據庫直接執(zhí)行呢?
PreparedStatement接口答案是肯定的。Java提供了更高效率的數據庫操作機制,就是PreparedStatement接口,它的對象被習慣地稱作預處理語句對象。
在對SQL進行預處理時,可以使用通配符“?”來代替字段的值,并在預處理語句執(zhí)行之前對通配符所表示的內容進行具體值的設定。如:
PreparedStatementpre=con.prepareStatement(“select*fromscorewheremaths<?”);pre.setInt(1,60);//1表示出現的第一個通配符
預處理設置通配符值的常用方法:voidsetDate(intindex,Datex)voidsetDouble(intindex,doublex)voidsetFloat(intindex,floatx)voidsetInt(intindex,intx)voidsetLong(intindex,longx)voidsetString(intindex,Stringx)預處理語句具有兩個主要的優(yōu)點:只需要被解析(或準備)一次,可以使用相同或不同的參數(針對通配符?)執(zhí)行多次。傳給預處理語句的參數不需要使用引號,底層驅動會處理這個。11.3.6數據庫SQL操作數據庫基本操作包括查詢、刪除、插入、更新等,主要涉及Statement接口、PreparedStatement接口、ResultSet接口等的操作。37(1)數據查詢數據查詢分為一般查詢、帶參數的查詢,一般查詢使用Statement接口,帶參數的查詢使用PreparedStatement接口。例如:一般查詢:Stringsql="SELECT*FROMt_userWHEREage>20";帶參數的查詢:Stringsql="SELECT*FROMt_userWHEREage>?";條件查詢select字段列表/*from表名where條件排序查詢select字段列表/*from表名orderby字段asc/desc模糊查詢select字段列表/*from表名where字段like‘%xxx%’統計查詢selectcount(字段/*)from表名等等。具體請參照SQL命令。向數據庫發(fā)送查詢命令,返回查詢結果集Statementst=con.createStatement();ResultSetrs=st.executeQuery(sql);或者,PreparedStatementps=con.createStatement(sql);ResultSetrs=ps.executeQuery();ResultSet的對象所包含的結果集中往往有多條記錄,形式如下圖所示:Stringsql="selectuserID,usrname,age,genderfromt_userwheregender='女'";ResultSetrs=st.executeQuery(sql);booleanabsolute(int
row)booleanfirst()booleanlast()booleanrelative(int
rows)booleanprevious()booleannext()intgetInt(String
columnName)intgetInt(int
columnIndex)StringgetString(int
columnIndex)StringgetString(String
columnName)ResultSet接口常用的方法如何處理查詢的返回結果?
處理返回結果——查詢
a.獲取結果集中的列名、類型ResultMetaDatarsmd=rs.getMetaData();intcc=rsmd.getColumnCount();for(inti=1;i<=cc;i++)System.out.println(rsmd.getColumnName(i)+””+rsmd.getColumnTypeName(i));b.對結果集中的數據進行輸出while(rs.next()){id=rs.getInt(1);name=rs.getString(2);account=rs.getString(3);password=rs.getString(4);System.out.println(id+””+name+””+account+””+password);}最初游標的位置在第1條記錄之前。默認情況下,只能對結果集執(zhí)行讀操作,不允許更改結果集的內容。查詢結果集通常會含有多條記錄,可以通過循環(huán)逐行操作,如下所示:默認情況下,游標只能“從前往后”移動。方向性:Forward1→2→3→4→…執(zhí)行rs.next()執(zhí)行rs.next()記錄非空,返回true記錄非空,返回true執(zhí)行rs.next()記錄為空,返回false值得注意的是,即使在創(chuàng)建Statement或PreparedStatement時把參數設置為游標可滾動的和結果集可更新,實際得到的結果集仍然有可能不允許滾動或更新。有以下兩方面的原因:底層JDBC驅動器有可能不支持可滾動或可更新。某些查詢語句的結果集不允許更新。例如,JDBC規(guī)范規(guī)定,只有對一張表查詢,并且查詢字段包含表中的主鍵,這樣的查詢語句的結果集才能夠被更新。補充演示案例:查詢(2)數據插入數據插入可以有兩種方法,一種是通過發(fā)送SQL方式進行插入,另外一種就是通過結果集進行插入。1)發(fā)送SQL方式進行插入在SQL語句中使用insert語句,并通過Statement的executeUpdate方法發(fā)送SQL語句實現插入,如:Stringsql="INSERTINTOcustomer(cName,cAge,cAddress,cEmail)values('MikeJoden',45,'NewYorkThreeStreet','mjoden@135.net')";st.executeUpdate(sql);51也可使用PreparedStatement的executeUpdate方法實現,如:StringsqlStr="insertintoAdmin(name,account,password,role_type)values(?,?,?,?)";PreparedStatementps=con.prepareStatement(sqlStr);ps.setString(1,"fang");ps.setString(2,"lucy");ps.setString(3,"lucy");ps.setInt(4,0);intcount=ps.executeUpdate();if(count>0){//處理返回結果System.out.println("插入成功");}52(3)數據更改數據更改即記錄的更改,有兩種方式:發(fā)送SQL方式和ResultSet結果集方式。1)發(fā)送SQL方式更改在sql語句中使用update語句,并通過Statement中的executeUpdate方法實現插入,如:st.executeUpdate(“updateAdminsetname=’wf’whereid=7");53或者使用PreparedStatement通過帶參數的sql語句進行更改,如:StringsqlStr="updateAdminsetname=?whereid=?";PreparedStatementps=con.prepareStatement(sqlStr);ps.setString(1,"wf");ps.setInt(2,"7");intcount=ps.executeUpdate();if(count>0){//處理返回結果System.out.println("更新成功");}54(4)數據刪除數據刪除即對數據表中的某些記錄進行刪除,同樣它有兩種方式操作,發(fā)送SQL方式和結果集方式1)發(fā)送SQL方式方式刪除在sql語句中使用delete語句,并通過Statement中的executeUpdate方法實現刪除,如:st.executeUpdate(“deletefromAdminwherename=’wf’);55或者使用PreparedStatement通過帶參數的sql語句進行更改,如:StringsqlStr="deletefromAdminwherename=?";PreparedStatementps=con.prepareStatement(sqlStr);ps.setString(1,"wf");intcount=ps.executeUpdate();if(count>0){System.out.println("刪除成功");}56
從數據庫斷開連接try{…}catch(Exceptione){}finally{
try{
if(con!=null)con.close();}catch(Exceptionee){}}加載驅動程序Class.forName(…);創(chuàng)建數據庫連接對象Connectioncon=xxx.getConnection(…);創(chuàng)建Statement對象Statementst=con.createStatement();向數據庫發(fā)送SQL命令Stringsql=“select……”;//查詢ResultSetrs=st.executeQuery(sql);Stringsql=“delete……”;//增刪改intn=st.executeUpdate(sql);處理返回結果(1)查詢,處理rs
(2)增刪改,處理n關閉與數據庫的連接con.close();11.4應用實例59數據庫名info,t_user表如下:通過ResultSet的對象插入、刪除、修改數據課后自習voidmoveToInsertRow()throwsSQLException
voidupdateInt(intcolumnIndex,intx)throwsSQLExceptionvoidupdateInt(StringcolumnLabel,intx)throwsSQLExceptionvoidupdateString(intcolumnIndex,Stringx)throwsSQLExceptionvoidupdateString(StringcolumnLabel,Stringx)throwsSQLExceptionvoidupdateRow()throwsSQLExceptionvoiddeleteRow()throwsSQLExceptionvoidinsertRow()throwsSQLExceptionResultSet接口常用的方法1.數據插入當通過Statement對象或者是PreparedStatement對象使用select的sql語句獲得了結果集之后,就可以利用現有的結果集進行插入操作。具體做法:rs.absolute(n);//先定位”游標”到某行的位置,或省略直接利用當前行rs.moveToInsertRow();//將這個位置作為插入行的位置rs.updateXXX(…,…);//對“不允許為空”的列賦值,如rs.updateString(2,”曬太陽的貓”);rs.updateXXX(…,…);//對“不允許為空”的列賦值,如rs.updateInt(3,22);……rs.insertRow();//執(zhí)行插入行操作67代碼清單11-4結果集更新在創(chuàng)建Statement對象或者是PreparedStatement對象的時候必須指明結果集可更新,否則會報出異常。得到一個結果集之后,可以將游標移動到制定的行,然后使用updateXXX()方法更新該列的數據,最后使用updateRow()提交更新的數據,同步更改數據庫。68代碼清單11-52.數據修改首先根據sqlStr查詢條件獲得ResultSet對象,然后將游標移到對應行,最后執(zhí)行deleteRow()方法,即可實現數據的刪除。StringsqlStr="select*fromAdminwhereid=6";PreparedStatementps=con.prepareStatement(sqlStr,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrs=ps.executeQuery();rs.next();rs.deleteRow();con.close();693.數據刪除對數據表的操作(創(chuàng)建表、刪除表、增加表中的列、刪除表中的列)課后自習常常在程序中也需要對數據庫或者是數據表進行操作,如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學五年級上冊語文期末復習-看拼音寫詞語A4版
- 實驗室安全檢查與值日值班制度
- 關于加強學校后勤保障與管理工作的實施方案
- 2023年山東聊城江北水城旅游度假區(qū)招聘衛(wèi)生系統事業(yè)單位人員招聘考試真題
- 2023年海南省安寧醫(yī)院招聘事業(yè)編制人員考試真題
- 2023年湖州長興文旅集團招聘筆試真題
- 廠房工程通風空調施工方案
- 2024廠房租賃合同書【閑置廠房租賃合同書】
- 2024個人抵押的借款合同范本「下載」
- 2024施工合同(正本)
- 《信息通信網絡線務員》(綜合布線裝維員)理論考試題庫大全-下(簡答題)
- JGJ80-2016 建筑施工高處作業(yè)安全技術規(guī)范
- 構建水利安全生產風險管控六項機制工作指導手冊2023版
- 工貿企業(yè)治本攻堅三年行動方案
- 2.1 充分發(fā)揮市場在資源配置中的決定性作用 課件-高中政治統編版必修二經濟與社會
- 山東省淄博市臨淄區(qū)2022-2023學年六年級上學期期中英語試卷
- 2024年中核武漢核電運行技術股份有限公司招聘筆試參考題庫含答案解析
- 中醫(yī)針灸培訓資料課件
- 水利設施工程工期定額
- 高三化學一輪復習元素綜合推斷之結構式題型課件
- 藍光BL6-U系列模塊一體化控制器使用說明書V1.17(新國標版)
評論
0/150
提交評論