Java Web編程技術(shù):JSP訪問數(shù)據(jù)庫_第1頁
Java Web編程技術(shù):JSP訪問數(shù)據(jù)庫_第2頁
Java Web編程技術(shù):JSP訪問數(shù)據(jù)庫_第3頁
Java Web編程技術(shù):JSP訪問數(shù)據(jù)庫_第4頁
Java Web編程技術(shù):JSP訪問數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

JSP訪問數(shù)據(jù)庫【知識目標(biāo)】理解JDBC的概念。掌握J(rèn)DBC連接數(shù)據(jù)庫的步驟。掌握J(rèn)DBC對數(shù)據(jù)庫的操做方法。理解事務(wù)的基本概念。理解JDBC對數(shù)據(jù)庫元數(shù)據(jù)的操作?!灸芰δ繕?biāo)】能配置JDBC數(shù)據(jù)庫驅(qū)動。能完成JDBC連接數(shù)據(jù)庫的操作。能使用JDBC對數(shù)據(jù)庫進行增、刪、查、改。能使用JDBC完成數(shù)據(jù)庫基本事務(wù)操作。能使用JDBC獲取數(shù)據(jù)庫元數(shù)據(jù)。JSP訪問數(shù)據(jù)庫6.1JDBC概述6.2JDBC常用的API接口與類6.3JDBC訪問數(shù)據(jù)庫的步驟6.4JDBC事務(wù)6.5JDBC元數(shù)據(jù)6.1.1JDBC的概念6.1.2JDBC驅(qū)動6.1JDBC概述JDBC的全稱是JavaDatabaseConnectivity(即Java數(shù)據(jù)庫連接),它是一種可以執(zhí)行標(biāo)準(zhǔn)化查詢語言的JavaAPI。Java程序可通過JDBCAPI連接到不同種類的數(shù)據(jù)庫,并使用標(biāo)準(zhǔn)SQL來完成對數(shù)據(jù)庫的查詢、更新。6.1.1JDBC的概念JDBC驅(qū)動程序是JDBCAPI與數(shù)據(jù)庫之間的轉(zhuǎn)換層,負(fù)責(zé)將JDBC調(diào)用轉(zhuǎn)換為特定的數(shù)據(jù)庫訪問。JDBC驅(qū)動的四種連接方式6.1.2JDBC驅(qū)動JDBC相關(guān)的API存在java.sql包中。6.2JDBC常用的API接口與類類或接口功能描述DriverManager類管理數(shù)據(jù)庫中的所有驅(qū)動程序。Connection接口提供創(chuàng)建語句以及管理連接及其屬性的方法。Statement接口用于執(zhí)行數(shù)據(jù)庫的SQL語句。ResultSet接口SQL查詢語句返回的結(jié)果集。PreparedStateme接口用于發(fā)送準(zhǔn)備好的語句或基本SQL語句(繼承自Statement)。Driver接口是所有JDBC驅(qū)動程序必須實現(xiàn)的接口,該接口專門提供給數(shù)據(jù)庫廠商使用。在編寫JDBC程序時,必須要把所使用的數(shù)據(jù)庫驅(qū)動程序或類加載到項目中。6.2JDBC常用的API接口與類

1、Driver接口DriverManager類用來管理數(shù)據(jù)庫中的所有驅(qū)動程序,作用于用戶和驅(qū)動程序之間,跟蹤可用的驅(qū)動程序,并在數(shù)據(jù)庫的驅(qū)動程序之間建立連接。6.2JDBC常用的API接口與類

2、DriverManager類方法功能描述ConnectiongetConnection(Stringurl,Stringuser,Stringpassword)指定三個入口參數(shù)(依次是連接數(shù)據(jù)庫的URL、用戶名和密碼)來獲取與數(shù)據(jù)庫的連接voidsetLoginTimeout(inttime)獲取驅(qū)動程序試圖登錄到某一數(shù)據(jù)庫時可以等待的最長時間,以秒為單位voidprintln(Stringmessage)將一條消息打印到當(dāng)前的JDBC日志流中Connection接口代表與特定的數(shù)據(jù)庫連接,在連接上下文中執(zhí)行SQL語句并返回結(jié)果。6.2JDBC常用的API接口與類

