chap6-在JSP中使用數(shù)據(jù)庫-student_第1頁
chap6-在JSP中使用數(shù)據(jù)庫-student_第2頁
chap6-在JSP中使用數(shù)據(jù)庫-student_第3頁
chap6-在JSP中使用數(shù)據(jù)庫-student_第4頁
chap6-在JSP中使用數(shù)據(jù)庫-student_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章

在JSP中使用數(shù)據(jù)庫61、深入理解JDBC的工作原理2、掌握使用java數(shù)據(jù)庫驅(qū)動連接數(shù)據(jù)庫的基本步驟3、掌握J(rèn)DBC數(shù)據(jù)庫的查詢、更新操作4、會在JSP頁面中靈活使用數(shù)據(jù)庫5、了解JDBC-ODBC橋接器數(shù)據(jù)庫連接方式課程目標(biāo)

☆1、JDBC介紹概念工作原理2、連接數(shù)據(jù)庫的常用方式使用Java數(shù)據(jù)庫驅(qū)動JDBC-ODBC橋接器3、JDBC查詢操作4、JDBC更新、添加與刪除操作內(nèi)容提要6.1JDBC介紹1、什么是JDBC

JDBC(JavaDataBaseConnectivity),SUN公司為Java程序提供的訪問各種數(shù)據(jù)庫的API,它由一些Java類和接口組成。2、JSP與JDBCJSP頁面<%…%>Java程序片,使用java語法連接數(shù)據(jù)庫數(shù)據(jù)庫返回結(jié)果建立連接、發(fā)送SQL語句3.JDBC的基本原理早期數(shù)據(jù)庫開發(fā)模式6.1JDBC介紹編程語言O(shè)racleSybaseSQLServerMySQLAPIforOracleAPIforSybaseAPIforSQLServerAPIforMySQL使用使用使用使用操作操作操作操作各種數(shù)據(jù)庫1、程序員操作不便2、產(chǎn)品維護成本增加3.JDBC的基本原理JDBC開發(fā)數(shù)據(jù)庫模式6.1JDBC介紹各種數(shù)據(jù)庫OracleSybaseSQLServerMySQLAPIforOracleAPIforSybaseAPIforSQLServerAPIforMySQLJDBC接口由各個數(shù)據(jù)庫廠商實現(xiàn)

接口1……接口2接口3接口4編程語言統(tǒng)一接口1、純Java數(shù)據(jù)庫驅(qū)動程序使用java語言編寫的數(shù)據(jù)庫驅(qū)動程序(數(shù)據(jù)庫廠商完成)。JDBC提供的API將Java數(shù)據(jù)庫驅(qū)動轉(zhuǎn)換為數(shù)據(jù)庫系統(tǒng)所使用的專門協(xié)議來實現(xiàn)與數(shù)據(jù)庫交互2、JDBC-ODBC橋接器應(yīng)用程序建立“JDBC-ODBC”之間的連接,即“橋接器”,和數(shù)據(jù)庫的連接由ODBC(OpenDatabaseConnectivity)去完成。6.2JDBC連接數(shù)據(jù)庫的常用方式

JDBC調(diào)用Java數(shù)據(jù)庫驅(qū)動程序充分利用ODBC的優(yōu)勢JDBC-ODBC1、純Java數(shù)據(jù)庫驅(qū)動程序6.2JDBC連接數(shù)據(jù)庫的常用方式應(yīng)用程序JDBCOracle驅(qū)動SQLServer驅(qū)動MySQL驅(qū)動其他驅(qū)動Oracle數(shù)據(jù)庫SQLServerMySQL數(shù)據(jù)庫其他數(shù)據(jù)庫使用加載連接連接連接連接使用JDBC的應(yīng)用程序所駐留的計算機2、JDBC-ODBC橋接器:應(yīng)用程序建立JDBC和ODBC之間的連接,即所謂的建立JDBC-ODBC橋接器,而和數(shù)據(jù)庫的連接由ODBC完成6.2JDBC連接數(shù)據(jù)庫的常用方式編程語言O(shè)racleSybaseSQLServerMySQLAPIforOracleAPIforSybaseAPIforSQLServerAPIforMySQLJDBCODBC返回1、純Java數(shù)據(jù)庫驅(qū)動程序JDBC1)位置:位于JDK的安裝目錄下2)內(nèi)容接口:Driver、Connection、Statement

