jsp中的数据库编程(2)
五,浏览resultset
1,jdbc2.0提供了更多浏览resultset的方法
首先,确定你的jdbc驱动程序支持jdbc2.0
其次,由connection生成statement时要指定参数
statement stmt=con.getstatement("游标类型", "记录更新权限");
游标类型:
resultset.type_forword_only:只可以向前移动
resultset.type_scroll_insensitive:可卷动。但是不受其他用户对数据库更改的影响。
resultset.type_scroll_sensitive:可卷动。当其他用户更改数据库时这个记录也会改变。
记录更新权限:
resultset.concur_read_only,只读
resultset.concur_updatable,可更新
getstatement()缺省参数:getstatement(resultset.type_forword_only, resultset.concur_read_only)
2,如果resultset是可卷动的,以下函数可以使用:
rs.absolute()//绝对位置,负数表示从后面数
rs.first()第一条
rs.last()最后一条
rs.previoust()前一条
rs.next()后一条
rs.beforefirst()第一条之前
rs.afterlast()最后之后
rs.isfirst(),rs.islast(),rs.isbeforefirst(),rs.isafterlast
注意,刚打开的时候是处于第一条记录之前的
六,更新数据库
1,stmt.executeupdate("strsql"),strsql是一条sql更新语句。update,insert,delete返回影响到的条数
2,stmt.execute()方法在不知道sql语句是查询还是更新的时候用。如果产生一条以上的对象时,返回true,此时可用 stmt.getresultset()和stmt.getupdatecount()来获取execute结果,如果不返回resultset对象则返回false.
3,除了statement的executeupdate之外还可以用resultset:
rs.updateint(1,10);
rs.updatestring(2,"sfafd");
rs.updaterow();
七,使用预编译preparedstatement
preparedstatement对象和statement对象类似,都可以用来执行sql语句。不同在于,数据库会对preparedstatement的sql语句进行预编译,而且仍旧能输入参数并重复执行编译好的查询速度比未编译的要快。
preparedstatement stmt=con.preparedstatement("insert into users(userid, username) values(?,?)");
stmt.clearparameters();
stmt.setint(1,2);
stmt.setstring(2,"big");
stmt.executeupdate();
八,执行存储过程
1,jdbc调用存储过程,并使用存储过程的返回值。这样可以将处理工作分为服务端和客户端两部分,并大大加快系统的设计和开发的时间。比如可以重复使用服务器上的组件。使用存储过程之后大量诸计算工作可以交给数据库服务器来处理,这将降低web服务器的负载,从而提高整个系统的性能。
2,有两个表usermain{userid,username,usertype},userref{brefid, userid, userbrief}
下面的存储过程可以接受jdbc传来的参数,新增内容到usermain和userref,并输出一个outuserid.
create procedure ap_adduser
(
@outuserid int output, //此为输出参数,output标记
@username varchar(25), //参数表示方法:"@xxx"为变量名,"变量名 类型 [output]"
@usertype tinyint,
@userbrief varchar(255),
)
as
declare @userid int //定义局部变量
insert into usermain(username, usertype)
values(@username,@usertype)
select @userid=@@identity //赋值用select,此处自动获得id
insert into userref(userid, userbrief)
select @outuserid=@userid
go/*结束,基本结构:
create procedure procedurename(
parameters
)
as
actions
go
*/
jsp页面中这样使用:
callablestatement stmt=con.preparecall("{call ap_adduser(?,?,?,?)}");
stmt.registeroutparameter(1,types.integer,1);//注册输出变量
stmt.setstring(2,"edmund");
stmt.setint(3,1);
stmt.setstring(4,"description");
stmt.execute();
int userid=stmt.getint(1);
stmt.close()
八,使用事务
1,事务中的操作是一个整体,要么都执行成功要么都不成功:事务开始后,如果所有的改变都正确,则使用commit方法将这些动作全部存入数据库,否则就使用rollback取消所有的改变动作,而这时数据库中的数据和执行事务前的是相同的。
2,使用事务时应当先用 con.setautocommit(false),最后使用commit或者rollback
3,rollback一般在catch段执行
九,数据库连接池
1,如果有一个数据库连接请求并且连接中没有连接,则生成一个新的连接。这个连接使用完之后并不关闭它,而是将它放入连接池。在这个过程中,还要判断连接池中的连接是否超期。如果超期则将它关闭。
2,有很多已有的connection pool包可以使用。
3,一般将connection pool作为一个application作用域的变量使用
<jsp:usebean id="pool" scope="application" class="javastart.tools.connectionpool" />
<%@page import="java.sql.*"%>
<%@page import="javastart.tools.*"%>
<!--javastart.tools是你的connection pool所在的地方-->
dbconnection con=null;
try{
con=pool.getconnection("sun.jdbc.odbc.jdbcodbcdriver","jdbc:odbc:access","","");
statement stmt=con.createstatement();
stmt.setmaxrows(10);
string query=request.getparameter("quey");
resultset rs=stml.executequery(query);
resultsetmetadata rsmd=rs.getmetadata();
}
.....
finally{
pool.releaseconnection(con);
}
也可以使用一个servlet初始化连接池
http://blog.csdn.net/goldbox/archive/2007/02/02/1501333.aspx
Tag: 连接池
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。