3、Connection接口方法功能描述StatementcreateStatement()創(chuàng)建一個Statement對象PreparedStatementprearedStatement(Stringsql)為指定sql語句創(chuàng)建預(yù)處理對象PreparedStatementvoidcommit()使上一次提交或回滾之后進行的更改成為持久更改,并釋放此Connection對象當(dāng)前所持有的所有數(shù)據(jù)庫鎖voidsetAutoCommit(Booleanflag)設(shè)置對數(shù)據(jù)庫的更改是否為自動提交,true-自動提交,false-手動提交。若不顯式調(diào)用該方法則默認(rèn)是自動提交。voidrollback()回滾當(dāng)前事務(wù)中的所有改動,并釋放當(dāng)前連接持有的數(shù)據(jù)庫鎖voidclose()立即釋放連接對象的數(shù)據(jù)庫和JDBC資源Statement接口用于在已經(jīng)建立連接的基礎(chǔ)上向數(shù)據(jù)庫發(fā)送SQL語句,該接口的對象用于執(zhí)行不帶參數(shù)的簡單的SQL語句。6.2JDBC常用的API接口與類

4、Statement接口方法功能描述ResultSetexecute(Stringsql)執(zhí)行給定的不含參數(shù)的sql語句,返回多個ResultSet對象ResultSetexecuteQuery(Stringsql)執(zhí)行給定的不含參數(shù)的select語句,返回單個ResultSet對象intexecuteUpdate(Stringsql)執(zhí)行給定的不含參數(shù)的update、insert或delete語句,返回方法執(zhí)行后影響的記錄條數(shù)voidclose()釋放Statement對象占用的數(shù)據(jù)庫和JDBC資源PreparedStatment接口繼承自Statement接口,接口對象用于執(zhí)行帶參數(shù)的SQL語句,并保存語句的預(yù)編譯結(jié)果,使再次執(zhí)行語句時效率更高。6.2JDBC常用的API接口與類

5、PreparedStatment接口方法功能描述voidsetType(intindex,typevalue)將序號為index(從1開始編號)的參數(shù)的值設(shè)置為type類型的value,type泛指所有數(shù)據(jù)類型,如String、double,int等voidsetNull(intindex,intsqlType)將序號為index的參數(shù)的值設(shè)置為sqlType類型的空值,sqlType為java.sql.Types中定義的SQL類型ResultSetexecuteQuery()執(zhí)行PreparedStatment對象中包含的預(yù)編譯的含參數(shù)的select語句,返回單個ResultSet對象intexecuteUpdate()執(zhí)行PreparedStatment對象中包含的預(yù)編譯的含參數(shù)的update、insert或delete語句,返回方法執(zhí)行后影響的記錄條數(shù)ResultSet接口對象類似于一個臨時表(實際上也是一個緩存區(qū)),用來暫時存放數(shù)據(jù)庫查詢操作所獲得的結(jié)果集。ResultSet對象具有用于指向記錄的指針,指針?biāo)赣涗浄Q為當(dāng)前行記錄,指針開始的位置在第一條記錄之前。6.2JDBC常用的API接口與類

6、ResultSet接口6.2JDBC常用的API接口與類

6、ResultSet接口方法功能描述typegetType(intcolumnIndex)獲取ResultSet對象當(dāng)前行列號為columnIndex列的值,type泛指所有數(shù)據(jù)類型,如String、double,int等typegetType(StringcolumnLabel)獲取ResultSet對象當(dāng)前行列名為columnLabel列的值,type泛指所有數(shù)據(jù)類型,如String、double,int等booleanfirst() 將指針移到當(dāng)前記錄的第一行booleanlast()將指針移到當(dāng)前記錄的最后一行booleannext()將指針向下移一行booleanbeforeFirst()將指針移到數(shù)據(jù)集的開頭(第一行之前的位置)booleanafterLast()將指針移到數(shù)據(jù)集的尾部(最后一行之后的位置)booleanabsolute(intindex)將指針移到數(shù)據(jù)集給定編號index的行6.2JDBC常用的API接口與類