ResultSet類:DriverManager6.2JDBC連接數(shù)據(jù)庫的常用方式C:\ProgramFiles\Java\jdk1.6.0_02\jre\lib\rt.jar導(dǎo)入java.sql.*1、純Java數(shù)據(jù)庫驅(qū)動程序JDBC6.2JDBC連接數(shù)據(jù)庫的常用方式名稱解釋Driver驅(qū)動程序接口,被數(shù)據(jù)庫廠商實現(xiàn),加載后才能連接數(shù)據(jù)庫DrvierManager(類)處理驅(qū)動的調(diào)入,并且產(chǎn)生新的數(shù)據(jù)庫連接Connection代表對特定數(shù)據(jù)庫的連接Statement用于發(fā)送SQL語句,接收SQL的執(zhí)行結(jié)果ResultSet執(zhí)行查詢語句得到的結(jié)果集使用順序自上而下1、純Java數(shù)據(jù)庫驅(qū)動程序數(shù)據(jù)庫驅(qū)動(SQLServer2005)1)位置需要開發(fā)者下載,并配置項目根目錄\WebRoot\WEB-INF\lib2)內(nèi)容(對JDBC底層接口的實現(xiàn)類)6.2JDBC連接數(shù)據(jù)庫的常用方式1、JDBC準(zhǔn)備工作1)下載JDBC數(shù)據(jù)庫驅(qū)動(驅(qū)動由相應(yīng)的數(shù)據(jù)庫廠商來提供)

例如:SQLServer2005——sqljdbc.jar

com.microsoft.sqlserver.jdbc.SQLServerDriver2)配置JDBC數(shù)據(jù)庫驅(qū)動將sqljdbc.jar文件拷貝到MyEclipse中的web項目的目錄\WebRoot\WEB-INF\lib下6.3使用JDBC連接數(shù)據(jù)庫2、JDBC編程步驟步驟1:在程序中加載驅(qū)動驅(qū)動程序類:com.microsoft.sqlserver.jdbc.SQLServerDriver加載方法:Class.forName(驅(qū)動程序類)6.3使用JDBC連接數(shù)據(jù)庫try{

}catch(ClassNotFoundExceptione){System.out.println("數(shù)據(jù)庫驅(qū)動加載錯誤");}Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");注意:Class是包java.lang中的一個類,該類調(diào)用靜態(tài)方法forName可以加載驅(qū)動,該方法拋ClassNotFoundException異常,因此需要捕獲異常2、JDBC編程步驟步驟2:創(chuàng)建連接對象(連接數(shù)據(jù)庫)使用DriverManager類的方法getConnection創(chuàng)建連接對象格式:Connectionconn=DriverManager.getConnection(String

uri,Stringuser,Stringpassword)參數(shù)說明:uri:要連接的數(shù)據(jù)庫的路徑,根據(jù)數(shù)據(jù)庫不同變化user:登錄數(shù)據(jù)庫的用戶名password:登錄數(shù)據(jù)庫的密碼注意:該方法會拋出SQLException(SQL異常)6.3使用JDBC連接數(shù)據(jù)庫步驟2:創(chuàng)建數(shù)據(jù)庫連接對象6.3使用JDBC連接數(shù)據(jù)庫Stringuri="jdbc:sqlserver://: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ù)庫驅(qū)動加載錯誤");}catch(SQLExceptione){System.out.println("獲取連接錯誤");}if(conn!=null)System.out.println("數(shù)據(jù)庫連接成功");數(shù)據(jù)庫名服務(wù)器ip如果得到空對象說明連接失敗2、JDBC編程步驟步驟3:發(fā)送SQL語句到數(shù)據(jù)庫1)創(chuàng)建Statement

