`
womendu
  • 浏览: 1481011 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Jsp连接数据库小结

 
阅读更多
找rs.absolute()时,看到了这篇文章,很不错。。只可惜转不过来。。我就只好复制,粘贴了。。。


JDBC 主要接口:
java.sql.DriverManager类用于处理驱动程序的调入并且对新的数据库连接提供支持。
java.sql.Connection,指应用程序与特定数据库的连接。
java.sql.Statement,用于一般sql语句的执行(可以是查询、更新甚至可以创建数据库的执行过程)
java.sql.ResultSet,查询所返回的结果保存在此对象中,用它可以浏览和存取数据库内的记录。

1,通过jdbc-odbc桥使用odbc数据库(并不需要jdbc Drivers)

先在odbc DSN(Data Source Name)设置处设置pubs sysDSN,sa为username,密码为pwd
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序

con=DriverManager.getConnection("jdbc:odbc:pubs","sa","pwd"); //jdbc:odbc:pubs
con.close();
//应当catch ClassNotFoundException和SQLException
Connection的getWarning方法返回一个SQLWarning对象,在连接之前应当先检查。
使用jdbc-odbc的最大好处是:免费的。但是性能受odbc的限制,而且一般odbc驱动比较昂贵。

2,使用专门的jdbc驱动程序。//此处是mm jdbc Driver
先将jar文件放在ClassPath里面。
Class.forName("org.gjt.mm.mysql.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");
con.close();

可见使用何种方式连接何种数据库与数据库的操作和连接数据库是无关的。

三,查询数据库
Statement stmt=con.createStatement();
stmt.setMaxRows()可以控制输出记录最大数量;
ResultSet rs=stmt.executeQuery("select .....");

ResultSet指向当前记录:
int userId=rs.getInt("userid");
String userName=rs.getString("username");
...或者用序号(从1开始的)
int userId=rs.getInt(1);
Stirng userName=rs.getString(2);

ClassNotFoundException是由于Class.forName()无法载入jdbc驱动程序触发的
SQLException是jdbc在执行过程中发生问题时产生。有一个额外的方法getNextException()
catch(SQLException e){
out.println(e.getMessage());
while(e=e.getNextException()){
out.println(e.getMessage());
}
}

一般来说并不建议在jsp中编写数据库的访问程序,可以将数据库的访问封装在一个javabean中。

四,ResultSet深入

1,ResultSetMetaData
ResultSet rs=stmt.executeQuery("select....");
ResultSetMetaData rsmd=rs.getMetaData(); //获取ResultSetMateData对象
int numberOfColumns=rsmd.getColumnCount();//返回列数
boolean b=rsmd.isSearchable(int i);//返回第i列是否可以用于where子句
String c=rsmd.getColumnLabel(int i);//获取第i列的列标
Objcet obj=rs.getObject();
if(obj!=null)out.println(obj.toString());
else println("");

2,
rs.absolute(...)允许你指定结果集的绝对位置,如果没有它,假如你要取第1000条记录的数据,就只能rs.next()1000次了:)
rs.isAfterLast()是一种特殊的状态,表征已到达结果集的结尾,此时你如果调用rs.next()就会抛出异常
rs.next();//向后滚动
rs.getRow();//得到当前行号
rs.absolute(n);//光标定位到n行
rs.relative(int n);//相对移动n行

3,null
int i=rs.getInt("age");
if(!rs.wasNull())....//RecordSet::wasNull()用来检查null

4,存取大字符串和二进制文本
对于数据库中longvarchar和langvarbinary进行流操作
ResultSet rs=stmt.executeQueryString("select ...");
BufferedReader br=new BufferedReader(new InputStream(rs.getAsciiStream("vol1")));//长文本串
BufferedReader br=new BufferedReader(new InputStream(rs.getUnicodeStream("vol1")));
BufferedReader br=new BufferedReader(new InputStream(rs.getBinaryStream("vol2")));//长二进制文本
//取数据必须在rs.getAsciiStream(), rs.getUnicodeStream(), rs.getBinaryStream()等之后马上进行

五,浏览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初始化连接池。


有不对的地方提出来哈,别客气 。。。。

分享到:
评论

相关推荐

    jsp 数据库基本操作实验

    jsp数据库基本操作实验+mysql数据库连接

    JSP网站开发典型模块与实例精讲

     1.4.5 指点迷津——连接数据库常见问题  1.5 调试和错误处理  1.5.1 使用MyEclipse实现快速调试  1.5.2 使用System.out监控变量  1.5.3 为JSP指定一个错误处理页面  1.6 独家见解——B/S结构与C/S结构...

    JSP 程序设计从入门到精通 PDF 教程

     7.2 JSP连接数据库方法大全 171  7.3 Jsp连接mysql调用数据源方法 175  7.3.1对mysql数据库最基本的DB操作 175  7.3.2 调用对DB操作的方法 182  7.4 Jsp数据分页显示 184  7.5 jsp编写的留言本 188  ...

    JSP高级编程(全)

    1.5 本章小结 第2 章 Enterprise JavaBeans 2.1 EJB 技术简介 2.2 EJB 体系结构(一) 2.3 EJB 体系结构(二) 2.4 如何开发EJB(一) 2.5 如何开发EJB(二) 2.6 本章小结 第3 章 EJB 技术进阶 3.1 实体EJB 的开发技术之一...

    Java数据库编程宝典3

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典 PDF格式

    1.6 小结 第2章 SQL语言基础 2.1 SQL语言简介 2.2 SQL数据类型 2.3 数据定义语言(DDL) 2.4 数据操作语言(DML) 2.5 数据查询语言(DQL) 2.6 数据控制语言(DCL) 2.7 数据库中的对话、事务和锁定 2.8 创建和使用...

    JDBC 3.0数据库开发与设计

    2.2 使用JDBC连接数据库 2.2.1 SQLJ基本知识 2.2.2 用PL/SQL和Java建立应用程序的基本知识 2.2.3 PL/SQL和Java的特性 2.2.4 PL/SQL和Java的实际开发应用实例 2.2.5 Java连接各类数据库的程序代码 2.3 Web应用...

    Java数据库编程宝典2

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典1

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典4

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    JSP高级编程          

    1.5 本章小结 第2 章 Enterprise JavaBeans 2.1 EJB 技术简介 2.2 EJB 体系结构(一) 2.3 EJB 体系结构(二) 2.4 如何开发EJB(一) 2.5 如何开发EJB(二) 2.6 本章小结 第3 章 EJB 技术进阶 3.1 实体EJB 的开发技术之一...

    基于JSP酒店管理系统设计软件程序源码+数据库+WORD毕业设计论文文档.zip

    3.2.2数据库的连接原理 11 3.3设计思想 12 3.4详细设计 12 3.4.1 登录模块设计 12 3.4.2客房管理模块设计 12 3.4.3客户模块设计 13 3.4.4 特色菜品介绍模块设计 13 3.4.5餐桌预订模块设计 14 3.4.6餐饮消费管理...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    基于Java开发的学校信息管理系统的设计与实现(含论文及毕业设计源码、数据库文件)

    1.5 本章小结 2 第2章 系统开发技术的介绍 3 2.1 JAVA技术 3 2.2 MyEclipse简介 3 2.3 Tomcat概述 3 2.4 JSP技术 3 2.5 MYSQL数据库 4 2.6 B/S结构 5 第3章 系统分析 6 3.1 功能需求分析 6 3.2 可行性分析 6 3.2.1 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    基于Java Web的学生成绩信息管理系统_学位论文

    5.1 连接数据库 5.2 系统界面的搭建与登录的实现 5.2.1 系统界面的设计与实现 5.2.2 登录功能实现 5.3 学生功能实现 5.4 教师功能实现 5.4.1 成绩功能实现 5.4.2 其他信息查询 5.5 管理员功能实现 5.6 本...

    J2EE经典案例设计与实现

    第2章 J2EE数据库编程设计与实现 案例1:JSP+JavaBean实现数据库读取 案例2:JSP顺序输出查询结果 案例3:JSP逆序输出查询结果 案例4:JSP执行存储过程 案例5:J2EE访问Tomcat中的数据连接池 ...本章小结

    基于JSP企业员工信息管理系统设计软件程序源码+数据库+WORD毕业设计论文文档.zip

    基于JSP企业员工信息管理系统设计软件程序源码+数据库+WORD毕业设计论文文档. 企业员工信息管理系统主要用于实现公司的员工相关信息管理,基本功能包括:密码修改、员工管理、部门管理、出勤管理、工资管理、请假...

Global site tag (gtag.js) - Google Analytics