6、ResultSet接口方法功能描述booleanisFirst()判斷指針是否位于當(dāng)前數(shù)據(jù)集的第一行。如果是返回true,否則返回falsebooleanisLast()判斷指針是否位于當(dāng)前數(shù)據(jù)集的最后一行。如果是返回true,否則返回falsevoidupdateType(intcolumnIndex,typevalue)用type類型的值value更新當(dāng)前行列號為columnIndex列的值。type泛指所有數(shù)據(jù)類型,如String、double,int等voidupdateType(StringcolumnLabel,typevalue)用type類型的值value更新當(dāng)前行列名為columnLabel列的值。type泛指所有數(shù)據(jù)類型,如String、double,int等intgetRow()獲取當(dāng)前行的行號voidinsertRow()將數(shù)據(jù)集中新插入行的內(nèi)容插入到數(shù)據(jù)庫voidupdateRow()將對數(shù)據(jù)集中當(dāng)前行修改后的內(nèi)容同步到數(shù)據(jù)庫voiddeleteRow()刪除數(shù)據(jù)集中的當(dāng)前行,但是不同步到數(shù)據(jù)庫中,而是在執(zhí)行close()方法之后同步到數(shù)據(jù)庫中voidclose()釋放數(shù)據(jù)集對象占用的數(shù)據(jù)庫和JDBC資源6.3.1加載數(shù)據(jù)庫驅(qū)動6.3.2獲取數(shù)據(jù)庫連接6.3.3創(chuàng)建執(zhí)行語句對象6.3.4執(zhí)行SQL語句并處理執(zhí)行結(jié)果6.3.5異常處理及釋放資源6.3JDBC訪問數(shù)據(jù)庫的步驟方法調(diào)用語句:常見數(shù)據(jù)庫的驅(qū)動程序字符串示例:6.3.1加載數(shù)據(jù)庫驅(qū)動Class.forName(StringDriverName);數(shù)據(jù)庫驅(qū)動程序字符串MySQLcom.mysql.jdbc.DriverSQLServer2000及以上com.microsoft.sqlserver.jdbc.SQLServerDriverOracle9i及以上oracle.jdbc.driver.OracleDriverJDBC-ODBC橋接sun.jdbc.odbc.JdbcOdbcDriverClass.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Class.forName("com.mysql.jdbc.Driver");注意:如果采用JDBC-ODBC橋接方式注冊數(shù)據(jù)庫驅(qū)動程序,需要確保已完成對ODBC數(shù)據(jù)源的配置。如果采用純JDBC驅(qū)動方式注冊數(shù)據(jù)庫驅(qū)動程序,需要到相應(yīng)的數(shù)據(jù)庫廠商網(wǎng)站上下載廠商驅(qū)動程序(即驅(qū)動jar包),或從數(shù)據(jù)庫安裝目錄下找到相應(yīng)的廠商驅(qū)動包,拷貝到如圖所示項目的WEB-INF/lib目錄下。6.3.1加載數(shù)據(jù)庫驅(qū)動MySQL驅(qū)動jar包SQLServer驅(qū)動jar包創(chuàng)建連接對象的語句格式:常見數(shù)據(jù)庫的連接字符串(模板)6.3.2獲取數(shù)據(jù)庫連接Connection對象名=DriverManager.getConnection(Stringurl,Stringuser,Stringpassword);數(shù)據(jù)庫連接字符串(模板)MySQLjdbc:mysql://數(shù)據(jù)庫服務(wù)器IP:3306/數(shù)據(jù)庫名SQLServer2000及以上jdbc:sqlserver://數(shù)據(jù)庫服務(wù)器IP:1433;DatabaseName=數(shù)據(jù)庫名Oracle9i及以上jdbc:oracle:thin:@數(shù)據(jù)庫服務(wù)器IP:1521:數(shù)據(jù)庫名JDBC-ODBC橋接jdbc:odbc:數(shù)據(jù)源名示例:6.3.2獲取數(shù)據(jù)庫連接//創(chuàng)建MySQL數(shù)據(jù)庫education的連接對象conn,數(shù)據(jù)庫登錄用戶名為root,密碼為mysql2018Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/education",