作用:Statement對象用于將SQL語句發(fā)送到數(shù)據(jù)庫中格式:Statementstmt=conn.createSatement()2)執(zhí)行SQL語句(調(diào)用Statement的方法)查詢方法:publicResultSetexecuteQuery(Stringsql)throwsSQLException更新方法:publicintexecuteUpdate(Stringsql)throwsSQLException6.3使用JDBC連接數(shù)據(jù)庫添加、修改、刪除2、JDBC編程步驟步驟3:發(fā)送SQL語句到數(shù)據(jù)庫(例:查詢)6.3使用JDBC連接數(shù)據(jù)庫try{……Stringsql="select*fromstudent";Statetmentstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);……}catch(……){……}SQL語句語句對象執(zhí)行SQL說明:此步驟得到的結(jié)果存儲在rs結(jié)果集合中,下一步要遍歷結(jié)果集取出數(shù)據(jù)來應(yīng)用2、JDBC編程步驟步驟4:遍歷展示結(jié)果集1)遍歷行:ResultSet對象的next()方法Booleanrs.next():從當(dāng)前位置移動游標(biāo)向前移動一行,如果當(dāng)前行有效,返回true,否則返回false2)遍歷列:通過ResultSet對象的getXXX()方法遍歷行中的列p1356.3使用JDBC連接數(shù)據(jù)庫游標(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)注意:colunIndex從1開始計數(shù)Stringsql="select*fromstudent";Statetmentstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);while(rs.next()){ out.println(rs.getString("id"));out.println(rs.getString("name"));out.println(rs.getString("age"));out.println(rs.getString("jspScore"));out.println("<br/>");}注意:此時游標(biāo)停留在當(dāng)前結(jié)果集的第一行的前面注意:此時游標(biāo)停留在第一行輸出結(jié)果:在jsp頁面中逐行打印出結(jié)果集中的記錄2、JDBC編程步驟步驟5:關(guān)閉數(shù)據(jù)庫連接1)rs.close()關(guān)閉結(jié)果集2)stmt.close()關(guān)閉statement對象3)conn.close()關(guān)閉Connection對象6.3使用JDBC連接數(shù)據(jù)庫注意:關(guān)閉數(shù)據(jù)庫連接的順序2、JDBC編程步驟(總結(jié))6.3使用JDBC連接數(shù)據(jù)庫加載驅(qū)動連接數(shù)據(jù)庫發(fā)送SQL語句處理返回結(jié)果關(guān)閉資源Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Stringuri="jdbc:sqlserver://: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中重要的接口和類這幾個常用的類和接口都位于包java.sql中,接口的實現(xiàn)類為于com.microsoft.sqlserver.jdbc中6.3使用JDBC連接數(shù)據(jù)庫名稱解釋Driver驅(qū)動程序接口被數(shù)據(jù)庫廠商實現(xiàn),加載后才能連接數(shù)據(jù)庫DrvierManager(類)處理驅(qū)動的調(diào)入并且對產(chǎn)生新的數(shù)據(jù)庫連接Connection代表對特定數(shù)據(jù)庫的連接Statement用于發(fā)送Sql語句,并接收Sql的執(zhí)行結(jié)果ResultSet執(zhí)行查詢語句得到的結(jié)果集6.3使用JDBC連接數(shù)據(jù)庫擴展:將數(shù)據(jù)庫操作封裝為一個java類,提高可重用性第一步:新建類DBManager.java第二步:導(dǎo)包操作第三步:編寫類代碼public

