版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市污水處理廠 PPP 項目合同
- 體育產(chǎn)業(yè)投資經(jīng)營合同
- 安慶初三一模數(shù)學(xué)試卷
- 站外管線巡檢施工方案
- 教育行業(yè)物流咨詢服務(wù)合同
- 百度網(wǎng)盤高二數(shù)學(xué)試卷
- 農(nóng)業(yè)行業(yè)種植風(fēng)險告知合同協(xié)議
- 酒店業(yè)智能客房服務(wù)與安全管理方案
- 岱岳區(qū)主編數(shù)學(xué)試卷
- 保稅區(qū)物業(yè)招投標(biāo)流程
- 少年宮籃球活動教案
- 國有建設(shè)企業(yè)《大宗材料及設(shè)備采購招標(biāo)管理辦法》
- 民間秘術(shù)絕招大全
- 水運工程質(zhì)量檢驗標(biāo)準(zhǔn)(JTS_257-2008)附表格
- 春節(jié)停工報告完整版3頁
- (完整版)展廳展館博物館美術(shù)館設(shè)計標(biāo)招標(biāo)評分細則及打分表
- [宋小寶小品甄嬛后傳臺詞]甄嬛歪傳小品劇本臺詞范本
- 扭扭棒手工PPT課件
- 曲式分析演唱技巧情感運用
- 古建筑白蟻危害及防控現(xiàn)狀
- 建筑裝飾裝修施工組織設(shè)計方案(完整版)
評論
0/150
提交評論