"root","mysql2018");//創(chuàng)建SQLServer數(shù)據(jù)庫education的連接對象conn,數(shù)據(jù)庫登錄用戶名為sa,密碼為sql123.Connectionconn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");創(chuàng)建語句的語法格式:示例6.3.3創(chuàng)建執(zhí)行語句對象

1、創(chuàng)建Statement對象Statement對象名=Connection對象.createStatement();//使用連接對象conn創(chuàng)建執(zhí)行語句對象smStatementsm=conn.createStatement();PreparedStatement接口是Statement接口的子接口,用于發(fā)送準(zhǔn)備好的基本SQL語句。優(yōu)點:因為該接口對象中包含的SQL語句是預(yù)編譯的,因此當(dāng)需要多次執(zhí)行同一條SQL語句時,可以大大提高執(zhí)行效率;可以防止注入式攻擊。創(chuàng)建語句的語法格式:6.3.3創(chuàng)建執(zhí)行語句對象

2、創(chuàng)建PreparedStatement對象PreparedStatement對象名=Connection對象.prepareStatement(Stringsql);調(diào)用prepareStatement()方法時設(shè)置的參數(shù)即是要執(zhí)行的SQL語句,需要注意的是,如果該SQL語句可具有一個或多個待賦值的IN參數(shù),其中每個IN參數(shù)用“?”作為占位符,然后在創(chuàng)建了PreparedStatement對象后,再使用該PreparedStatement對象調(diào)用方法用參數(shù)值去替換“?”。示例:6.3.3創(chuàng)建執(zhí)行語句對象

2、創(chuàng)建PreparedStatement對象//根據(jù)專業(yè)查詢學(xué)生表中的全部學(xué)生Stringsql="SELECT*FROMstudentWHEREmajor=?";//使用連接對象conn創(chuàng)建預(yù)執(zhí)行語句對象psPreparedStatementps=conn.prepareStatement(sql);

//將ps預(yù)執(zhí)行的SQL語句中第1個IN參數(shù)設(shè)置為變量major的值ps.setString(1,major);要實現(xiàn)對數(shù)據(jù)庫信息的查詢(Select語句),需要執(zhí)行語句對象調(diào)用executeQuery()方法并將查詢后的結(jié)果放入數(shù)據(jù)集ResultSet類的對象中,然后根據(jù)實際需要對得到的數(shù)據(jù)集對象(類似一張二維表,一行對應(yīng)一條查詢記錄)進行逐行處理。創(chuàng)建數(shù)據(jù)集對象方法1:創(chuàng)建數(shù)據(jù)集對象方法2:6.3.4執(zhí)行SQL語句并處理執(zhí)行結(jié)果

1、查詢數(shù)據(jù)信息ResultSet對象名=Statement對象.executeQuery(Stringsql);ResultSet對象名=PreparedStatement對象.executeQuery();【例6-3-1】:使用Statement對象查詢指定數(shù)據(jù)庫表信息<html><head><metacharset="UTF-8"><title>輸入數(shù)據(jù)</title></head><body><formaction="select_Sta.jsp"method="post>

請輸入專業(yè)名稱:<inputname="major"type="text">

<inputtype="submit"value="確定"></form></body></html>input.html【例6-3-1】:使用Statement對象查詢指定數(shù)據(jù)庫表信息<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%>

<html><body><tableborder="1">

<tr><th>學(xué)號</th><th>姓名</th><th>學(xué)院</th></tr><%request.setCharacterEncoding("UTF-8");Stringmajor=request.getParameter("major");if(major==null||major==""){major="軟件與信息服務(wù)";}//1、加載SQLServer數(shù)據(jù)庫的驅(qū)動Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//2、創(chuàng)建連接本機數(shù)據(jù)庫education的連接對象connConnectionconn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");