classDBManager{1、定義變量2、獲取連接方法getConnection3、執(zhí)行查詢方法executeQuery4、釋放資源的方法releaseSource}6.3使用JDBC連接數(shù)據(jù)庫1、定義變量privateConnectionconn=null;privateStatementstmt=null;privateResultSetrs=null;privateStringuri="jdbc:sqlserver://:1433;DatabaseName=school";privateStringuser="sa";privateStringpassword="123456";6.3使用JDBC連接數(shù)據(jù)庫2、編寫獲取數(shù)據(jù)庫連接對象的方法publicConnectiongetConnection(){try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");conn=DriverManager.getConnection(uri,user,password);if(conn!=null){System.out.println("數(shù)據(jù)庫鏈接獲取成功");}}catch(ClassNotFoundExceptione){System.out.println("驅(qū)動程序加載異常");}catch(SQLExceptione){System.out.println("獲取連接異常");e.printStackTrace();//打印堆棧跟蹤}return

conn;}6.3使用JDBC連接數(shù)據(jù)庫3、編寫獲取查詢結(jié)果集的方法publicResultSetexecuteQuery(Stringsql){try{stmt=conn.createStatement();rs=stmt.executeQuery(sql);}catch(SQLExceptione){System.out.println("SQL執(zhí)行錯誤");e.printStackTrace();//打印堆棧跟蹤}return

rs;}6.3使用JDBC連接數(shù)據(jù)庫4、編寫釋放數(shù)據(jù)庫資源的方法public

voidreleaseSource(){try{if(rs!=null)rs.close();if(stmt!=null)stmt.close();if(conn!=null)conn.close();}catch(SQLExceptione){e.printStackTrace();}}6.3使用JDBC連接數(shù)據(jù)庫5、構(gòu)造函數(shù)直接獲取數(shù)據(jù)庫連接/**

*

聲明該類的對象時,就建立數(shù)據(jù)庫連接

*/publicDBManager(){this.conn=this.getConnection();}順序查詢簡單查詢select*fromstudent條件查詢select*fromstudentwhereage=23select*fromstudentwhereagebetween23and40排序查詢select*fromstudentorderbyjspscore

select*fromstudentorderby

jspscore

ascselect*fromstudentorderby

jspscore

desc

6.4JDBC數(shù)據(jù)庫查詢age>=23andage<=40按照jspscore排序默認(rèn)升序按照jspscore排序升序按照jspscore排序降序模糊查詢select*fromstudentwherenamelike

‘張%’張、張三、張曉曉……第一個字符是“張”select*fromstudentwherenamelike

‘張_’張三、張曉……包含兩個字符,且第一個字符是“張”select*fromstudentwherenamelike

‘%小%’張小青、王小紅、李小麗……包含字符“小”練習(xí)寫出SQL語句查詢t1表中content字段包含“java”,并且倒數(shù)第2個字符為‘E’的記錄select*fromt1wherecontentlike

‘%java%E_’6.4JDBC數(shù)據(jù)庫查詢學(xué)生練習(xí)時間。。。。6.4JDBC數(shù)據(jù)庫查詢DBManager:executeQueryquery1.jsp(簡單查詢)條件查詢模糊查詢排序查詢6.4JDBC數(shù)據(jù)庫查詢綜合練習(xí)1----條件查詢(結(jié)合表單來實現(xiàn)查詢)

<body>

<h1>請輸入學(xué)生的成績</h1>

<formaction="<%=path%>/query/query.jsp"

method="get">

學(xué)生成績在<inputtype="text"name="scoreBegin"/>

到<inputtype="text"name="scoreEnd"/>之間的學(xué)生記錄是

<inputtype="submit"name="submit"value="查詢"/>

</form>

</body>student.jspquery.jspStatement對象更新方法publicint

executeUpdate(String

sqlStatement);返回受影響的行數(shù),若返回0,則說明更新操作失敗SQL語句添加記錄insert1)insertintotestvalues(‘zhangsan’,23)2)insertintotest(name)values(‘lisi’)修改記錄update1)updatetestsetage=40wherename='zhangsan‘刪除記錄delete2)deletefromtestwherename='zhangsan'6.5更新、添加與刪除

DBManager添加更新方法public

intexecuteUpdate(Stringsql){inttemp=0;try{stmt=conn.createStatement();temp=stmt.executeUpdate(sql);}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();System.out.println("sql語句執(zhí)行錯誤!");}returntemp;}SQL語句注意:字符串拼接技巧6.5更新、添加與刪除以插入記錄的SQL為例,插入記錄操作時,變量var中存儲著字段的值,首先:寫好insertintostudentvalues()

然后(1)見到字符串類型的字段,sql中就拼’”+var+”’,(2)見到數(shù)據(jù)類型的字段,sql中就拼”+var+”最后形成:insertintostudentvalues('"+id+"','"+name+"',"+age+","+jspscore+");案例:insert1.jspinsert1Handle.jsp6.5更新、添加與刪除綜合練習(xí)2----添加記錄6.5更新、添加與刪除綜合練習(xí)3----更新記錄(刪除和修改)數(shù)據(jù)庫綜合練習(xí)query.jsp結(jié)果展示頁面updateForm.jsp表單1、接參數(shù)id2、查詢數(shù)據(jù)庫3、顯示到表單中(或者是接收到所有字段信息)updateHandle.jsp添加處理頁面1、接參數(shù)2、更新到數(shù)據(jù)庫3、跳轉(zhuǎn)deleteHandle.jsp刪除處理頁面1、接參數(shù)id2、刪除數(shù)據(jù)庫3、跳轉(zhuǎn)addForm.jsp表單addHandle.jsp添加處理頁面1、接參數(shù)2、添加到數(shù)據(jù)庫3、跳轉(zhuǎn)addHandle.jsp添加處理頁面1、接參數(shù)2、添加到數(shù)據(jù)庫3、跳轉(zhuǎn)批量刪除query.jsp結(jié)果展示頁面deleteAll.jsp批量刪除處理頁面1、接id參數(shù)(接收到數(shù)組)2、使用for循環(huán)拼接delete語句3、執(zhí)行批量刪除語句4、跳轉(zhuǎn)到query頁面數(shù)據(jù)庫綜合練習(xí)添加功能刪除功能修改功能展示頁面

