版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
5.1JDBC概述JDBC(JavaDataBaseConnection)是Java數(shù)據(jù)庫訪問API的統(tǒng)稱,主要完成以下功能:與一個數(shù)據(jù)庫建立連接。向數(shù)據(jù)庫發(fā)送SQL語句。處理數(shù)據(jù)庫返回的結(jié)果。5.1JDBC概述JDBC(JavaDataBaseCJDBCAPI在java.sql包中主要提供了以下接口JDBCAPI在java.sql包中主要提供了以下接口JDBC的結(jié)構(gòu)JDBC有兩種接口,分別是面向開發(fā)人員的JDBCAPI和面向低層的JDBCDriverAPIJDBCAPI是一系列的接口,它使得應(yīng)用程序能夠進行數(shù)據(jù)庫聯(lián)接,執(zhí)行SQL語句,并且得到返回結(jié)果。JDBC的結(jié)構(gòu)JDBC有兩種接口,分別是面向開發(fā)人員的JDBJDBC的結(jié)構(gòu)java.sql.DriverManager用來裝載驅(qū)動程序,并且為創(chuàng)建新的數(shù)據(jù)庫連接提供支持。java.sql.Connection完成對某一指定數(shù)據(jù)庫的連接。java.sql.Statement在一個給定的連接中作為SQL執(zhí)行聲明的容器,它包含了兩個重要的子類型。java.sql.PreparedSatement用于執(zhí)行預(yù)編譯的sql聲明java.sql.CallableStatement用于執(zhí)行數(shù)據(jù)庫中存儲過程的調(diào)用java.sql.ResultSet對于給定聲明取得結(jié)果的途徑JDBC的結(jié)構(gòu)java.sql.DriverManager用JDBC接口之間的關(guān)系JDBC接口之間的關(guān)系5.2JDBCAPI的應(yīng)用
1、訪問數(shù)據(jù)庫的基礎(chǔ)2、JDBC應(yīng)用實例3、ResultSet的高級應(yīng)用5.2JDBCAPI的應(yīng)用
1、訪問數(shù)據(jù)庫的基礎(chǔ)訪問數(shù)據(jù)庫的步驟1.加載驅(qū)動程序2.連接數(shù)據(jù)庫3.執(zhí)行SQL語句4.通過ResultSet獲取select語句執(zhí)行的結(jié)果并處理Class.forName()方法DriverManager.getConnection()方法通過Statement執(zhí)行(select、insert、update和delete)通過ResultSet獲取select語句執(zhí)行的結(jié)果并處理訪問數(shù)據(jù)庫的步驟1.加載驅(qū)動程序2.連接數(shù)據(jù)庫3.執(zhí)行SQLStatement的使用
創(chuàng)建:connection.createStatement([…])執(zhí)行select查詢語句:statement.executeQuery(“查詢語句")執(zhí)行insert、update、delete等更新語句:statement.executeUpdate(“更新語句”)如executeUpdate("insertintoMyFriend(name,age,qq)values(‘"+name+"',"+age+",'"+qq+"')")name=“abc”,age=20,qq=“1234”時執(zhí)行如下SQL語句insertintoMyFriend(name,age,qq)values('abc',20,'1234')Statement的使用
創(chuàng)建:connection.creResultSet的使用
創(chuàng)建:executeQuery("SQL語句")定位記錄:next()方法訪問數(shù)據(jù):getXXX(int)或getXXX(String)其中XXX為一數(shù)據(jù)類型名稱,int為列編號(從1開始編號),String為列名。如getInt(2),getString("name")對照INT、INTEGER getInt()TINYINT、SMALLINT getShort()BIGINT getLong()DATE getDate()CHAR、VARCHAR getString()FLOAT getFloat()ResultSet的使用
創(chuàng)建:executeQuery("JAVA訪問數(shù)據(jù)庫示例1讀入ACCESS數(shù)據(jù)庫的內(nèi)容數(shù)據(jù)庫LIB.mdb表userJAVA訪問數(shù)據(jù)庫示例1讀入ACCESS數(shù)據(jù)庫的內(nèi)容JDBC-ODBC
方法
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon=DriverManager.getConnection("jdbc:odbc:tt");Statementsql=con.createStatement();ResultSetrs=sql.executeQuery("select*fromuser");while(rs.next()){System.out.print(rs.getInt("ID")+"\t");System.out.print(rs.getString(2)+"\t");System.out.print(rs.getString(3)+"\t");System.out.print(rs.getInt(4)+"\t");System.out.print(rs.getInt(5)+"\t");System.out.println(rs.getDate(6));}rs.close();sql.close();con.close();建立ODBC-名稱為ttJDBC-ODBC
方法
Class.forName("su多種方法訪問數(shù)據(jù)庫通過JSP訪問數(shù)據(jù)庫通過Servlet訪問數(shù)據(jù)庫通過JavaBean訪問多種方法訪問數(shù)據(jù)庫通過JSP訪問數(shù)據(jù)庫JSP
訪問數(shù)據(jù)庫<%@pageimport="java.sql.*"%><h2>JDBC實例:通過JSP訪問數(shù)據(jù)庫</h2><hr><%Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon=DriverManager.getConnection("jdbc:odbc:tt");Statementsql=con.createStatement();ResultSetrs=sql.executeQuery("select*fromuser");if(rs.next()){%>
<%}//if結(jié)束%>jsp.jspJSP
訪問數(shù)據(jù)庫<%@pageimport="javaJSP
訪問數(shù)據(jù)庫if(rs.next()){%><tableborder=1><tr><th>序號</th><th>姓名</th><th>電話</th><th>年齡</th><th>QQ</th><th>日期</th></tr><%do{out.println("<tr>");out.println("<td>"+rs.getString(1)+"</td>");out.println("<td>"+rs.getString(2)+"</td>");out.println("<td>"+rs.getString(3)+"</td>");out.println("<td>"+rs.getString(4)+"</td>");out.println("<td>"+rs.getString(5)+"</td>");out.println("<td>"+rs.getString(6)+"</td>");out.println("</tr>");}while(rs.next());%></table>jsp.jspJSP
訪問數(shù)據(jù)庫if(rs.next()){%>jspServlet
訪問數(shù)據(jù)庫protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("<h2>JDBC實例:通過Servlet訪問數(shù)據(jù)庫</h2><hr>");try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon=DriverManager.getConnection("jdbc:odbc:tt");Statementsql=(Statement)con.createStatement();
ResultSetrs=sql.executeQuery("select*fromuser");if(rs.next()){}//if結(jié)束
}catch(Exceptione){out.println(e);}}Servlet.javaServlet
訪問數(shù)據(jù)庫protectedvoiddServlet
訪問數(shù)據(jù)庫out.println("<tableborder=1>");out.println("<tr><th>序號</th><th>姓名</th>");out.println("<th>電話</th><th>年齡</th>");out.println("<th>QQ</th><th>日期</th></tr>");do{out.println("<tr>");out.println("<td>"+rs.getString(1)+"</td>");out.println("<td>"+rs.getString(2)+"</td>");out.println("<td>"+rs.getString(3)+"</td>");out.println("<td>"+rs.getString(4)+"</td>");out.println("<td>"+rs.getString(5)+"</td>");out.println("<td>"+rs.getString(6)+"</td>");out.println("</tr>");}while(rs.next());out.println("</table>");Servlet.javaServlet
訪問數(shù)據(jù)庫ou通過JavaBean訪問packagemybean;importjava.sql.*;publicclassDBConnection{privateConnectionconn;publicvoidinit(StringclassName,StringURL){try{Class.forName(className);conn=DriverManager.getConnection(URL);}catch(Exceptione){System.out.println(e);}}publicConnectiongetConnection(){returnconn;}}DBConnection.java通過JavaBean訪問packagemybean;DB通過JavaBean訪問<h2>JDBC實例:通過JavaBean訪問數(shù)據(jù)庫</h2><hr><jsp:useBeanid="dbcon"class="mybean.DBConnection"/><%dbcon.init("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:tt");Connectioncon=dbcon.getConnection();Statementsql=con.createStatement();ResultSetrs=sql.executeQuery("select*fromuser");if(rs.next()){%><tableborder=1><tr><th>序號</th><th>姓名</th><th>電話</th><th>年齡</th><th>QQ</th><th>日期</th></tr><%do{out.println("<tr>");out.println("<td>"+rs.getString(1)+"</td>");……out.println("<td>"+rs.getString(6)+"</td>");out.println("</tr>");}while(rs.next());%></table><%}//if結(jié)束
%>JavaBean.JSP通過JavaBean訪問<h2>JDBC實例:通過Jav可滾動的ResultSet通過createStatement(int,int)創(chuàng)建Statement時可以指定第一個參數(shù)指定游標(biāo)類型可為下面的值,以便支持可滾動的記錄集ResultSet.TYPE_FORWARD_ONLY:默認的cursor類型,僅僅支持向前forward,不支持backforward,random,last,first操作,類似單向鏈表。不可滾動的記錄集,數(shù)據(jù)庫發(fā)生變化時不可見。是效率最高最快的cursor類型ResultSet.TYPE_SCROLL_INSENSITIVE:支持backforward,random,last,first操作,對其它數(shù)據(jù)session對選擇數(shù)據(jù)做出的更改是不敏感,不可見的??蓾L動的記錄集,數(shù)據(jù)庫的變化不可見ResultSet.TYPE_SCROLL_SENSITIVE:支持backforward,random,last,first操作,對其它數(shù)據(jù)session對選擇數(shù)據(jù)做出的更改是敏感,可見的。可滾動的記錄集,數(shù)據(jù)庫的變化可見。移動記錄指針的方法包括next()、last()、previous()、first()等等??蓾L動的ResultSet通過createStatement游標(biāo)類型總結(jié)1TYPE_FORWARD_ONLY通常是效率最高最快的cursor類型,也是最常用的選擇。
2TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的記錄實體,在大量記錄集返回時慎用。3TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的記錄rowid,需要進行二次查詢,效率最低,開銷最大游標(biāo)類型總結(jié)1TYPE_FORWARD_ONLY通常是效率最可更新的ResultSet通過createStatement(int,int)創(chuàng)建Statement時可以指定第二個參數(shù)為下面的值,以便支持可更新的記錄集ResultSet.CONCUR_READ_ONLY:記錄集不可更新ResultSet.CONCUR_UPDATABLE:記錄集可更新更新記錄的方法包括updateInt(int,int)、updateInt(String,int)、updateRow()、insertRow()、deleteRow()等等??筛碌腞esultSet通過createStatement其他類型數(shù)據(jù)庫的驅(qū)動程序MySQL驅(qū)動程序及URL:驅(qū)動:com.mysql.jdbc.Driverurl:jdbc:mysql://:3306/myfriendSQLServer驅(qū)動程序及URL:驅(qū)動:com.microsoft.sqlserver.jdbc.SQLServerDriverurl:jdbc:sqlserver://localhost:1433;databaseName=myfriend;user=MyUserName;password=*****;Oracle驅(qū)動程序及URL:驅(qū)動:oracle.jdbc.driver.OracleDriverurl:jdbc:oracle:thin@:myfriend其他類型數(shù)據(jù)庫的驅(qū)動程序MySQL驅(qū)動程序及URL:5.3連接池、DataSource及其應(yīng)用1數(shù)據(jù)庫連接池傳統(tǒng)的JDBCAPI訪問數(shù)據(jù)庫時,需要頻繁建立數(shù)據(jù)庫連接Connection對象,導(dǎo)致系統(tǒng)的整體性能降低。數(shù)據(jù)庫連接池(ConnectionPool)是一種數(shù)據(jù)庫連接共享技術(shù)。數(shù)據(jù)庫連接池的基本思想是為數(shù)據(jù)庫連接建立一個“緩沖池”,即初始化連接池時在緩沖池中創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接。當(dāng)應(yīng)用組件需要獲取數(shù)據(jù)庫連接時,只需從緩沖池中取出一個,使用完畢之后再釋放到連接池中。數(shù)據(jù)庫連接池在初始化時創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接,其數(shù)量由最小數(shù)據(jù)庫連接數(shù)來設(shè)定。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這些連接。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了連接池能建立的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時,這些請求將被加入到等待隊列中。5.3連接池、DataSource及其應(yīng)用1數(shù)據(jù)庫連接池連接池原理實驗
<%@pageimport="java.sql.*"contentType="text/html"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>連接池舉例</title></head><body><h1>數(shù)據(jù)庫連接池實例</h1><hr><li><ahref="useloops.jsp?loops=50000">使用連接池連接50000次</a><br><li><ahref="noloops.jsp?loops=50">不使用連接池連接50次</a></body></html>index.jsp連接池原理實驗
<%@pageimport="java.s連接池類
ConnectionPoolpackagedb;importjava.sql.*;*importjava.util.Vector;publicclassConnectionPool{privateVector<Connection>pool;privateintpoolSize=10;privatestaticConnectionPoolinstance=null;publicstaticConnectionPoolgetInstance(){if(instance==null){instance=newConnectionPool();}returninstance;}《1》連接池類
ConnectionPoolpackaged連接池類
ConnectionPoolprivateConnectionPool(){pool=newVector<Connection>(poolSize);Connectionconn=null;for(inti=0;i<poolSize;i++){try{Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:odbc:tt");pool.add(conn);}catch(Exceptione){e.printStackTrace();}}}《2》連接池類
ConnectionPoolpriva連接池類
ConnectionPoolpublicsynchronizedConnectiongetConnection(){if(pool.size()>0){Connectionconn=pool.get(0);pool.remove(conn);returnconn;}else{returnnull;}}publicsynchronizedvoidrelease(Connectionconn){pool.add(conn);}}《3》連接池類
ConnectionPoolpublics使用連接池
<body><%db.ConnectionPoolcp=db.ConnectionPool.getInstance();longstart=System.currentTimeMillis();intloops=Integer.parseInt(request.getParameter("loops"));;for(inti=0;i<loops;i++){Connectioncn=cp.getConnection();if(cn!=null){cp.release(cn);}}out.print("<h1>利用連接池連接"+loops+"次,用時"+(System.currentTimeMillis()-start)+"ms</h1>");%></body>useloops.jsp使用連接池<body>useloops.jsp不使用連接池
<%@pageimport="java.sql.*"contentType="text/html"pageEncoding="UTF-8"%>
<body><%longstart=System.currentTimeMillis();intloops=Integer.parseInt(request.getParameter("loops"));Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");for(inti=0;i<loops;i++){Connectioncn;try{cn=DriverManager.getConnection("jdbc:odbc:tt");}catch(Exceptione){System.out.println(e);break;}if(cn!=null){cn.close();}}out.print("<h1>不用連接池連接"+loops+"次,用時"+(System.currentTimeMillis()-start)+"ms</h1>");noloops.jsp不使用連接池<%@pageimport="java.sq實際時間對比實際時間對比J2EE中數(shù)據(jù)庫連接池的使用JDK只提供了數(shù)據(jù)庫連接池相關(guān)的DataSource接口,具體實現(xiàn)由數(shù)據(jù)庫驅(qū)動廠商或Web服務(wù)平臺器提供。DataSource接口對象負責(zé)具體的連接池管理。使用DataSource時,需要通過查詢JNDI(JavaNamingandDirectoruInterface)服務(wù)器得到DataSource,再利用該對象獲取Connection對象。應(yīng)該在web應(yīng)用的\META-INF\context.xml中定義數(shù)據(jù)源,并在web.xml中定義該數(shù)據(jù)源的參考。如果要為所有Web應(yīng)用提供相同的數(shù)據(jù)源,可以利用\tomcat6.0\conf\server.xml定義數(shù)據(jù)源。J2EE中數(shù)據(jù)庫連接池的使用JDK只提供了數(shù)據(jù)庫連接池相關(guān)的Context.xml的數(shù)據(jù)源定義<Resourcename="jdbc/DataSourceExample"auth="Container"type="javax.sql.DataSource"username=“數(shù)據(jù)庫用戶名"password=“用戶密碼“driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"url="jdbc:odbc:tt"maxActive="8"maxIdle="4"maxWait="5000“/>Context.xml的數(shù)據(jù)源定義<Resourceweb.xml中的數(shù)據(jù)源定義<resource-ref><res-ref-name>jdbc/DataSourceExample</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>web.xml中的數(shù)據(jù)源定義<resource-ref>通過DataSource連接數(shù)據(jù)庫的關(guān)鍵代碼
InitialContextcontext=newInitialContext();DataSourcedataSource=(DataSource)context.lookup("數(shù)據(jù)源名稱");conn=dataSource.getConnection();…conn.close();通過DataSource連接數(shù)據(jù)庫的關(guān)鍵代碼
Initial通過DataSource訪問數(shù)據(jù)庫實例%@pageimport="java.sql.*,javax.naming.*,javax.sql.*"contentType="text/html"pageEncoding="UTF-8"%<body><h2>JDBC實例:通過DataSource訪問數(shù)據(jù)庫</h2><hr><%try{InitialContextcontext=newInitialContext();DataSourcedataSource=(DataSource)context.lookup("java:comp/env/jdbc/DataSourceExample");Connectionconn=dataSource.getConnection();Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery("select*fromuser");if(rs.next()){%><tableborder=1><tr><th>序號</th><th>姓名</th><th>電話</th><th>年齡</th><th>QQ</th><th>日期</th></tr><%do{out.println("<tr>");out.println("<td>"+rs.getString(1)+"</td>");……….out.println("<td>"+rs.getString(6)+"</td>");out.println("</tr>");}while(rs.next());%></table><%}//if結(jié)束
}catch(Exceptione){e.printStackTrace();}%></body>通過DataSource訪問數(shù)據(jù)庫實例%@pageimp5.1JDBC概述JDBC(JavaDataBaseConnection)是Java數(shù)據(jù)庫訪問API的統(tǒng)稱,主要完成以下功能:與一個數(shù)據(jù)庫建立連接。向數(shù)據(jù)庫發(fā)送SQL語句。處理數(shù)據(jù)庫返回的結(jié)果。5.1JDBC概述JDBC(JavaDataBaseCJDBCAPI在java.sql包中主要提供了以下接口JDBCAPI在java.sql包中主要提供了以下接口JDBC的結(jié)構(gòu)JDBC有兩種接口,分別是面向開發(fā)人員的JDBCAPI和面向低層的JDBCDriverAPIJDBCAPI是一系列的接口,它使得應(yīng)用程序能夠進行數(shù)據(jù)庫聯(lián)接,執(zhí)行SQL語句,并且得到返回結(jié)果。JDBC的結(jié)構(gòu)JDBC有兩種接口,分別是面向開發(fā)人員的JDBJDBC的結(jié)構(gòu)java.sql.DriverManager用來裝載驅(qū)動程序,并且為創(chuàng)建新的數(shù)據(jù)庫連接提供支持。java.sql.Connection完成對某一指定數(shù)據(jù)庫的連接。java.sql.Statement在一個給定的連接中作為SQL執(zhí)行聲明的容器,它包含了兩個重要的子類型。java.sql.PreparedSatement用于執(zhí)行預(yù)編譯的sql聲明java.sql.CallableStatement用于執(zhí)行數(shù)據(jù)庫中存儲過程的調(diào)用java.sql.ResultSet對于給定聲明取得結(jié)果的途徑JDBC的結(jié)構(gòu)java.sql.DriverManager用JDBC接口之間的關(guān)系JDBC接口之間的關(guān)系5.2JDBCAPI的應(yīng)用
1、訪問數(shù)據(jù)庫的基礎(chǔ)2、JDBC應(yīng)用實例3、ResultSet的高級應(yīng)用5.2JDBCAPI的應(yīng)用
1、訪問數(shù)據(jù)庫的基礎(chǔ)訪問數(shù)據(jù)庫的步驟1.加載驅(qū)動程序2.連接數(shù)據(jù)庫3.執(zhí)行SQL語句4.通過ResultSet獲取select語句執(zhí)行的結(jié)果并處理Class.forName()方法DriverManager.getConnection()方法通過Statement執(zhí)行(select、insert、update和delete)通過ResultSet獲取select語句執(zhí)行的結(jié)果并處理訪問數(shù)據(jù)庫的步驟1.加載驅(qū)動程序2.連接數(shù)據(jù)庫3.執(zhí)行SQLStatement的使用
創(chuàng)建:connection.createStatement([…])執(zhí)行select查詢語句:statement.executeQuery(“查詢語句")執(zhí)行insert、update、delete等更新語句:statement.executeUpdate(“更新語句”)如executeUpdate("insertintoMyFriend(name,age,qq)values(‘"+name+"',"+age+",'"+qq+"')")name=“abc”,age=20,qq=“1234”時執(zhí)行如下SQL語句insertintoMyFriend(name,age,qq)values('abc',20,'1234')Statement的使用
創(chuàng)建:connection.creResultSet的使用
創(chuàng)建:executeQuery("SQL語句")定位記錄:next()方法訪問數(shù)據(jù):getXXX(int)或getXXX(String)其中XXX為一數(shù)據(jù)類型名稱,int為列編號(從1開始編號),String為列名。如getInt(2),getString("name")對照INT、INTEGER getInt()TINYINT、SMALLINT getShort()BIGINT getLong()DATE getDate()CHAR、VARCHAR getString()FLOAT getFloat()ResultSet的使用
創(chuàng)建:executeQuery("JAVA訪問數(shù)據(jù)庫示例1讀入ACCESS數(shù)據(jù)庫的內(nèi)容數(shù)據(jù)庫LIB.mdb表userJAVA訪問數(shù)據(jù)庫示例1讀入ACCESS數(shù)據(jù)庫的內(nèi)容JDBC-ODBC
方法
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon=DriverManager.getConnection("jdbc:odbc:tt");Statementsql=con.createStatement();ResultSetrs=sql.executeQuery("select*fromuser");while(rs.next()){System.out.print(rs.getInt("ID")+"\t");System.out.print(rs.getString(2)+"\t");System.out.print(rs.getString(3)+"\t");System.out.print(rs.getInt(4)+"\t");System.out.print(rs.getInt(5)+"\t");System.out.println(rs.getDate(6));}rs.close();sql.close();con.close();建立ODBC-名稱為ttJDBC-ODBC
方法
Class.forName("su多種方法訪問數(shù)據(jù)庫通過JSP訪問數(shù)據(jù)庫通過Servlet訪問數(shù)據(jù)庫通過JavaBean訪問多種方法訪問數(shù)據(jù)庫通過JSP訪問數(shù)據(jù)庫JSP
訪問數(shù)據(jù)庫<%@pageimport="java.sql.*"%><h2>JDBC實例:通過JSP訪問數(shù)據(jù)庫</h2><hr><%Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon=DriverManager.getConnection("jdbc:odbc:tt");Statementsql=con.createStatement();ResultSetrs=sql.executeQuery("select*fromuser");if(rs.next()){%>
<%}//if結(jié)束%>jsp.jspJSP
訪問數(shù)據(jù)庫<%@pageimport="javaJSP
訪問數(shù)據(jù)庫if(rs.next()){%><tableborder=1><tr><th>序號</th><th>姓名</th><th>電話</th><th>年齡</th><th>QQ</th><th>日期</th></tr><%do{out.println("<tr>");out.println("<td>"+rs.getString(1)+"</td>");out.println("<td>"+rs.getString(2)+"</td>");out.println("<td>"+rs.getString(3)+"</td>");out.println("<td>"+rs.getString(4)+"</td>");out.println("<td>"+rs.getString(5)+"</td>");out.println("<td>"+rs.getString(6)+"</td>");out.println("</tr>");}while(rs.next());%></table>jsp.jspJSP
訪問數(shù)據(jù)庫if(rs.next()){%>jspServlet
訪問數(shù)據(jù)庫protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("<h2>JDBC實例:通過Servlet訪問數(shù)據(jù)庫</h2><hr>");try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon=DriverManager.getConnection("jdbc:odbc:tt");Statementsql=(Statement)con.createStatement();
ResultSetrs=sql.executeQuery("select*fromuser");if(rs.next()){}//if結(jié)束
}catch(Exceptione){out.println(e);}}Servlet.javaServlet
訪問數(shù)據(jù)庫protectedvoiddServlet
訪問數(shù)據(jù)庫out.println("<tableborder=1>");out.println("<tr><th>序號</th><th>姓名</th>");out.println("<th>電話</th><th>年齡</th>");out.println("<th>QQ</th><th>日期</th></tr>");do{out.println("<tr>");out.println("<td>"+rs.getString(1)+"</td>");out.println("<td>"+rs.getString(2)+"</td>");out.println("<td>"+rs.getString(3)+"</td>");out.println("<td>"+rs.getString(4)+"</td>");out.println("<td>"+rs.getString(5)+"</td>");out.println("<td>"+rs.getString(6)+"</td>");out.println("</tr>");}while(rs.next());out.println("</table>");Servlet.javaServlet
訪問數(shù)據(jù)庫ou通過JavaBean訪問packagemybean;importjava.sql.*;publicclassDBConnection{privateConnectionconn;publicvoidinit(StringclassName,StringURL){try{Class.forName(className);conn=DriverManager.getConnection(URL);}catch(Exceptione){System.out.println(e);}}publicConnectiongetConnection(){returnconn;}}DBConnection.java通過JavaBean訪問packagemybean;DB通過JavaBean訪問<h2>JDBC實例:通過JavaBean訪問數(shù)據(jù)庫</h2><hr><jsp:useBeanid="dbcon"class="mybean.DBConnection"/><%dbcon.init("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:tt");Connectioncon=dbcon.getConnection();Statementsql=con.createStatement();ResultSetrs=sql.executeQuery("select*fromuser");if(rs.next()){%><tableborder=1><tr><th>序號</th><th>姓名</th><th>電話</th><th>年齡</th><th>QQ</th><th>日期</th></tr><%do{out.println("<tr>");out.println("<td>"+rs.getString(1)+"</td>");……out.println("<td>"+rs.getString(6)+"</td>");out.println("</tr>");}while(rs.next());%></table><%}//if結(jié)束
%>JavaBean.JSP通過JavaBean訪問<h2>JDBC實例:通過Jav可滾動的ResultSet通過createStatement(int,int)創(chuàng)建Statement時可以指定第一個參數(shù)指定游標(biāo)類型可為下面的值,以便支持可滾動的記錄集ResultSet.TYPE_FORWARD_ONLY:默認的cursor類型,僅僅支持向前forward,不支持backforward,random,last,first操作,類似單向鏈表。不可滾動的記錄集,數(shù)據(jù)庫發(fā)生變化時不可見。是效率最高最快的cursor類型ResultSet.TYPE_SCROLL_INSENSITIVE:支持backforward,random,last,first操作,對其它數(shù)據(jù)session對選擇數(shù)據(jù)做出的更改是不敏感,不可見的??蓾L動的記錄集,數(shù)據(jù)庫的變化不可見ResultSet.TYPE_SCROLL_SENSITIVE:支持backforward,random,last,first操作,對其它數(shù)據(jù)session對選擇數(shù)據(jù)做出的更改是敏感,可見的??蓾L動的記錄集,數(shù)據(jù)庫的變化可見。移動記錄指針的方法包括next()、last()、previous()、first()等等??蓾L動的ResultSet通過createStatement游標(biāo)類型總結(jié)1TYPE_FORWARD_ONLY通常是效率最高最快的cursor類型,也是最常用的選擇。
2TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的記錄實體,在大量記錄集返回時慎用。3TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的記錄rowid,需要進行二次查詢,效率最低,開銷最大游標(biāo)類型總結(jié)1TYPE_FORWARD_ONLY通常是效率最可更新的ResultSet通過createStatement(int,int)創(chuàng)建Statement時可以指定第二個參數(shù)為下面的值,以便支持可更新的記錄集ResultSet.CONCUR_READ_ONLY:記錄集不可更新ResultSet.CONCUR_UPDATABLE:記錄集可更新更新記錄的方法包括updateInt(int,int)、updateInt(String,int)、updateRow()、insertRow()、deleteRow()等等。可更新的ResultSet通過createStatement其他類型數(shù)據(jù)庫的驅(qū)動程序MySQL驅(qū)動程序及URL:驅(qū)動:com.mysql.jdbc.Driverurl:jdbc:mysql://:3306/myfriendSQLServer驅(qū)動程序及URL:驅(qū)動:com.microsoft.sqlserver.jdbc.SQLServerDriverurl:jdbc:sqlserver://localhost:1433;databaseName=myfriend;user=MyUserName;password=*****;Oracle驅(qū)動程序及URL:驅(qū)動:oracle.jdbc.driver.OracleDriverurl:jdbc:oracle:thin@:myfriend其他類型數(shù)據(jù)庫的驅(qū)動程序MySQL驅(qū)動程序及URL:5.3連接池、DataSource及其應(yīng)用1數(shù)據(jù)庫連接池傳統(tǒng)的JDBCAPI訪問數(shù)據(jù)庫時,需要頻繁建立數(shù)據(jù)庫連接Connection對象,導(dǎo)致系統(tǒng)的整體性能降低。數(shù)據(jù)庫連接池(ConnectionPool)是一種數(shù)據(jù)庫連接共享技術(shù)。數(shù)據(jù)庫連接池的基本思想是為數(shù)據(jù)庫連接建立一個“緩沖池”,即初始化連接池時在緩沖池中創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接。當(dāng)應(yīng)用組件需要獲取數(shù)據(jù)庫連接時,只需從緩沖池中取出一個,使用完畢之后再釋放到連接池中。數(shù)據(jù)庫連接池在初始化時創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接,其數(shù)量由最小數(shù)據(jù)庫連接數(shù)來設(shè)定。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這些連接。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了連接池能建立的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時,這些請求將被加入到等待隊列中。5.3連接池、DataSource及其應(yīng)用1數(shù)據(jù)庫連接池連接池原理實驗
<%@pageimport="java.sql.*"contentType="text/html"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>連接池舉例</title></head><body><h1>數(shù)據(jù)庫連接池實例</h1><hr><li><ahref="useloops.jsp?loops=50000">使用連接池連接50000次</a><br><li><ahref="noloops.jsp?loops=50">不使用連接池連接50次</a></body></html>index.jsp連接池原理實驗
<%@pageimport="java.s連接池類
ConnectionPoolpackagedb;importjava.sql.*;*importjava.util.Vector;publicclassConnectionPool{privateVector<Connection>pool;privateintpoolSize=10;privatestaticConnectionPoolinstance=null;publicstaticConnectionPoolgetInstance(){if(instance==null){instance=newConnectionPool();}returninstance;}《1》連接池類
ConnectionPoolpackaged連接池類
ConnectionPoolprivateConnectionPool(){pool=newVector<Connection>(poolSize);Connectionconn=null;for(inti=0;i<poolSize;i++){try{Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:odbc:tt");pool.add(conn);}catch(Exceptione){e.printStackTrace();}}}《2》連接池類
ConnectionPoolpriva連接池類
ConnectionPoolpublicsynchronizedConnectiongetConnection(){if(pool.size()>0){Connectionconn=pool.get(0);pool.remove(conn);returnconn;}else{returnnull;}}publicsynchronizedvoidrelease(Connectionconn){pool.add(conn);}}《3》連接池類
ConnectionPoolpublics使用連接池
<body><%db.ConnectionPoolcp=db.ConnectionPool.getInstance();longstart=System.currentTimeMillis();intloops=Integer.parseInt(request.getParameter("loops"));;for(inti=0;i<loops;i++){Connectioncn=cp.getConnection();if(cn!=null){cp.release(cn);}}out.print("<h1>利用連接池連接"+loops+"次,用時"+(System.currentTimeMillis()-start)+"ms</h1>");%></body>useloops.jsp使用連接池<body>useloops.jsp不使用連接池
<%@pageimport="java.sql.*"contentType="text/html"pageEncoding="UTF-8"%>
<body><%longstart=System.currentTimeMillis();intloops=Integer.parseInt(request.getParameter("loops"));Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國學(xué)校家具行業(yè)發(fā)展現(xiàn)狀及前景規(guī)劃研究報告
- 2024-2030年中國嬰兒洗護用品市場運行動態(tài)及前景趨勢預(yù)測報告
- 2024-2030年中國女性洗液行業(yè)市場營銷模式及發(fā)展前景預(yù)測報告
- 2024-2030年中國多型腔熱流道管坯模具境外融資報告
- 2024年標(biāo)準(zhǔn)簡易個人魚塘承包合同模板版B版
- 梅河口康美職業(yè)技術(shù)學(xué)院《高級語言程序?qū)嵺`》2023-2024學(xué)年第一學(xué)期期末試卷
- 茂名職業(yè)技術(shù)學(xué)院《語文教學(xué)設(shè)計與實施》2023-2024學(xué)年第一學(xué)期期末試卷
- 微專題定量測定型實驗突破策略-2024高考化學(xué)一輪考點擊破
- 呂梁職業(yè)技術(shù)學(xué)院《生物學(xué)科專業(yè)導(dǎo)論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年某科技公司與某航空公司關(guān)于機載娛樂系統(tǒng)的合同
- 2024年華潤電力投資有限公司招聘筆試參考題庫含答案解析
- 壟斷行為的定義與判斷準(zhǔn)則
- 模具開發(fā)FMEA失效模式分析
- 聶榮臻將軍:中國人民解放軍的奠基人之一
- 材料化學(xué)專業(yè)大學(xué)生職業(yè)生涯規(guī)劃書
- 乳品加工工(中級)理論考試復(fù)習(xí)題庫(含答案)
- 《教材循環(huán)利用》課件
- 學(xué)生思想政治工作工作證明材料
- 2023水性環(huán)氧樹脂涂層鋼筋
- 國開《Windows網(wǎng)絡(luò)操作系統(tǒng)管理》形考任務(wù)2-配置本地帳戶與活動目錄域服務(wù)實訓(xùn)
- 環(huán)保設(shè)施安全風(fēng)險評估報告
評論
0/150
提交評論