select_Sta.jsp【例6-3-1】:使用Statement對象查詢指定數(shù)據(jù)庫表信息//3、使用連接對象conn創(chuàng)建執(zhí)行語句對象smStatementsm=conn.createStatement();//4.1、編寫查詢SQL語句:根據(jù)指定專業(yè)查詢學(xué)生信息(學(xué)號、姓名、學(xué)院)Stringsql="SELECTstudentId,sname,collegeFROMstudentWHEREmajor='"+major+"'";//4.2、通過執(zhí)行語句對象sm執(zhí)行指定SQL語句并生成數(shù)據(jù)集對象rsResultSetrs=sm.executeQuery(sql);

//4.3、循環(huán)輸出數(shù)據(jù)集rs中所有數(shù)據(jù)while(rs.next()){//逐行移動數(shù)據(jù)集對象rs的游標(biāo),直至最后%>

<tr>

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

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

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

</tr><%}%></table></body></html>select_Sta.jsp【例6-3-1】:使用Statement對象查詢指定數(shù)據(jù)庫表信息【例6-3-2】:使用PreparedStatement對象查詢指定數(shù)據(jù)庫表信息<html><head><metacharset="UTF-8"><title>輸入數(shù)據(jù)</title></head><body><formaction="select_Pre..jsp"method="post>

請輸入專業(yè)名稱:<inputname="major"type="text">

<inputtype="submit"value="確定"></form></body></html>input.html【例6-3-2】:使用PreparedStatement對象查詢指定數(shù)據(jù)庫表信息<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%>

<html><body><tableborder="1">

<tr><th>學(xué)號</th><th>姓名</th><th>學(xué)院</th></tr><%request.setCharacterEncoding("UTF-8");Stringmajor=request.getParameter("major");if(major==null||major==""){major="軟件與信息服務(wù)";}//1、加載SQLServer數(shù)據(jù)庫的驅(qū)動Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//2、創(chuàng)建連接本機數(shù)據(jù)庫education的連接對象connConnectionconn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");

select_Pre.jsp【例6-3-2】:使用PreparedStatement對象查詢指定數(shù)據(jù)庫表信息select_Pre.jsp//3.1、編寫查詢SQL語句:根據(jù)指定專業(yè)查詢學(xué)生信息(學(xué)號、姓名、學(xué)院)Stringsql="SELECTstudentId,sname,collegeFROMstudentWHEREmajor=?";

//3.2、使用連接對象conn創(chuàng)建預(yù)執(zhí)行語句對象psPreparedStatementps=conn.prepareStatement(sql);//3.3、將ps預(yù)執(zhí)行的SQL語句中第1個IN參數(shù)設(shè)置為變量major的值ps.setString(1,major);

//4、通過預(yù)執(zhí)行語句對象ps執(zhí)行指定SQL語句并生成數(shù)據(jù)集對象rsResultSetrs=ps.executeQuery();while(rs.next()){//逐行移動數(shù)據(jù)集對象rs的游標(biāo),直至最后%>

<tr>

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

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

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

</tr><%}%></table></body></html>【例6-3-2】:使用PreparedStatement對象查詢指定數(shù)據(jù)庫表信息要實現(xiàn)對數(shù)據(jù)庫信息的修改(Insert、Update和Delete),都是使用執(zhí)行語句對象調(diào)用executeUpdate()方法來執(zhí)行指定的SQL語句,該方法調(diào)用后會返回一個整型值,該值即是執(zhí)行SQL語句后對數(shù)據(jù)庫表產(chǎn)生影響的信息記錄條數(shù)。執(zhí)行指定SQL語句方法1:執(zhí)行指定SQL語句方法2:6.3.4執(zhí)行SQL語句并處理執(zhí)行結(jié)果