<body>

<formaction="<%=path%>/add/addHandle.jsp"

method="get">

學(xué)號:<inputtype="text"name="number"/><br/>

姓名:<inputtype="text"name="name"/><br/>

年齡:<inputtype="text"name="age"/><br/>

成績:<inputtype="text"name="score"/><br/>

<inputtype="submit"name="submit"value="添加"/>

</form>

</body>

<%

//1接收參數(shù)

Stringname=request.getParameter("name");name=newString(name.getBytes("iso-8859-1"),"gb2312");Stringnumber=request.getParameter("number");Stringage=request.getParameter("age");StringjspScore=request.getParameter("score");Stringsql="insertintostudentvalues('"+number+"','"+name+"',"+age+","+jspScore+")";

//2添加到數(shù)據(jù)庫

DBManagerdb=newDBManager();

intcount=db.executeUpdate(sql);

//3釋放數(shù)據(jù)庫資源

db.releaseSource();

//4跳轉(zhuǎn)到查詢頁面

response.sendRedirect("query.jsp");

%>addForm.jspaddHandle.jsp

<body>

<%DBManagerdb=newDBManager();ResultSetrs=db.executeQuery("select*fromstudent");

%>

<h1>以下是查詢結(jié)果</h1>

<formaction="<%=path%>/delete/deleteAll.jsp">

<tablewidth="600"border="1">

<tr><th>選擇</th><th>id</th><th>名字</th><th>年齡</th><th>分?jǐn)?shù)</th><thcolspan="2">操作</th></tr>

<%

while(rs.next()){

%>

<tralign="center">

<td><inputtype="checkbox"name="deleteAll"value="<%=rs.getString("id")%>"/></td>

<td><%=rs.getString("id")%></td>

<td><%=rs.getString("name")%></td>

<td><%=rs.getInt("age")%></td>

<td><%=rs.getFloat("jspScore")%></td>

<td><ahref="<%=path%>/update/updateForm.jsp?id=<%=rs.getString("id")%>&name=<%=rs.getString(2)%>&age=<%=rs.getString(3)%>&jspScore=<%=rs.getString(4)%>">修改</a></td>

<td><ahref="<%=path%>/delete/delete.jsp?id=<%=rs.getString("id")%>">刪除</a></td>

</tr>

<%}db.releaseSource();

%>

</table>

<inputtype="submit"name=""value="批量刪除"/>

</form>

</body>query.jsp接收參數(shù),并顯示在表單中提交表單時,交給updateHandle.jsp處理顯示當(dāng)前記錄id值,不允許修改顯示當(dāng)前記錄姓名顯示當(dāng)前記錄年齡顯示當(dāng)前記錄成績updateForm.jspupdateHandle.jsp關(guān)于批量刪除思路接收到的是String類型的數(shù)組,數(shù)組中存放了記錄的id值1)deletefromstudentwhereidin(id1,id2,id3……)2)在循環(huán)中執(zhí)行delete語句deleteHandle.jsp通過超鏈接傳遞參數(shù)的寫法

<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>1、隨機查詢(參考教材中P139-143)1)順序查詢:結(jié)果集游標(biāo)只能順序向前移動。使用ResultSet結(jié)果集只能夠執(zhí)行順序查詢rs.next()方法6.6JDBC隨機查詢——滾動結(jié)果集游標(biāo)游標(biāo)游標(biāo)游標(biāo)ResultSet結(jié)果集合只支持游標(biāo)順序的依次下移,不能夠后退,也不能夠隨機的定位。(只進的ResultSet)1)stmt=conn.createStatement();2)rs=stmt.executeQuery(sql);游標(biāo)1、隨機查詢(參考教材中P139-143)2)隨機查詢:結(jié)果集游標(biāo)可以隨意的滾動和定位例:假設(shè)數(shù)據(jù)庫中記錄是按照“學(xué)號”字段排序的,在頁面中按照下圖所示順序輸出記錄6.6JDBC隨機查詢——滾動結(jié)果集第4條第3條第1條第1條進行隨機查詢需要支持滾動的結(jié)果集3)獲取可滾動結(jié)果集的方法Statementstmt=conn.createStatement(inttype,intConcurrency)rs=stmt.executeQuery(sql);(1)Type取值決定滾動方式①

