版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaWeb程序设计
——数据库访问(3)2主要内容JDBC操作数据库
ResultSet结果集
CallableStatement对象连接池3ResultSet结果集ResultSet类型的对象是SQL语句执行的结果集,其所给出的方法大都是用来通过控制指针的移动来访问数据的,如:
first();last();next();getString(intindex)getRow();
…
…4Statement,PreparedStatement类型的对象用来执行各种SQL语句,而ResultSet对象用来控制查询所返回的数据集合。因此,这几种对象的配合使用可以完成对数据库的基本操作。
当采用Statement,PreparedStatement类型的对象进行数据库的操作时,都可以用不同的参数来确定结果集ResultSet的返回状态,如:可读可写、游标的类型。具体如下:5
(1)Statement语句
createStatement(intresultSetType,intresultSetConcurrency);
(2)PreparedStatement语句
preparedStatement(Stringsql,intresultSetType,intresultSetConcurrency);6参数说明(1)resultSetType:ResultSet.TYPE_FORWARD_ONLY:结果集不可滚动;ResultSet.TYPE_SCROLL_INSENSITIVE:可滚动,但对底层数据变化不敏感;ResultSet.TYPE_SCROLL_SENSITIVE:可滚动,但对底层数据变化敏感;(2)resultSetConcurrency:ResultSet.CONCUR_READ_ONLY:结果集不可更新;ResultSet.CONCUR_UPDATETABLE:
结果集可更新;7例1:使用可滚动结果集
当需要在结果集中任意的移动游标时,则应该采用可滚动的结果集。
<body>
<%
----加载SQLServer数据库驱动程序
-----建立与数据库的连接
8try{
//创建返回可滚动结果集的Statement对象
Statementstmt=conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//执行SQL查询语句得到可滚动结果集
ResultSetrs=stmt.executeQuery(“SELECT*FROMstudent”);
//移动到第一条记录
rs.first();
9//使用next()方法顺序显示结果集
while(rs.next()){
intid=rs.getInt(1);
Stringname=rs.getString(2);
Stringaddress=rs.getString("address");
Datebirthday=rs.getDate(4);
out.println(id+""+name+""+
address+""+birthday+"<br>");
}
10//使用previous()方法逆序显示结果集
while(rs.previous()){
intid=rs.getInt(1);
Stringname=rs.getString(2);
Stringaddress=rs.getString("address");
Datebirthday=rs.getDate(4);
out.println(id+""+name+""+
address+""+birthday+"<br>");
}11rs.close();
stmt.close();
}catch(SQLExceptione){
out.println("出现SQLException异常"+"<br>");
}finally{
try{
if(conn!=null)conn.close();
}catch(SQLExceptione){
out.println("关闭数据库连接时出现异常"+"<br>");
}
}%>
</body>
</html>12例2:使用可更新结果集
在对数据的处理过程中,当需要更新结果集中的数据并存储到数据库中时,使用可更新的结果集。<body>
<%
----加载SQLServer数据库驱动程序
-----建立与数据库的连接
13try{
//创建返回可更新结果集的语句对象
Statementstmt=conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATETABLE);
//执行SQL查询语句得到可更新结果集
ResultSetrs=stmt.executeQuery(
"SELECT*FROMstudentORDERBYstu_id");
可更新结果集14//将游标移动到最后一行
rs.last();
intstuID=rs.getInt("stu_id");
//使用updateXXX方法更新列值
rs.updateString(2,
"newName"+Integer.toString(stuID));
rs.updateString("address","newAddr");
rs.updateDate("birthday",newDate(79,7,stuID%29));
//使用updateRow()方法提交更新结果
rs.updateRow();15//将游标移动到插入行
rs.moveToInsertRow();
stuID++;
//使用updateXXX方法更新列值
rs.updateInt("stu_id",stuID);
rs.updateString(2,"Name"+Integer.toString(stuID));
rs.updateString("address","Addr"+Integer.toString(stuID));
rs.updateDate("birthday",newDate(79,7,stuID%29));
//使用insertRow()方法提交插入行
rs.insertRow();16//将游标移动到当前行
rs.moveToCurrentRow();
rs.previous();
//使用deleteRow()方法删除一行
rs.deleteRow();
rs.close();
stmt.close();
}catch(SQLExceptione){
out.println("出现SQLException异常"+"<br>");
}%>
</body>
</html>17主要内容JDBC操作数据库
ResultSet结果集
CallableStatement对象连接池18CallableStatement对象CallableStatement对象为访问数据库使用者提供一种以标准形式调用存储过程的途径。存储过程是存储在数据库中的一个对象。什么是存储过程?
存储过程(StoredProcedure)
是一组为了完成特定功能的SQL语句集,经编译后存储在服务器端数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来执行它。19存储过程参数
存储过程的参数分为IN、OUT、INOUT三种类型:(1)IN参数为输入参数,该参数的值需要在调用时指定,且在存储过程中修改该参数值不能被返回;(2)OUT参数为输出参数,可在存储过程中修改,并可返回,但在存储过程调用时,实际参数的值被忽略;20存储过程参数
存储过程的参数分为IN、OUT、INOUT三种类型:(3)INOUT参数为输入输出参数,该参数的值需要在调用时指定,可在存储过程修改,并可以返回;21例:不带参数的存储过程CREATEPROCEDUREauthor_inforAS SELECTau_lname,au_fname,title,pub_name FROMauthorsaINNERJOINtitleauthorta ONa.au_id=ta.au_idINNERJOINtitlest ONt.title_id=ta.title_idINNERJOINpublishersp ONt.pub_id=p.pub_id22
CREATEPROCEDUREsalequa@stor_idchar(4),@sumsmallintAS SELECTord_num,ord_date,payterms,title_id,qty FROMsales WHEREstor_id=@stor_id SELECT@sum=sum(qty) FROMsales WHEREstor_id=@stor_id例:带参数的存储过程23存储过程的优点存储过程可以实现模块化管理 存储过程是实现特定功能的程序体,不同的应用程序都可以通过名称和参数调用存储过程,对存储过程的修改完善不会影响应用程序,提高了系统的可移植性。存储过程能够实现较快的执行速度 因为存储过程是经过预编译和优化过的程序代码。存储过程能够减少网络流量 客户端程序通过名称和参数调用存储过程,而非传递整个SQL代码来执行操作。24CallableStatement接口继承了Statement中的方法,还继承了PreparedStatement中的方法。CallableStatement方法主要是调用存储过程的。(1)调用存储过程的语法在JDBC中调用存储过程的语法如下:
{call过程名[(?,?,…)]}
不带参数存储过程的语法:
{call过程名}CallableStatement对象25(2)创建CallableStatement对象创建CallableStatement对象是通过Connection接口的prepareCall()方法。下面是创建该对象的样例,其中包括了对存储过程geTestData的调用:
CallableStatementcstmt=con.prepareCall(“{callgetTestData(?,?)}”)
其中,?为IN、OUT或INOUT参数,这要取决于存储过程getTestData中的定义.26(3)IN和OUT参数
在用CallableStatement对象调用存储过程,当存储过程带有参数时,需要对IN参数进行传递,对OUT参数进行注册。
①
将IN参数传给CallableStatement对象是通过方法:setXXX(),该方法继承自PreparedStatement;
②
如果存储过程返回OUT参数,则在执行CallableStatement对象之前,需要先注册每个OUT参数的JDBC类型,注册是用registerOutParameter()方法完成的。
27③在执行完成后,使用getXXX()方法取回返回参数值,其中“XXX”数据类型为各返回参数所注册的JDBC类型所对应的Java数据类型。28例:调用getTestData存储过程(两个OUT参数)
CallableStatementcstmt=con.prepareCall(“{callgetTestData(?,?)}”);
cstmt.registerOutParameter(1,java.sql.Types.
TINYINT);
cstmt.registerOutParameter(2,java.sql.Types.
DECIMAL,3);
cstmt.executeQuery();
bytex=cstmt.getByte(1);
java.math.BigDecimaln=cstmt.getBigDecimal(2,3);注册输出参数生成CallableStatment对象获取输出值29(4)INOUT参数
当参数为INOUT类型时,需要对该参数进行值的传递,还要对参数进行注册。
①
通过方法:setXXX(),进行参数值的传递,需要注意该方法传递的数据为Java数据类型;
②
用registerOutParameter()方法进行该参数JDBC数据类型的注册;
③用getXXX()方法获取该参数的值,为Java数据类型。
因此,①中的Java数据类型应能对应到②中的JDBC数据类型,则③和①的数据类型应该一致。30例:调用getTestData存储过程(1个INOUT参数)
CallableStatementcstmt=con.prepareCall(“{callgetTestData(?)}”);
cstmt.setByte(1,25);
cstmt.registerOutParameter(1,java.sql.Types.
TINYINT);
cstmt.executeUpdate();
bytex=cstmt.getByte(1);
注册参数生成CallableStatment对象获取参数值传递参数值31(5)检索结果
为了实现程序最大的可移植性,由于某些数据库系统的限制,建议先检索由执行CallableStatement对象产生的结果,然后再调用getXXX()方法来检索OUT参数。
例如:如果CallableStatement对象将返回多个执行结果(调用execute()方法):ResultSet对象、更新行数,在检索OUT参数前应先检索所有的执行结果。
getResultSet(),getUpdate(),
getMoreResults()
然后再调用getXXX()方法获取OUT参数32主要内容JDBC操作数据库
ResultSet结果集
CallableStatement对象
连接池33连接池
对于访问量非常高的Web应用系统来说,每次创建一个连接都会消耗一定的资源,这样会大大降低系统的访问效率。为了解决这样的问题,可以事先创建好一定数量的连接,然后放入连接池中供用户使用,用户在使用完某一连接后,将该连接返回给连接池。34
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。(1)分配、释放策略当用户请求某一数据库的连接时,首先看连接池中是否有空闲连接;如果没有空闲连接,在已经分配出的连接中,寻找一个合适的连接给用户使用,这时该连接在多个用户间复用;连接池35
例如:可以选择一个引用计数(ReferenceCounting)最小的一个连接。用户在使用完数据库连接后,应将其释放,如果该连接没有使用者的情况下,则会被放入连接池中。(2)配置策略一般情况下,在配置数据库连接池时,需要考虑初始连接池的连接数目和连接池的最大连接数目。连接池36(1)在Tomcat安装目录下的子目录conf下,打开Server.xml文件。然后在</host>标签前添加数据源的描述代码:
<Context>
<Resourcename=“jdbc/mydb”
type=“javax.sql.DataSource” driverClassName=“com.microsoft.sqlserver.jdbc.SQLServerDriver”
url=“jdbc:sqlserver://localhost:1433;DataBaseName=mydb”
在Tomcat服务器上配置数据源(实现线程池机制)37 username=“”
password=“”
maxAct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海豹油在皮肤健康中的作用
- 电网动态信号分析技术
- 2024年度食品生产设备采购合同
- 2024版店铺数字化转型咨询与实施服务合同
- 二零二四年人工智能技术研究与应用合同
- XXXX大学“助研计划”管理实施办法
- 2024年张紧装置项目申请报告范文
- 服饰企业市场拓展计划考核试卷
- 2024年度饲料企业质量检测合同
- 2024年度工程设备租赁合同with详细维修与保养条款
- 2024年医疗器械经营质量管理规范培训课件
- 22G101三维彩色立体图集
- 建筑施工安全生产治本攻坚三年行动方案(2024-2026年)
- 化工厂安全消防标志的制定
- 高低加投停及事故处理
- CKD 电子式压力开关PPG-C使用说明书
- 县农村土地确权信息纠错工作实施方案
- 关于统一使用公司手机号码的通知
- 标准吞咽功能评价量表(SSA)2页
- 用友华表伙伴商务手册.
- 心理安全网格化监管实施方案
评论
0/150
提交评论