2、修改數(shù)據(jù)信息int變量名=Statement對象.executeUpdate(Stringsql);int變量名=PreparedStatement對象.executeUpdate();【例6-3-3】:使用Statement對象插入一條信息到指定數(shù)據(jù)庫表insert_Sta.jsp<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><html><body><%StringstudentId=request.getParameter("studentId");//學(xué)生學(xué)號if(studentId==null||studentId==""){studentId="401";}//1、加載SQLServer數(shù)據(jù)庫的驅(qū)動Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//2、創(chuàng)建連接本機數(shù)據(jù)庫education的連接對象connConnectionconn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");//3、使用連接對象conn創(chuàng)建執(zhí)行語句對象smStatementsm=conn.createStatement();【例6-3-3】:使用Statement對象插入一條信息到指定數(shù)據(jù)庫表insert_Sta.jsp//4.1、編寫查詢SQL語句:向student表中插入一條學(xué)生記錄Stringsql="Insertintostudentvalues('"+studentId+"','王明','人工智能與大數(shù)據(jù)','軟件工程',)";//4.2、通過執(zhí)行語句對象sm執(zhí)行指定SQL語句并返回影響記錄條數(shù)intcount=sm.executeUpdate(sql);//4.3、處理執(zhí)行結(jié)果:影響記錄條數(shù)不為0則記錄插入成功否則插入失敗if(count!=0){

out.println("數(shù)據(jù)信息插入成功!");}else{out.println("數(shù)據(jù)信息插入失??!");}%></body></html>【例6-3-4】:使用PreparedStatement對象插入一條信息到指定數(shù)據(jù)庫表insert_Pre.jsp<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><html><body><%StringstudentId=request.getParameter("studentId");//學(xué)生學(xué)號if(studentId==null||studentId==""){studentId="402";}//1、加載SQLServer數(shù)據(jù)庫的驅(qū)動Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//2、創(chuàng)建連接本機數(shù)據(jù)庫education的連接對象connConnectionconn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");【例6-3-4】:使用PreparedStatement對象插入一條信息到指定數(shù)據(jù)庫表//3.1、編寫查詢SQL語句:向student表中插入一條學(xué)生記錄Stringsql="Insertintostudentvalues(?,'李曉紅','人工智能與大數(shù)據(jù)','移動應(yīng)用開發(fā)',)";//3.2、使用連接對象conn創(chuàng)建預(yù)執(zhí)行語句對象psPreparedStatementps=conn.prepareStatement(sql);//3.3、將ps預(yù)執(zhí)行的SQL語句中第1個IN參數(shù)設(shè)置為變量studentId的值ps.setString(1,studentId);

//4、通過預(yù)執(zhí)行語句對象ps執(zhí)行指定SQL語句并返回影響記錄條數(shù)intcount=ps.executeUpdate();if(count!=0){//影響記錄條數(shù)不為0則記錄插入成功否則插入失敗out.println("數(shù)據(jù)信息插入成功!");}else{out.println("數(shù)據(jù)信息插入失?。?);}%></body></html>insert_Pre.jsp通常的做法是使用try-catch-finally語句結(jié)構(gòu),將JDBC訪問數(shù)據(jù)庫的所有操作代碼放入try語句塊中,根據(jù)可能出現(xiàn)的異常情況使用1個到多個catch語句塊對各類異常進行處理,并在finally語句塊中關(guān)閉數(shù)據(jù)庫連接對象等一系列在JDBC操作中創(chuàng)建的對象。6.3.5異常處理及釋放資源【例6-3-5】:在JDBC操作中加入異常處理并及時釋放資源<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><html><body><%StringstudentId=request.getParameter("studentId");//學(xué)生學(xué)號if(studentId==null||studentId==""){studentId="401";}Connectionconn=null;//聲明數(shù)據(jù)連接對象connStatementsm=null;//聲明執(zhí)行語句對象smtry{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");sm=conn.createStatement();Stringsql="Insertintostudentvalues('"+studentId+"','王明','人工智能與大數(shù)據(jù)','軟件工程',)";intcount=sm.executeUpdate(sql);if(count!=0)out.println("數(shù)據(jù)信息插入成功!");elseout.println("數(shù)據(jù)信息插入失?。?);}catch(Exceptionex){out.println("數(shù)據(jù)庫操作發(fā)生異常,數(shù)據(jù)信息插入失?。?);}finally{if(sm!=null)sm.close();//如果執(zhí)行語句對象sm已創(chuàng)建則關(guān)閉該對象