ResultSet.TYPE_FORWARD_ONLY:游標(biāo)只能向前滾動②

ResultSet.TYPE_SCROLL_INSENSITIVE:游標(biāo)可以前后滾動,不敏感③

ResultSet.TYPE_SCROLL_SENSITIVE:游標(biāo)可以前后滾動,敏感(2)Concurrency決定是否可以用結(jié)果集更新數(shù)據(jù)庫①

ResultSet.CONCUR_READ_ONLY:不能用結(jié)果集更新數(shù)據(jù)②

ResultSet.CONCUR_UPDATABLE:可以用結(jié)果集更新數(shù)據(jù)6.6JDBC隨機查詢——滾動結(jié)果集1、隨機查詢(1)Type取值決定滾動方式static

int

TYPE_SCROLL_INSENSITIVE

The

constant

indicating

the

type

for

a

ResultSet

object

that

is

scrollable

but

generally

not

sensitive

to

changes

made

by

others.

static

int

TYPE_SCROLL_SENSITIVE

The

constant

indicating

the

type

for

a

ResultSet

object

that

is

scrollable

and

generally

sensitive

to

changes

made

by

others.

6.6JDBC隨機查詢——滾動結(jié)果集對數(shù)據(jù)庫中update操作是否敏感,即有另外的事務(wù)更新了數(shù)據(jù)庫中的記錄,則已經(jīng)取出的ResultSet中相應(yīng)記錄也會變化。6.6JDBC隨機查詢——滾動結(jié)果集1、隨機查詢(1)Type取值決定滾動方式A線程:1)查詢2)在頁面上展示B線程:1)更新2)在頁面上展示內(nèi)存:ResultSet(在線)更新了數(shù)據(jù)表的某條記錄如果ResultSet是敏感的(TYPE_SCROLL_SENSITIVE),則ResultSet會自動更新數(shù)據(jù),否則,A看到的將不是最新的數(shù)據(jù)庫中的數(shù)據(jù)1、隨機查詢(2)Concurrency決定是否可以用結(jié)果集更新數(shù)據(jù)庫①

ResultSet.CONCUR_READ_ONLY:不能用結(jié)果集更新數(shù)據(jù)②

ResultSet.CONCUR_UPDATABLE:可以用結(jié)果集更新數(shù)據(jù)例:創(chuàng)建一個支持滾動的敏感結(jié)果集,可以使用結(jié)果集更新數(shù)據(jù)庫6.6JDBC隨機查詢——滾動結(jié)果集stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);rs=stmt.executeQuery(sql);1、隨機查詢(2)Concurrency決定是否可以用結(jié)果集更新數(shù)據(jù)庫②

ResultSet.CONCUR_UPDATABLE:可以用結(jié)果集更新數(shù)據(jù)

方法1:voidupdateString(StringcolumnLabel,Stringx)throwsSQLException;

例:rs.updateString("id","0011");

方法2:voidupdateString(intcolumnIndex,Stringx)throwsSQLException;

例:rs.updateString(2,"小王");方法3:voidupdateRow()throwsSQLException;——提交更新6.6JDBC隨機查詢——滾動結(jié)果集

//更新結(jié)果集合示例

rs.first();//將游標(biāo)移動到第一行rs.updateString(“id”,“0011”);//設(shè)置更新的id字段值rs.updateString(2,“小王”);//設(shè)置更新的name字段值rs.updateRow();//提交更新數(shù)據(jù)庫表字段索引,從1開始1232、rs對象的常用方法1)rs.next()游標(biāo)前進2)rs.previous()游標(biāo)向前移動一次,若游標(biāo)指向第一行時,調(diào)用該方法返回false,指向其他行時,調(diào)用返回true3)rs.first()、rs.last()游標(biāo)定位到第一條和最后一條記錄4)rs.absolute(introw)游標(biāo)指定移動到某行5)rs.isBeforeFirst()、rs.isAfterLast()、rs.isFirst()、

