版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章
在JSP中使用數(shù)據(jù)庫(kù)61、深入理解JDBC的工作原理2、掌握使用java數(shù)據(jù)庫(kù)驅(qū)動(dòng)連接數(shù)據(jù)庫(kù)的基本步驟3、掌握J(rèn)DBC數(shù)據(jù)庫(kù)的查詢、更新操作4、會(huì)在JSP頁(yè)面中靈活使用數(shù)據(jù)庫(kù)5、了解JDBC-ODBC橋接器數(shù)據(jù)庫(kù)連接方式6、了解預(yù)處理語(yǔ)句和通配符課程目標(biāo)
☆1、JDBC介紹概念工作原理2、連接數(shù)據(jù)庫(kù)的常用方式使用Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)JDBC-ODBC橋接器3、JDBC查詢操作順序查詢隨機(jī)查詢4、JDBC更新、添加與刪除操作5、預(yù)處理語(yǔ)句和通配符內(nèi)容提要6.1JDBC介紹1、什么是JDBC
JDBC(JavaDataBaseConnectivity),SUN公司為Java程序提供的訪問(wèn)各種數(shù)據(jù)庫(kù)的API,它由一些Java類和接口組成。2、JSP與JDBCJSP頁(yè)面<%…%>Java程序片,使用java語(yǔ)法連接數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)返回結(jié)果建立連接、發(fā)送SQL語(yǔ)句3.JDBC的基本原理早期數(shù)據(jù)庫(kù)開(kāi)發(fā)模式6.1JDBC介紹編程語(yǔ)言O(shè)racleSybaseSQLServerMySQLAPIforOracleAPIforSybaseAPIforSQLServerAPIforMySQL使用使用使用使用操作操作操作操作各種數(shù)據(jù)庫(kù)1、程序員操作不便2、產(chǎn)品維護(hù)成本增加3.JDBC的基本原理JDBC開(kāi)發(fā)數(shù)據(jù)庫(kù)模式6.1JDBC介紹各種數(shù)據(jù)庫(kù)OracleSybaseSQLServerMySQLAPIforOracleAPIforSybaseAPIforSQLServerAPIforMySQLJDBC接口由各個(gè)數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn)
接口1……接口2接口3接口4編程語(yǔ)言統(tǒng)一接口1、純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序使用java語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(數(shù)據(jù)庫(kù)廠商完成)。JDBC提供的API將Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)轉(zhuǎn)換為數(shù)據(jù)庫(kù)系統(tǒng)所使用的專門(mén)協(xié)議來(lái)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)交互2、JDBC-ODBC橋接器應(yīng)用程序建立“JDBC-ODBC”之間的連接,即“橋接器”,和數(shù)據(jù)庫(kù)的連接由ODBC(OpenDatabaseConnectivity)去完成。6.2JDBC連接數(shù)據(jù)庫(kù)的常用方式
JDBC調(diào)用Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序充分利用ODBC的優(yōu)勢(shì)JDBC-ODBC1、純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序6.2JDBC連接數(shù)據(jù)庫(kù)的常用方式應(yīng)用程序JDBCOracle驅(qū)動(dòng)SQLServer驅(qū)動(dòng)MySQL驅(qū)動(dòng)其他驅(qū)動(dòng)Oracle數(shù)據(jù)庫(kù)SQLServerMySQL數(shù)據(jù)庫(kù)其他數(shù)據(jù)庫(kù)使用加載連接連接連接連接使用JDBC的應(yīng)用程序所駐留的計(jì)算機(jī)1、純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序JDBC1)位置:位于JDK的安裝目錄下2)內(nèi)容接口:Driver、Connection、Statement
ResultSet類:DriverManager6.2JDBC連接數(shù)據(jù)庫(kù)的常用方式C:\ProgramFiles\Java\jdk1.6.0_02\jre\lib\rt.jarimportjava.sql.*1、純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序JDBC6.2JDBC連接數(shù)據(jù)庫(kù)的常用方式名稱解釋Driver驅(qū)動(dòng)程序接口,被數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn),加載后才能連接數(shù)據(jù)庫(kù)DrvierManager(類)處理驅(qū)動(dòng)的調(diào)入,并且產(chǎn)生新的數(shù)據(jù)庫(kù)連接Connection代表對(duì)特定數(shù)據(jù)庫(kù)的連接Statement用于發(fā)送SQL語(yǔ)句,接收SQL的執(zhí)行結(jié)果ResultSet執(zhí)行查詢語(yǔ)句得到的結(jié)果集使用順序自上而下1、純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序數(shù)據(jù)庫(kù)驅(qū)動(dòng)(SQLServer2005)1)位置需要開(kāi)發(fā)者下載,并配置項(xiàng)目根目錄\WebRoot\WEB-INF\lib2)內(nèi)容(對(duì)JDBC底層接口的實(shí)現(xiàn)類)6.2JDBC連接數(shù)據(jù)庫(kù)的常用方式1、JDBC準(zhǔn)備工作1)下載JDBC數(shù)據(jù)庫(kù)驅(qū)動(dòng)(驅(qū)動(dòng)由相應(yīng)的數(shù)據(jù)庫(kù)廠商來(lái)提供)
例如:SQLServer2005——sqljdbc.jar
com.microsoft.sqlserver.jdbc.SQLServerDriver2)配置JDBC數(shù)據(jù)庫(kù)驅(qū)動(dòng)將sqljdbc.jar文件拷貝到MyEclipse中的web項(xiàng)目的目錄\WebRoot\WEB-INF\lib下(驅(qū)動(dòng)文件隨項(xiàng)目一起部署,較為規(guī)范)6.3使用JDBC連接數(shù)據(jù)庫(kù)2、JDBC編程步驟步驟1:在程序中加載驅(qū)動(dòng)驅(qū)動(dòng)程序類:com.microsoft.sqlserver.jdbc.SQLServerDriver加載方法:Class.forName(驅(qū)動(dòng)程序類)6.3使用JDBC連接數(shù)據(jù)庫(kù)try{
}catch(ClassNotFoundExceptione){System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載錯(cuò)誤");}Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");注意:Class是包java.lang中的一個(gè)類,該類調(diào)用靜態(tài)方法forName可以加載驅(qū)動(dòng),該方法拋ClassNotFoundException異常,因此需要捕獲異常2、JDBC編程步驟步驟2:創(chuàng)建連接對(duì)象(連接數(shù)據(jù)庫(kù))使用DriverManager類的方法getConnection創(chuàng)建連接對(duì)象格式:Connectionconn=DriverManager.getConnection(String
uri,Stringuser,Stringpassword)參數(shù)說(shuō)明:uri:要連接的數(shù)據(jù)庫(kù)的路徑,根據(jù)數(shù)據(jù)庫(kù)不同變化user:登錄數(shù)據(jù)庫(kù)的用戶名password:登錄數(shù)據(jù)庫(kù)的密碼注意:該方法會(huì)拋出SQLException(SQL異常)6.3使用JDBC連接數(shù)據(jù)庫(kù)步驟2:創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象6.3使用JDBC連接數(shù)據(jù)庫(kù)Stringuri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=school";Stringuser="sa";Stringpassword="sa";try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Connectionconn=DriverManager.getConnection(uri,user,password);}catch(ClassNotFoundExceptione){System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載錯(cuò)誤");}catch(SQLExceptione){System.out.println("獲取連接錯(cuò)誤");}if(conn!=null)System.out.println("數(shù)據(jù)庫(kù)連接成功");數(shù)據(jù)庫(kù)名服務(wù)器ip如果得到空對(duì)象說(shuō)明連接失敗2、JDBC編程步驟步驟3:發(fā)送SQL語(yǔ)句到數(shù)據(jù)庫(kù)1)創(chuàng)建Statement
作用:Statement對(duì)象用于將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中格式:Statementstmt=conn.CreateSatement()2)執(zhí)行SQL語(yǔ)句(調(diào)用Statement的方法)查詢方法:publicResultSetexecuteQuery(Stringsql)throwsSQLException更新方法:publicintexecuteUpdate(Stringsql)throwsSQLException6.3使用JDBC連接數(shù)據(jù)庫(kù)添加、修改、刪除2、JDBC編程步驟步驟3:發(fā)送SQL語(yǔ)句到數(shù)據(jù)庫(kù)(例:查詢)6.3使用JDBC連接數(shù)據(jù)庫(kù)try{……Stringsql="select*fromstudent";Statetmentstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);……}catch(……){……}SQL語(yǔ)句語(yǔ)句對(duì)象執(zhí)行SQL說(shuō)明:此步驟得到的結(jié)果存儲(chǔ)在rs結(jié)果集合中,下一步要遍歷結(jié)果集取出數(shù)據(jù)來(lái)應(yīng)用2、JDBC編程步驟步驟4:遍歷展示結(jié)果集1)遍歷行:ResultSet對(duì)象的next()方法——rs.next()2)遍歷列:通過(guò)ResultSet對(duì)象的getXXX()方法遍歷行中的列p1356.3使用JDBC連接數(shù)據(jù)庫(kù)游標(biāo)游標(biāo)游標(biāo)游標(biāo)返回類型方法名稱(根據(jù)字段名稱)返回類型方法名稱(根據(jù)字段的索引)intgetInt(StringFieldName)intgetInt(intcolunIndex)floatgetFloat(StringFieldName)floatgetFloat(intcolunIndex)dategetDate(StringFieldName)dategetDate(intcolunIndex)stringgetString(StringFieldName)stringgetString(intcolunIndex)Stringsql="select*fromstudent";Statetmentstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);while(rs.next()){ out.print(rs.getString("id")); out.print(rs.getString("name")); out.print(rs.getInt("gender")); out.print(rs.getInt("age")); out.print(rs.getInt(“class"));out.print("<br/>");}注意:此時(shí)游標(biāo)停留在當(dāng)前結(jié)果集的第一行的前面注意:此時(shí)游標(biāo)停留在第一行輸出結(jié)果:在jsp頁(yè)面中逐行打印出結(jié)果集中的記錄2、JDBC編程步驟步驟5:關(guān)閉數(shù)據(jù)庫(kù)連接1)rs.close()關(guān)閉結(jié)果集2)stmt.close()關(guān)閉statement對(duì)象3)conn.close()關(guān)閉Connection對(duì)象6.3使用JDBC連接數(shù)據(jù)庫(kù)注意:關(guān)閉數(shù)據(jù)庫(kù)連接的順序2、JDBC編程步驟(總結(jié))6.3使用JDBC連接數(shù)據(jù)庫(kù)加載驅(qū)動(dòng)連接數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句處理返回結(jié)果關(guān)閉資源Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Stringuri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=school";Connectionconn=DriverManager.getConnection(uri,user,password);Statementstmt=conn.CreateSatement();ResultSetrs=stmt.executeQuery(sql);rs.close();stmt.close();conn.close();while(rs.next()){ out.print(rs.getString("id")); ……}總結(jié)2:JDBCAPI中重要的接口和類這幾個(gè)常用的類和接口都位于包java.sql中,接口的實(shí)現(xiàn)類為于com.microsoft.sqlserver.jdbc中6.3使用JDBC連接數(shù)據(jù)庫(kù)名稱解釋Driver驅(qū)動(dòng)程序接口被數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn),加載后才能連接數(shù)據(jù)庫(kù)DrvierManager(類)處理驅(qū)動(dòng)的調(diào)入并且對(duì)產(chǎn)生新的數(shù)據(jù)庫(kù)連接Connection代表對(duì)特定數(shù)據(jù)庫(kù)的連接Statement用于發(fā)送Sql語(yǔ)句,并接收Sql的執(zhí)行結(jié)果ResultSet執(zhí)行查詢語(yǔ)句得到的結(jié)果集6.3使用JDBC連接數(shù)據(jù)庫(kù)擴(kuò)展:將數(shù)據(jù)庫(kù)操作封裝為一個(gè)java類,提高可重用性第一步:新建類DBManager.java第二步:導(dǎo)包操作第三步:編寫(xiě)類代碼public
classDBManager{1、定義變量2、獲取連接方法getConnection3、執(zhí)行查詢方法executeQuery4、釋放資源的方法releaseSource}6.3使用JDBC連接數(shù)據(jù)庫(kù)1、定義變量privateConnectionconn=null;privateStatementstmt=null;privateResultSetrs=null;privateStringuri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=exam3";privateStringuser="sa";privateStringpassword="123456";6.3使用JDBC連接數(shù)據(jù)庫(kù)編寫(xiě)獲取數(shù)據(jù)庫(kù)連接對(duì)象的方法publicConnectiongetConnection(){try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");conn=DriverManager.getConnection(uri,user,password);if(conn!=null){System.out.println("數(shù)據(jù)庫(kù)鏈接獲取成功");}}catch(ClassNotFoundExceptione){System.out.println("驅(qū)動(dòng)程序加載異常");}catch(SQLExceptione){System.out.println("獲取連接異常");e.printStackTrace();//打印堆棧跟蹤}return
conn;}6.3使用JDBC連接數(shù)據(jù)庫(kù)編寫(xiě)獲取查詢結(jié)果集的方法publicResultSetexecuteQuery(Stringsql){try{stmt=conn.createStatement();rs=stmt.executeQuery(sql);}catch(SQLExceptione){System.out.println("SQL執(zhí)行錯(cuò)誤");e.printStackTrace();//打印堆棧跟蹤}return
rs;}6.3使用JDBC連接數(shù)據(jù)庫(kù)編寫(xiě)釋放數(shù)據(jù)庫(kù)資源的方法public
voidreleaseSource(){try{if(rs!=null)rs.close();if(stmt!=null)stmt.close();if(conn!=null)conn.close();}catch(SQLExceptione){e.printStackTrace();}}順序查詢簡(jiǎn)單查詢select*fromstudent條件查詢select*fromstudentwhereage=23select*fromstudentwhereagebetween23and40排序查詢select*fromstudentorderbyjspscore
select*fromstudentorderby
jspscore
ascselect*fromstudentorderby
jspscore
desc
6.4JDBC數(shù)據(jù)庫(kù)查詢模糊查詢select*fromstudentwherenamelike
‘張%’張、張三、張曉曉……select*fromstudentwherenamelike
‘張_’張三、張曉……select*fromstudentwherenamelike
‘%小%’張小青、王小紅、李小麗……練習(xí)寫(xiě)出SQL語(yǔ)句查詢t1表中content字段包含“java”,并且倒數(shù)第2個(gè)字符為‘E’的記錄select*fromt1wherecontentlike
‘%java%E_’6.4JDBC數(shù)據(jù)庫(kù)查詢學(xué)生練習(xí)時(shí)間。。。。6.4JDBC數(shù)據(jù)庫(kù)查詢DBManager:executeQueryquery1.jsp(簡(jiǎn)單查詢)條件查詢模糊查詢排序查詢6.4JDBC數(shù)據(jù)庫(kù)查詢綜合練習(xí)1條件查詢Statement對(duì)象調(diào)用方法:publicint
executeUpdate(String
sqlStatement);返回的是影響的行數(shù),若返回0,則說(shuō)明更新操作失敗SQL語(yǔ)句添加記錄insertinsertintotestvalues(‘zhangsan’,23)insertintotest(name)values(‘lisi’)修改記錄updateupdatetestsetage=40wherename='zhangsan‘刪除記錄deletedeletefromtestwherename='zhangsan'6.5更新、添加與刪除
SQL語(yǔ)句注意:字符串拼接技巧6.5更新、添加與刪除以插入記錄的SQL為例,插入記錄操作時(shí),變量var中存儲(chǔ)著字段的值,首先:寫(xiě)好insertintostudentvalues()
然后(1)見(jiàn)到字符串類型的字段,sql中就拼’”+var+”’,(2)見(jiàn)到數(shù)據(jù)類型的字段,sql中就拼”+var+”最后形成:insertintostudentvalues('"+id+"','"+name+"',"+age+","+jspscore+");案例:insert1.jspinsert1Handle.jsp6.5更新、添加與刪除綜合練習(xí)2添加記錄6.5更新、添加與刪除綜合練習(xí)3更新記錄(刪除和修改)result.jsp結(jié)果展示頁(yè)面updateForm.jsp表單1、參數(shù)2、修改數(shù)據(jù)庫(kù)3、跳轉(zhuǎn)updateHandle.jsp添加處理頁(yè)面1、接參數(shù)2、更新到數(shù)據(jù)庫(kù)3、跳轉(zhuǎn)deleteHandle.jsp刪除處理頁(yè)面1、接參數(shù)id2、刪除數(shù)據(jù)庫(kù)3、跳轉(zhuǎn)addForm.jsp表單addHandle.jsp添加處理頁(yè)面1、接參數(shù)2、添加到數(shù)據(jù)庫(kù)3、跳轉(zhuǎn)addHandle.jsp添加處理頁(yè)面1、接參數(shù)2、添加到數(shù)據(jù)庫(kù)3、跳轉(zhuǎn)
<ahref="<%=path%>/updateanddelete/updateForm.jsp?id=<%=rs.getString(1)%>&name=<%=rs.getString(2)%>&age=<%=rs.getString(3)%>&jspscore=<%=rs.getString(4)%>">修改</a><ahref="<%=path%>/updateanddelete/deleteHandle.jsp?id=<%=rs.getString(1)%>">刪除</a>隨機(jī)查詢(了解,參考教材中P139-143)順序查詢:使用ResultSet結(jié)果集只能夠執(zhí)行順序查詢r(jià)s.next()方法,因?yàn)榻Y(jié)果集合的游標(biāo)只能夠順序的依次下移,不能夠后退,也不能夠隨機(jī)的定位。隨機(jī)查詢:結(jié)果集可以隨意的滾動(dòng)和定位——進(jìn)行隨機(jī)查詢需要支持可滾動(dòng)的結(jié)果集6.6JDBC隨機(jī)查詢——滾動(dòng)結(jié)果集第1條第4條第3條第1條隨機(jī)查詢Statementstmt=conn.createStatement(inttype,intConcurrency)Type取值決定滾動(dòng)方式ResultSet.TYPE_FORWARD_ONLY:游標(biāo)只能向下滾動(dòng)ResultSet.TYPE_SCROLL_INSENSITIVE
:游標(biāo)可以上下移動(dòng),不敏感ResultSet.TYPE_SCROLL_SENSITIVE
:游標(biāo)可以上下移動(dòng),敏感Concurrency決定是否可以用結(jié)果集更新數(shù)據(jù)庫(kù)ResultSet.CONCUR_READ_ONLY
:不能用結(jié)果集更新數(shù)據(jù)ResultSet.CONCUR_UPDATABLE:可以用結(jié)果集更新數(shù)據(jù)例如:創(chuàng)建一個(gè)支持滾動(dòng)的結(jié)果集6.6JDBC隨機(jī)查詢——滾動(dòng)結(jié)果集Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSetrs=stmt.executeQuery(sql)利用支持滾動(dòng)的Statement對(duì)象創(chuàng)建出來(lái)的結(jié)果集是支持滾動(dòng)的結(jié)果集。支持滾動(dòng)的結(jié)果集rs對(duì)象可以使用的方法rs.previous()游標(biāo)向上移動(dòng)一次,若游標(biāo)指向第一行時(shí),調(diào)用該方法返回false,指向其他行時(shí),調(diào)用返回truers.next()、rs.
first()、rs.
last()rs.absolute(introw)游標(biāo)指定移動(dòng)到某行rs.isBeforeFirst()、rs.
isAfterLast()、rs.
isFirst()、rs.
isLast()rs.getRow()返回當(dāng)前游標(biāo)指向的行號(hào),行號(hào)從1開(kāi)始示例:chap06/query/*.jsp6.6JDBC隨機(jī)查詢——滾動(dòng)結(jié)果集學(xué)生練習(xí)時(shí)間。。。。思考題:如何獲取數(shù)據(jù)庫(kù)中某個(gè)表中的記錄數(shù)?1)遍歷rs結(jié)果集,使用局部變量count++2)使用selectcount(*)ascountfromuser1查詢出計(jì)算字段,并命名為count,再利用rs.getString(1),將其獲取出來(lái)3)使用可滾動(dòng)的結(jié)果集,rs.last();rs.getRow();6.6JDBC隨機(jī)查詢——滾動(dòng)結(jié)果集滾動(dòng)結(jié)果集練習(xí)chap06/scrollresult/*.jsp思考題6.6JDBC隨機(jī)查詢——滾動(dòng)結(jié)果集//方法一Stringuri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=school";try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Connectionconn=DriverManager.getConnection(uri,"sa","6507725");Statementstmt=conn.createStatement();
Stringsql="selectcount(*)ascountfromuserInfo";ResultSetrs=stmt.executeQuery(sql);while(rs.next()){System.out.println("userInfo表總共行數(shù)為:"+rs.getString(1));}}catch(ClassNotFoundExceptione){}catch(SQLExceptione){
}6.6JDBC隨機(jī)查詢——滾動(dòng)結(jié)果集//方法二try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Connectionconn=DriverManager.getConnection(uri,"sa","6507725");Statementstmt=conn.createStatement();Stringsql="select*fromuserInfo";ResultSetrs=stmt.executeQuery(sql);introwCount=0;while(rs.next()){rowCount++;}System.out.println("userInfo表總共行數(shù)為:"+rowCount);}catch(ClassNotFoundExceptione){}catch(SQLExceptione){}注意:這種實(shí)現(xiàn)方法有個(gè)弊端,如果此時(shí)想對(duì)rs的結(jié)果集進(jìn)行操作,是沒(méi)有辦法的。因?yàn)橛螛?biāo)已經(jīng)停留在最后一行之后,最好使用支持滾動(dòng)的結(jié)果集,重新將游標(biāo)放到第一行。rs.first();Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);預(yù)處理語(yǔ)句PreparedStatement位于包java.sql中優(yōu)點(diǎn)1:SQL語(yǔ)句的字符串拼接在對(duì)SQL進(jìn)行預(yù)處理時(shí)可以使用通配符“?”代替字段的值,需要在預(yù)處理語(yǔ)句執(zhí)行之前(即調(diào)用executeQuery或者executeUpdate方法之前)設(shè)置通配符所表示的具體值,6.7預(yù)處理語(yǔ)句Stringsql=“insertintostudentvalues(?,?,?,?)"PreparedStatementpstmt=conn.prepareStatement(sql);預(yù)處理語(yǔ)句PreparedStatement可以使用如下方法設(shè)置值:voidsetString(int
parameterIndex,Stringx)voidsetInt(int
parameterIndex,Stringx)參數(shù)parameterIndex用來(lái)表示SQL語(yǔ)句通配符的位置,x是該通配符所取的具體值可以使用如下方法操作數(shù)據(jù)庫(kù)
ResultSet
executeQuery()int
executeUpdate()6.7預(yù)處理語(yǔ)句pstmt.setString(1,"001");pstmt.setString(2,"Zhangsan");pstmt.setInt(3,23);pstmt.executeUpdate()案例:insert2.jspinsert2Handle.jspinsert3.jspinsert3Handle.jsp預(yù)處理語(yǔ)句PreparedStatement優(yōu)點(diǎn)2:SQL語(yǔ)句的執(zhí)行6.7預(yù)處理語(yǔ)句應(yīng)用程序OracleSQL語(yǔ)句SQL解釋器數(shù)據(jù)庫(kù)產(chǎn)品底層內(nèi)部命令執(zhí)行結(jié)果底層內(nèi)部命令連接Oracle數(shù)據(jù)庫(kù)加載驅(qū)動(dòng)程序Class.forName("oracle.jdbc.driver.OracleDriver");建立連接Connectionconn=DriverManager.getConnection("jdbc:oracle:thin:@主機(jī)host:端口號(hào):數(shù)據(jù)庫(kù)名“,”用戶名“,”密碼“);6.8JDBC連接其他數(shù)據(jù)庫(kù)應(yīng)用程序建立JDBC和ODBC之間的連接,即所謂的建立JDBC-ODBC橋接器,而和數(shù)據(jù)庫(kù)的連接由ODBC完成6.9JDBC-ODBC橋接器連接數(shù)據(jù)庫(kù)編程語(yǔ)言O(shè)racleSybaseSQLServerMySQLAPIforOracleAPIforSybaseAPIforSQLServerAPIforMySQLJDBCODBC使用JDBC-ODBC橋接器訪問(wèn)數(shù)據(jù)庫(kù)的步驟創(chuàng)建ODBC數(shù)據(jù)源步驟:控制面板——ODBC數(shù)據(jù)源——用戶DSN——添加——選擇數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序——完成——數(shù)據(jù)源名——選擇數(shù)據(jù)庫(kù)加載橋接器驅(qū)動(dòng)程序Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");rt.jarsun.jdbc.odbc包下JdbcOdbcDriver類(jdk自帶的)和ODBC數(shù)據(jù)源建立連接Connectioncon=DriverManager.getConnection(“jdbc:odbc:數(shù)據(jù)源名字”,“uername”,“password”);6.9JDBC-ODBC橋接器連接數(shù)據(jù)庫(kù)例.ODBC連接EXCEL
和sqlserverTestODBCExcel.javaTest.jsppackagedj.nepu;importjava.sql.*;public
classTest{public
static
voidmain(String[]args){//TODOAuto-generatedmethodstubConnectionconn=null;Statementstmt=null;ResultSetrs=null;Stringsql="select*fromstudent";try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");conn=DriverManager.getConnection("jdbc:odbc:s","","");stmt=conn.createStatement();rs=stmt.executeQuery(sql);}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}try{while(rs.next()){System.out.print(rs.getString(1)+"");System.out.print(rs.getString(2)+"");System.out.print(rs.getString(3)+"");System.out.print("\n");}}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}在主函數(shù)中測(cè)試jdbc-odbc連接到sqlserver數(shù)據(jù)源名稱6.9JDBC-ODBC橋接器連接數(shù)據(jù)庫(kù)可以在DBManager中添加一個(gè)獲取連接的方法privateConnectiongetConnection2(){try{//加載數(shù)據(jù)連接驅(qū)動(dòng)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//獲取數(shù)據(jù)庫(kù)連接conn=DriverManager.getConnection("jdbc:odbc:aa","","");if(conn!=null)System.out.println("數(shù)據(jù)庫(kù)連接成功");}catch(ClassNotFoundExceptione){System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載錯(cuò)誤");e.printStackTrace();}catch(SQLExceptione){System.out.println("獲取連接錯(cuò)誤");e.printStackTrace();}return
conn;}
<%
//1為Excel的數(shù)據(jù)區(qū)域定義名稱
//2添加ODBC數(shù)據(jù)源
//3使用JDBC-ODBC方式連接數(shù)據(jù)源
Connectionconn=null;ResultSetrs=null;Statementstmt=null;
try{//加載數(shù)據(jù)連接驅(qū)動(dòng)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//獲取數(shù)據(jù)庫(kù)連接conn=DriverManager.getConnection("jdbc:odbc:s","","");stmt=conn.createStatement();rs=stmt.executeQuery("select*fromstu");}catch(ClassNotFoundExceptione){System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載錯(cuò)誤");e.printStackTrace();}catch(SQLExceptione){System.out.println("獲取連接錯(cuò)誤");e.printStackTrace();}
<tablewidth="600"border=1>
<%while(rs.ne
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 化工培訓(xùn)課件塑料注射工藝
- 《口腔腫瘤NCCN干貨》課件
- 贛東學(xué)院《智能硬件與控制》2023-2024學(xué)年第一學(xué)期期末試卷
- 《讀書(shū)的好方法》課件
- 2022年個(gè)人與團(tuán)隊(duì)管理復(fù)習(xí)題庫(kù)及答案
- 七年級(jí)下《地毯下的塵土》語(yǔ)文版-課件
- 小學(xué)生團(tuán)隊(duì)活動(dòng)制度
- 小學(xué)生健身操課件視頻
- 裁員告知書(shū)-企業(yè)管理
- 上半年教職工政治理論學(xué)習(xí)參考計(jì)劃
- 畢業(yè)論文材料分揀裝置PLC控制系統(tǒng)方案
- 森林報(bào)測(cè)試題
- 刑法涉及安全生產(chǎn)的16宗罪解讀
- 京東五力模型分析
- 電大《電氣傳動(dòng)與調(diào)速系統(tǒng)》網(wǎng)絡(luò)課形考任務(wù)1-4作業(yè)及答案
- 銅精礦加工費(fèi)簡(jiǎn)析
- 機(jī)電拆除專項(xiàng)施工方案
- 變電站電氣一次工程監(jiān)理要點(diǎn)重點(diǎn)
- 足球?qū)m?xiàng)體育課教學(xué)大綱、教學(xué)計(jì)劃
- ASTMA153∕A153M-05鋼鐵制金屬構(gòu)件上鍍鋅層(熱浸)標(biāo)準(zhǔn)規(guī)范
- 牛津譯林版四年級(jí)英語(yǔ)上冊(cè)專項(xiàng)訓(xùn)練排序
評(píng)論
0/150
提交評(píng)論