if(conn!=null)conn.close();//如果數(shù)據(jù)連接對象conn已創(chuàng)建則關(guān)閉該對象}%></body></html>6.4.1什么事務(wù)6.4.2JDBC事務(wù)操作6.4JDBC事務(wù)事務(wù)是由一步或幾步數(shù)據(jù)庫操作序列組成的邏輯執(zhí)行單元,這系列操作要么全部執(zhí)行,要么全部放棄執(zhí)行。事務(wù)具備4個特性:原子性:事務(wù)是應(yīng)用中不可再分的最小邏輯執(zhí)行體。一致性:事務(wù)執(zhí)行的結(jié)果,使數(shù)據(jù)庫從一個一致狀態(tài),變到另一個一致的狀態(tài)。隔離性:各個事務(wù)的執(zhí)行互不干擾。持續(xù)性:事務(wù)對數(shù)據(jù)做的任何改變都要記錄到永久存儲器中。6.4.1什么事務(wù)當(dāng)事務(wù)所包含的全部數(shù)據(jù)庫操作都成功執(zhí)行后,應(yīng)該提交事務(wù),使這些修改永久生效。事務(wù)提交有以下兩種方式:顯式提交:使用commit()方法。自動提交:執(zhí)行DDL或DCL語句,或者程序正常退出。當(dāng)事務(wù)所包含的任意個數(shù)據(jù)庫操作執(zhí)行失敗后,應(yīng)該回滾事務(wù),使該事務(wù)中所做的修改全部失效。事務(wù)回滾有以下兩種方式:顯式回滾:使用rollback()方法。自動回滾:系統(tǒng)錯誤或者強行退出。6.4.1什么事務(wù)JDBC事務(wù)操作的方法都位于java.sql.Connection中。JDBC的事務(wù)操作默認(rèn)是自動提交。6.4.2JDBC事務(wù)操作try{連接對象.setAutoCommit(false);//將自動提交設(shè)置為false

執(zhí)行語句對象.executeUpdate(SQL1);//執(zhí)行修改操作執(zhí)行語句對象.executeQuery(SQL2);//執(zhí)行查詢操作……連接對象.commit();//當(dāng)多個操作成功后手動提交}catch(Exceptione){連接對象.rollback();//一旦其中一個操作異常都將回滾,使多個操作都不成功}【例6-4-1】:使用JDBC的事務(wù)操作向數(shù)據(jù)表插入多條數(shù)據(jù)記錄<%StringstudentId=request.getParameter("studentId");//學(xué)生學(xué)號if(studentId==null||studentId==""){studentId="100";}Connectionconn=null;Statementsm=null;try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");sm=conn.createStatement();Stringsql1="Insertintostudentvalues('"+studentId+"','王明','人工智能與大數(shù)據(jù)','軟件工程',)";Stringsql2="Insertintostudentvalues('"+(Integer.parseInt(studentId)+1)+"','李志','人工智能與大數(shù)據(jù)','軟件與信息服務(wù)','')"; conn.setAutoCommit(false);//將自動提交設(shè)置為false

intcount1=sm.executeUpdate(sql1);//執(zhí)行指定SQL語句1并返回影響記錄條數(shù)

intcount2=sm.executeUpdate(sql2);//執(zhí)行指定SQL語句2并返回影響記錄條數(shù)mit();//當(dāng)兩個操作成功后手動提交