rs.isLast()6)rs.getRow()返回當(dāng)前游標(biāo)指向的行號,行號從1開始示例:chap06/scroolRS/scroolRS.jsp6.6JDBC隨機查詢——滾動結(jié)果集/**支持可滾動結(jié)果集的查詢方法(添加到DBManager中)

*

@param

sql

*

@return

*/publicResultSetscollExecuteQuery(Stringsql){try{stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);rs=stmt.executeQuery(sql);}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}return

rs;}學(xué)生練習(xí)時間。。。。6.6JDBC隨機查詢——滾動結(jié)果集滾動結(jié)果集練習(xí)chap06/scroolRS/scroolRS.jsp滾動結(jié)果集的應(yīng)用——思考題:如何獲取數(shù)據(jù)庫中某個表(student)中的記錄數(shù)?1)遍歷rs結(jié)果集,使用局部變量count++2)使用selectcount(*)ascountfromuser1查詢出計算字段,并命名為count,再利用rs.getString(1),將其獲取出來3)使用可滾動的結(jié)果集,rs.last();rs.getRow();6.6JDBC隨機查詢——滾動結(jié)果集6.6JDBC隨機查詢——滾動結(jié)果集//方法一和方法三try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Connectionconn=DriverManager.getConnection(uri,"sa","6507725");Statementstmt=conn.createStatement();Stringsql="select*fromstudent";ResultSetrs=stmt.executeQuery(sql);introwCount=0;while(rs.next()){rowCount++;}System.out.println("userInfo表總共行數(shù)為:"+rowCount);}catch(ClassNotFoundExceptione){}catch(SQLExceptione){}注意:這種實現(xiàn)方法有個弊端,如果此時想對rs的結(jié)果集進行操作,是沒有辦法的。因為游標(biāo)已經(jīng)停留在最后一行之后,最好使用支持滾動的結(jié)果集,重新將游標(biāo)放到第一行。rs.first();rs.getRow();Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);思考題6.6JDBC隨機查詢——滾動結(jié)果集//方法二Stringuri="jdbc:sqlserver://:1433;DatabaseName=school";try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Connectionconn=DriverManager.getConnection(uri,"sa","6507725");Statementstmt=conn.createStatement();

Stringsql="selectcount(*)ascountfromstudent";ResultSetrs=stmt.executeQuery(sql);while(rs.next()){System.out.println("userInfo表總共行數(shù)為:"+rs.getString(1));}}catch(ClassNotFoundExceptione){}catch(SQLExceptione){

}應(yīng)用程序建立JDBC和ODBC之間的連接,即所謂的建立JDBC-ODBC橋接器,而和數(shù)據(jù)庫的連接由ODBC完成6.7JDBC-ODBC橋接器連接數(shù)據(jù)庫編程語言O(shè)racleSybaseSQLServerMySQLAPIforOracleAPIforSybaseAPIforSQLServerAPIforMySQLJDBCODBC返回使用JDBC-ODBC橋接器訪問數(shù)據(jù)庫的步驟1)創(chuàng)建ODBC數(shù)據(jù)源步驟:控制面板——管理工具——ODBC數(shù)據(jù)源——用戶DSN——添加——選擇數(shù)據(jù)庫驅(qū)動程序——完成——數(shù)據(jù)源名——選擇數(shù)據(jù)庫——測試數(shù)據(jù)源2)加載橋接器驅(qū)動程序Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");rt.jar------sun.jdbc.odbc包下JdbcOdbcDriver類(jdk自帶的)3)和ODBC數(shù)據(jù)源建立連接Connectioncon=DriverManager.getConnection(“jdbc:odbc:數(shù)據(jù)源名字”,“uername”,“password”);6.7JDBC-ODBC橋接器連接數(shù)據(jù)庫例.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ù)中測試jdbc-odbc連接到sqlserver數(shù)據(jù)源名稱6.7JDBC-ODBC橋接器連接數(shù)據(jù)庫可以在DBManager中添加一個獲取連接的方法再添加一個構(gòu)造函數(shù)privateConnectiongetConnection2(){try{//加載數(shù)據(jù)連接驅(qū)動Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//獲取數(shù)據(jù)庫連接conn=DriverManager.getConnection("jdbc:odbc:aa","","");if(conn!=null)System.out.println("數(shù)據(jù)庫連接成功");}catch(ClassNotFoundExceptione){System.out.println("數(shù)據(jù)庫驅(qū)動加載錯誤");e.printStackTrace();}catch(SQLExceptione){System.out.

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論