JavaEE数据库开发基础课件_第1页
JavaEE数据库开发基础课件_第2页
JavaEE数据库开发基础课件_第3页
JavaEE数据库开发基础课件_第4页
JavaEE数据库开发基础课件_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5.1JDBC概述JDBC(JavaDataBaseConnection)是Java数据库访问API的统称,主要完成以下功能:与一个数据库建立连接。向数据库发送SQL语句。处理数据库返回的结果。5.1JDBC概述JDBC(JavaDataBaseCJDBCAPI在java.sql包中主要提供了以下接口JDBCAPI在java.sql包中主要提供了以下接口JDBC的结构JDBC有两种接口,分别是面向开发人员的JDBCAPI和面向低层的JDBCDriverAPIJDBCAPI是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果。JDBC的结构JDBC有两种接口,分别是面向开发人员的JDBJDBC的结构java.sql.DriverManager用来装载驱动程序,并且为创建新的数据库连接提供支持。java.sql.Connection完成对某一指定数据库的连接。java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,它包含了两个重要的子类型。java.sql.PreparedSatement用于执行预编译的sql声明java.sql.CallableStatement用于执行数据库中存储过程的调用java.sql.ResultSet对于给定声明取得结果的途径JDBC的结构java.sql.DriverManager用JDBC接口之间的关系JDBC接口之间的关系5.2JDBCAPI的应用

1、访问数据库的基础2、JDBC应用实例3、ResultSet的高级应用5.2JDBCAPI的应用

1、访问数据库的基础访问数据库的步骤1.加载驱动程序2.连接数据库3.执行SQL语句4.通过ResultSet获取select语句执行的结果并处理Class.forName()方法DriverManager.getConnection()方法通过Statement执行(select、insert、update和delete)通过ResultSet获取select语句执行的结果并处理访问数据库的步骤1.加载驱动程序2.连接数据库3.执行SQLStatement的使用

创建:connection.createStatement([…])执行select查询语句:statement.executeQuery(“查询语句")执行insert、update、delete等更新语句:statement.executeUpdate(“更新语句”)如executeUpdate("insertintoMyFriend(name,age,qq)values(‘"+name+"',"+age+",'"+qq+"')")name=“abc”,age=20,qq=“1234”时执行如下SQL语句insertintoMyFriend(name,age,qq)values('abc',20,'1234')Statement的使用

创建:connection.creResultSet的使用

创建:executeQuery("SQL语句")定位记录:next()方法访问数据:getXXX(int)或getXXX(String)其中XXX为一数据类型名称,int为列编号(从1开始编号),String为列名。如getInt(2),getString("name")对照INT、INTEGER getInt()TINYINT、SMALLINT getShort()BIGINT getLong()DATE getDate()CHAR、VARCHAR getString()FLOAT getFloat()ResultSet的使用

创建:executeQuery("JAVA访问数据库示例1读入ACCESS数据库的内容数据库LIB.mdb表userJAVA访问数据库示例1读入ACCESS数据库的内容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多种方法访问数据库通过JSP访问数据库通过Servlet访问数据库通过JavaBean访问多种方法访问数据库通过JSP访问数据库JSP

访问数据库<%@pageimport="java.sql.*"%><h2>JDBC实例:通过JSP访问数据库</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结束%>jsp.jspJSP

访问数据库<%@pageimport="javaJSP

访问数据库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

访问数据库if(rs.next()){%>jspServlet

访问数据库protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("<h2>JDBC实例:通过Servlet访问数据库</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结束

}catch(Exceptione){out.println(e);}}Servlet.javaServlet

访问数据库protectedvoiddServlet

访问数据库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

访问数据库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访问数据库</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结束

%>JavaBean.JSP通过JavaBean访问<h2>JDBC实例:通过Jav可滚动的ResultSet通过createStatement(int,int)创建Statement时可以指定第一个参数指定游标类型可为下面的值,以便支持可滚动的记录集ResultSet.TYPE_FORWARD_ONLY:默认的cursor类型,仅仅支持向前forward,不支持backforward,random,last,first操作,类似单向链表。不可滚动的记录集,数据库发生变化时不可见。是效率最高最快的cursor类型ResultSet.TYPE_SCROLL_INSENSITIVE:支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是不敏感,不可见的。可滚动的记录集,数据库的变化不可见ResultSet.TYPE_SCROLL_SENSITIVE:支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是敏感,可见的。可滚动的记录集,数据库的变化可见。移动记录指针的方法包括next()、last()、previous()、first()等等。可滚动的ResultSet通过createStatement游标类型总结1TYPE_FORWARD_ONLY通常是效率最高最快的cursor类型,也是最常用的选择。

2TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的记录实体,在大量记录集返回时慎用。3TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的记录rowid,需要进行二次查询,效率最低,开销最大游标类型总结1TYPE_FORWARD_ONLY通常是效率最可更新的ResultSet通过createStatement(int,int)创建Statement时可以指定第二个参数为下面的值,以便支持可更新的记录集ResultSet.CONCUR_READ_ONLY:记录集不可更新ResultSet.CONCUR_UPDATABLE:记录集可更新更新记录的方法包括updateInt(int,int)、updateInt(String,int)、updateRow()、insertRow()、deleteRow()等等。可更新的ResultSet通过createStatement其他类型数据库的驱动程序MySQL驱动程序及URL:驱动:com.mysql.jdbc.Driverurl:jdbc:mysql://:3306/myfriendSQLServer驱动程序及URL:驱动:com.microsoft.sqlserver.jdbc.SQLServerDriverurl:jdbc:sqlserver://localhost:1433;databaseName=myfriend;user=MyUserName;password=*****;Oracle驱动程序及URL:驱动:oracle.jdbc.driver.OracleDriverurl:jdbc:oracle:thin@:myfriend其他类型数据库的驱动程序MySQL驱动程序及URL:5.3连接池、DataSource及其应用1数据库连接池传统的JDBCAPI访问数据库时,需要频繁建立数据库连接Connection对象,导致系统的整体性能降低。数据库连接池(ConnectionPool)是一种数据库连接共享技术。数据库连接池的基本思想是为数据库连接建立一个“缓冲池”,即初始化连接池时在缓冲池中创建一定数量的数据库连接。当应用组件需要获取数据库连接时,只需从缓冲池中取出一个,使用完毕之后再释放到连接池中。数据库连接池在初始化时创建一定数量的数据库连接,其数量由最小数据库连接数来设定。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这些连接。连接池的最大数据库连接数量限定了连接池能建立的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。5.3连接池、DataSource及其应用1数据库连接池连接池原理实验

<%@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>数据库连接池实例</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中数据库连接池的使用JDK只提供了数据库连接池相关的DataSource接口,具体实现由数据库驱动厂商或Web服务平台器提供。DataSource接口对象负责具体的连接池管理。使用DataSource时,需要通过查询JNDI(JavaNamingandDirectoruInterface)服务器得到DataSource,再利用该对象获取Connection对象。应该在web应用的\META-INF\context.xml中定义数据源,并在web.xml中定义该数据源的参考。如果要为所有Web应用提供相同的数据源,可以利用\tomcat6.0\conf\server.xml定义数据源。J2EE中数据库连接池的使用JDK只提供了数据库连接池相关的Context.xml的数据源定义<Resourcename="jdbc/DataSourceExample"auth="Container"type="javax.sql.DataSource"username=“数据库用户名"password=“用户密码“driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"url="jdbc:odbc:tt"maxActive="8"maxIdle="4"maxWait="5000“/>Context.xml的数据源定义<Resourceweb.xml中的数据源定义<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中的数据源定义<resource-ref>通过DataSource连接数据库的关键代码

InitialContextcontext=newInitialContext();DataSourcedataSource=(DataSource)context.lookup("数据源名称");conn=dataSource.getConnection();…conn.close();通过DataSource连接数据库的关键代码

Initial通过DataSource访问数据库实例%@pageimport="java.sql.*,javax.naming.*,javax.sql.*"contentType="text/html"pageEncoding="UTF-8"%<body><h2>JDBC实例:通过DataSource访问数据库</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结束

}catch(Exceptione){e.printStackTrace();}%></body>通过DataSource访问数据库实例%@pageimp5.1JDBC概述JDBC(JavaDataBaseConnection)是Java数据库访问API的统称,主要完成以下功能:与一个数据库建立连接。向数据库发送SQL语句。处理数据库返回的结果。5.1JDBC概述JDBC(JavaDataBaseCJDBCAPI在java.sql包中主要提供了以下接口JDBCAPI在java.sql包中主要提供了以下接口JDBC的结构JDBC有两种接口,分别是面向开发人员的JDBCAPI和面向低层的JDBCDriverAPIJDBCAPI是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果。JDBC的结构JDBC有两种接口,分别是面向开发人员的JDBJDBC的结构java.sql.DriverManager用来装载驱动程序,并且为创建新的数据库连接提供支持。java.sql.Connection完成对某一指定数据库的连接。java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,它包含了两个重要的子类型。java.sql.PreparedSatement用于执行预编译的sql声明java.sql.CallableStatement用于执行数据库中存储过程的调用java.sql.ResultSet对于给定声明取得结果的途径JDBC的结构java.sql.DriverManager用JDBC接口之间的关系JDBC接口之间的关系5.2JDBCAPI的应用

1、访问数据库的基础2、JDBC应用实例3、ResultSet的高级应用5.2JDBCAPI的应用

1、访问数据库的基础访问数据库的步骤1.加载驱动程序2.连接数据库3.执行SQL语句4.通过ResultSet获取select语句执行的结果并处理Class.forName()方法DriverManager.getConnection()方法通过Statement执行(select、insert、update和delete)通过ResultSet获取select语句执行的结果并处理访问数据库的步骤1.加载驱动程序2.连接数据库3.执行SQLStatement的使用

创建:connection.createStatement([…])执行select查询语句:statement.executeQuery(“查询语句")执行insert、update、delete等更新语句:statement.executeUpdate(“更新语句”)如executeUpdate("insertintoMyFriend(name,age,qq)values(‘"+name+"',"+age+",'"+qq+"')")name=“abc”,age=20,qq=“1234”时执行如下SQL语句insertintoMyFriend(name,age,qq)values('abc',20,'1234')Statement的使用

创建:connection.creResultSet的使用

创建:executeQuery("SQL语句")定位记录:next()方法访问数据:getXXX(int)或getXXX(String)其中XXX为一数据类型名称,int为列编号(从1开始编号),String为列名。如getInt(2),getString("name")对照INT、INTEGER getInt()TINYINT、SMALLINT getShort()BIGINT getLong()DATE getDate()CHAR、VARCHAR getString()FLOAT getFloat()ResultSet的使用

创建:executeQuery("JAVA访问数据库示例1读入ACCESS数据库的内容数据库LIB.mdb表userJAVA访问数据库示例1读入ACCESS数据库的内容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多种方法访问数据库通过JSP访问数据库通过Servlet访问数据库通过JavaBean访问多种方法访问数据库通过JSP访问数据库JSP

访问数据库<%@pageimport="java.sql.*"%><h2>JDBC实例:通过JSP访问数据库</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结束%>jsp.jspJSP

访问数据库<%@pageimport="javaJSP

访问数据库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

访问数据库if(rs.next()){%>jspServlet

访问数据库protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("<h2>JDBC实例:通过Servlet访问数据库</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结束

}catch(Exceptione){out.println(e);}}Servlet.javaServlet

访问数据库protectedvoiddServlet

访问数据库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

访问数据库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访问数据库</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结束

%>JavaBean.JSP通过JavaBean访问<h2>JDBC实例:通过Jav可滚动的ResultSet通过createStatement(int,int)创建Statement时可以指定第一个参数指定游标类型可为下面的值,以便支持可滚动的记录集ResultSet.TYPE_FORWARD_ONLY:默认的cursor类型,仅仅支持向前forward,不支持backforward,random,last,first操作,类似单向链表。不可滚动的记录集,数据库发生变化时不可见。是效率最高最快的cursor类型ResultSet.TYPE_SCROLL_INSENSITIVE:支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是不敏感,不可见的。可滚动的记录集,数据库的变化不可见ResultSet.TYPE_SCROLL_SENSITIVE:支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是敏感,可见的。可滚动的记录集,数据库的变化可见。移动记录指针的方法包括next()、last()、previous()、first()等等。可滚动的ResultSet通过createStatement游标类型总结1TYPE_FORWARD_ONLY通常是效率最高最快的cursor类型,也是最常用的选择。

2TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的记录实体,在大量记录集返回时慎用。3TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的记录rowid,需要进行二次查询,效率最低,开销最大游标类型总结1TYPE_FORWARD_ONLY通常是效率最可更新的ResultSet通过createStatement(int,int)创建Statement时可以指定第二个参数为下面的值,以便支持可更新的记录集ResultSet.CONCUR_READ_ONLY:记录集不可更新ResultSet.CONCUR_UPDATABLE:记录集可更新更新记录的方法包括updateInt(int,int)、updateInt(String,int)、updateRow()、insertRow()、deleteRow()等等。可更新的ResultSet通过createStatement其他类型数据库的驱动程序MySQL驱动程序及URL:驱动:com.mysql.jdbc.Driverurl:jdbc:mysql://:3306/myfriendSQLServer驱动程序及URL:驱动:com.microsoft.sqlserver.jdbc.SQLServerDriverurl:jdbc:sqlserver://localhost:1433;databaseName=myfriend;user=MyUserName;password=*****;Oracle驱动程序及URL:驱动:oracle.jdbc.driver.OracleDriverurl:jdbc:oracle:thin@:myfriend其他类型数据库的驱动程序MySQL驱动程序及URL:5.3连接池、DataSource及其应用1数据库连接池传统的JDBCAPI访问数据库时,需要频繁建立数据库连接Connection对象,导致系统的整体性能降低。数据库连接池(ConnectionPool)是一种数据库连接共享技术。数据库连接池的基本思想是为数据库连接建立一个“缓冲池”,即初始化连接池时在缓冲池中创建一定数量的数据库连接。当应用组件需要获取数据库连接时,只需从缓冲池中取出一个,使用完毕之后再释放到连接池中。数据库连接池在初始化时创建一定数量的数据库连接,其数量由最小数据库连接数来设定。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这些连接。连接池的最大数据库连接数量限定了连接池能建立的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。5.3连接池、DataSource及其应用1数据库连接池连接池原理实验

<%@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>数据库连接池实例</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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论