out.println("成功插入"+(count1+count2)+"條數(shù)據(jù)信息!");}catch(Exceptionex){conn.rollback();//一旦其中一個操作出錯都將回滾,使兩個操作都不成功out.println("數(shù)據(jù)庫操作發(fā)生異常,數(shù)據(jù)信息插入失敗!");}finally{if(sm!=null)sm.close();//如果執(zhí)行語句對象sm已創(chuàng)建則關(guān)閉該對象

if(conn!=null)conn.close();//如果數(shù)據(jù)連接對象conn已創(chuàng)建則關(guān)閉該對象}%>在插入學(xué)號101時引發(fā)異常,導(dǎo)致兩條數(shù)據(jù)都未插入數(shù)據(jù)庫的元數(shù)據(jù):描述數(shù)據(jù)庫中信息的數(shù)據(jù),例如當(dāng)前數(shù)據(jù)庫中有多少張表、某個表的結(jié)構(gòu)如何等。分類:數(shù)據(jù)庫元數(shù)據(jù)(DatabaseMetaData)參數(shù)元數(shù)據(jù)(ParameterMetaData)結(jié)果集元數(shù)據(jù)(ResultSetMetaData)6.5JDBC元數(shù)據(jù)通過JDBC的數(shù)據(jù)連接類Connection對象的getMetaData()方法,可獲得數(shù)據(jù)庫對應(yīng)元數(shù)據(jù)接口DatabaseMetaData的對象,該類常用方法如表所示,通過DatabaseMetaData類對象調(diào)用相應(yīng)方法就可以獲取數(shù)據(jù)庫基本信息。6.5JDBC元數(shù)據(jù)

1、數(shù)據(jù)庫元數(shù)據(jù)方法功能描述StringgetDatabaseProductName()返回數(shù)據(jù)庫的產(chǎn)品名稱StringgetDatabaseProductVersion()返回數(shù)據(jù)庫的版本號StringgetDriverName()返回驅(qū)動程序的名稱StringgetURL()返回數(shù)據(jù)庫的URL【例6-5-1】:獲取數(shù)據(jù)庫元數(shù)據(jù)<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><html><body><%Connectionconn=null;try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");DatabaseMetaDatadbMetaData=conn.getMetaData();out.println("數(shù)據(jù)庫的產(chǎn)品名稱:"+dbMetaData.getDatabaseProductName()+"<br>");out.println("數(shù)據(jù)庫的版本號:"+dbMetaData.getDatabaseProductVersion()+"<br>");out.println("數(shù)據(jù)庫驅(qū)動程序:"+dbMetaData.getDriverName()+"<br>");out.println("數(shù)據(jù)庫的URL:"+dbMetaData.getURL()+"<br>");}catch(Exceptionex){out.println("數(shù)據(jù)庫操作發(fā)生異常,數(shù)據(jù)信息查詢失??!");}finally{

if(conn!=null)conn.close();}%></body></html>通過接口PreparedStatement的對象調(diào)用getParameterMetaData()方法可以獲得ParameterMetaData的對象,此類元數(shù)據(jù)用于獲取PreparedStatement接口對象包含的預(yù)編譯SQL語句的一些信息,該類的常用方法如表所示。6.5JDBC元數(shù)據(jù)

2、參數(shù)元數(shù)據(jù)方法功能描述intgetParameterCount()獲取預(yù)編譯SQL語句的參數(shù)的個數(shù)StringgetParameterClassName(intindex)獲取預(yù)編譯SQL語句index號參數(shù)的類型名StringgetParameterTypeName(intindex)獲得預(yù)編譯SQL語句index號參數(shù)的SQL類型【例6-5-2】:獲取參數(shù)元數(shù)據(jù)<%Connectionconn=null;PreparedStatementps=null;

try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=education","sa","sql123.");Stringsql="SELECTstudentId,sname,collegeFROMstudentWHEREmajor=?";

ps=conn.prepareStatement(sql);ParameterMetaDatapMetaData=ps.getParameterMetaData();out.println("SQL語句的參數(shù)個數(shù):"+pMetaData.getParameterCount()+"<br>");out.println("SQL語句參數(shù)1的類名:"+pMetaData.getParameterClassName(1)+"<br>");out.println("SQL語句參數(shù)1的sql類型:"+pMetaData.getParameterTypeName(1)+"<br>");}catch(Exceptionex){out.println("數(shù)據(jù)庫操作發(fā)生異常,數(shù)據(jù)信息查詢失敗!");}finally{

if(ps!=null)ps.close();

if(conn!=null)conn.close();象}%>通過數(shù)據(jù)集類Res

溫馨提示

  • 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

提交評論