《JSP笔记》之五JSP和数据库应用.docx
《《JSP笔记》之五JSP和数据库应用.docx》由会员分享,可在线阅读,更多相关《《JSP笔记》之五JSP和数据库应用.docx(66页珍藏版)》请在冰豆网上搜索。
《JSP笔记》之五JSP和数据库应用
《JSP笔记》之五
第五章 JSP与数据库应用
本章中,我们使用SQLServer2000数据库管理系统。
特别约定,建立新的数据库名为:
student,在其下创建表:
表1:
student;表2:
login。
数据源名:
jspdb
§5.1访问SQLServer数据库和案例11
§5.1.1Web数据库程序设计基础
下面给出一个存取Web数据库的JSP数据库网络架构图。
图中,服务器端由Web应用程序服务器和数据库服务器组成,前者负责执行JSP程序。
JSP程序通过JDBC(JavaDataBaseConnectivity)接口和数据库服务器相连,并取得数据库中的数据。
JSP程序也通过JDBC向数据库发送SQL命令,对数据库进行新增、删除和修改记录等操作,这一切都需要依靠JDBC提供的类与方法来完成。
§5.1.2 数据库的基本概念
§5.1.3 在SQLServer2000中创建数据库
打开SQLServer2000的“企业管理器”,在其中创建数据库jspdb。
§5.1.4 JDBC简介
JDBC是Java数据库连接API,它由一些Java类和接口组成。
在JSP中可以使用JDBC实现对数据库中表记录的查询、修改、插入和删除等操作。
JDBC技术在JSP开发中占有很重要的地位。
经常使用JDBC进行如下操作:
(1)与一个数据库建立连接
(2)向已连接的数据库发送SQL语句
(3)处理SQL语句返回的结果
1.JSP与数据库连接的常用方式
应用程序必须首先与数据库建立连接。
通常有四种连接方式,见书第176至177页。
一般常用两种连接方式:
JDBC-ODBC桥接器和纯Java数据库驱动程序。
不同的连接方式对应着网页中不同的代码段。
2.JDBC中常用的类和接口
(1)DriverManager类:
驱动管理类
DriverManager类对象负责管理JDBC驱动程序,使用DriverManager的方法getConnection( )可以生成Connection对象。
(2)Connection类:
连接类
Connection类对象实现与数据源的连接,通过Connection类的createStatement( )方法可以生成Statement对象。
(3)Statement接口:
语句接口
用于发送简单的SQL语句,实现SQL语句的执行。
(4)ResultSet接口:
结果集接口
实现对数据的处理,维护记录指针,记录指针所指记录为当前记录。
ResultSet对象用于包含符合SQL语句中条件的所有记录,并且通过一套get方法提供了对这些记录中数据的访问。
(5)PreparedStatement接口:
预处理语句接口
用于发送带有一个或多个输入参数(IN参数)的SQL语句,PreparedStatement对象代表一个预编译的SQL语句。
执行速度较快,需要执行多次的语句应该创建为PreparedStatement对象。
PreparedStatement对象中的SQL语句可具有若干个参数,执行语句前用setXXX方法来提供。
§5.1.5DriverManager类
DriverManager类负责管理JDBC驱动程序,是JDBC的管理层,作用于用户和驱动程序之间。
它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。
与DriverManager类相关的方法主要有Class.forName(Stringdriver)和StaticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)。
前者用于加载注册驱动程序,后者用于取得对数据库的连接。
关于它们的用法,在下一节中马上介绍。
§5.1.6使用JDBC-ODBC桥接器方式连接数据库
使用JDBC-ODBC桥接器方式与数据库建立连接,要经过:
创建ODBC数据源――>建立JDBC-ODBC桥接器――>和ODBC数据源指定的数据库建立连接 共3个步骤。
1.创建ODBC数据源:
步骤见教材。
操作入口:
控制面板管理工具数据源(ODBC)打开“ODBC数据源管理器”窗口,选择“系统DSN”选项卡“添加”按钮设置驱动程序:
SQLServer数据源名:
jspdb,服务器:
(local)
登录方式:
选择默认设置:
如下图,选择“使用网络登录ID的WindowsNT验证(W)。
”
勾上“更改默认的数据库为(D):
”中,输入数据库:
jspdb。
其它采用默认设置,不需要修改。
创建后,测试一下数据源。
2.建立JDBC-ODBC桥接器
为了连接jspdb数据源的jspdb数据库,首先要建立一个JDBC-ODBC桥接器.这个建立过程是通过下面这句代码实现的:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
//或Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();
建立桥接器时可能发生异常,因此捕获这个异常。
所以建立桥接器的标准语句是:
try{
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
//或Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();
}
Catch(ClassNotFoundExceptione){
out.println(e)
}
3.与ODBC数据源指定的数据库建立连接
编写连接数据库的Java代码不会出现数据库的名称,只能出现数据源的名字。
先使用java.sql包中的Connection类声明一个连接对象,然后再使用类DriverManager调用它的静态方法getConnection创建这个对象:
Connectioncon=DriverMagager.getConnection(“jdbc:
odbc:
数据源名字”,”loginname”,”password”);
其中loginname和password是建立数据源时所使用的用户名和密码。
建立连接时应捕获SQLException异常:
try{
Connectioncon=DriverManager.getConnection(“jdbc:
odbc:
student”,”sa”,”sa”);
}
catch(SQLExceptione){
out.println(e);
}
这样就与数据源student建立了连接。
应用程序一旦与某个数据源建立连接,就可以通过SQL语句与该数据源所指定的数据库中的表交互信息,如查询、修改、更新表中的记录。
下例中是一个简单的JSP页面,该页面中的Java程序片代码负责连接到数据源jspdb,查询该数据源中的数据库jspdb中的表trade的全部记录。
表trade的字段设计和所有记录见书175页176页。
例1用JDBC-ODBC桥接器方式连接数据库,并显示表trade中的全部记录。
网页文件名example1.jsp
<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%>
<%
Connectioncon;
Statementsql;
ResultSetrs;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){
out.println(e);
}
try{
con=DriverManager.getConnection("jdbc:
odbc:
jspdb","","");
sql=con.createStatement();
rs=sql.executeQuery("SELECT*FROMtrade");
%>
序列号
商品名称
类型
|
供应商
价格
数量
<%
while(rs.next()){
%>
<%=rs.getObject("id")%> | <%=rs.getObject("tradename")%> | <%=rs.getObject("class")%> | <%=rs.getObject("provider")%> | <%=rs.getObject("price")%> | <%=rs.getObject("num")%> |
<%}%>
<%con.close();
}
catch(SQLExceptione1){}
%>
执行后,效果如下图:
[案例11]访问SQLServer数据库
采用JDBC-ODBC桥接器方式连接数据库中的表trade。
请同学们学习连接代码中参数的设置。
网页文件名jspodbc.jsp
--jspodbc.jsp-->
<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%>
访问SQLServer数据库访问SQLServer数据库
<%//下面程序段用于连接到数据库
//加载类sun.jdbc.odbc.JdbcOdbcDriver,并通过newInstance()方法实例化
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
out.println("数据库驱动注册成功!
");
//设置url为ODBC中的jspdb
Stringurl="jdbc:
odbc:
jspdb";
Stringuser="sa";
Stringpassword="";
//建立与数据库的连接,将连接赋给conn
Connectionconn=DriverManager.getConnection(url,user,password);
out.println("数据库连接成功!
");
//通过Connection类的createStatement()方法创建Statement实例,
//并赋给stmt,以方便操作数据库
Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
//创建SQL查询字符串,以选择数据表trade中的记录
Stringsql="select*fromtrade";
//通过Statement类的executeQuery()方法创建ResultSet对象rs,以方便对数据表的操作
ResultSetrs=stmt.executeQuery(sql);
//移动到数据表的第一条记录
rs.first();
//下面的语句将显示记录中各字段的内容
%>
id:
<%=rs.getObject("id")%>
商品名称:
<%=rs.getObject("tradename")%>
供应商:
<%=rs.getObject("provider")%>
类别:
<%=rs.getObject("class")%>
单价:
<%=rs.getObject("price")%>
数量:
<%=rs.getObject("num")%>
数据库访问成功!
<%
rs.close();//关闭rs
stmt.close();//关闭stmt
conn.close();//关闭conn
%>
数据库已关闭!
运行后效果如下图:
§5.1.7通过本地协议纯Java驱动程序访问SQLServer2000数据库
用Java语言编写的驱动程序称为纯Java驱动程序。
简单地说,JDBC可以调用本地协议纯Java驱动程序和相应的数据库建立连接。
这种连接数据库方式要经过2个步骤:
加载纯Java驱动程序->与指定的数据库连接。
1.加载纯Java驱动程序:
这种方式下不需要设置数据源,由于不依赖于ODBC,使得应用程序具有很好的移植性。
目前,许多数据库厂商都提供了自己的相应的纯Java驱动程序。
当使用纯Java驱动程序访问数据库时,必须保证:
在连接数据库的JSP网页程序所驻留的计算机上安装相应DBMS提供的纯Java驱动程序。
比如,Tomcat服务器上的某个Web应用程序,想访问SQLServer2000数据库管理系统所管理的数据库,则Tomcat服务器所驻留的计算机上必须要安装SQLServer 2000提供的纯Java驱动程序。
我们这里,使用的是MSSQLServer2000数据库管理系统。
所以需要把该厂商提供的jar包:
mssqlserver.jar、msutil.jar、msbase.jar挎贝到Java的jre\lib\ext中,或复制到Tomcat服务器安装目录的文件夹的common\lib中。
并且修改classpath环境变量:
在classpath的当前值中,再添加3个jar包,即修改完classpath后,其值为:
classpath=.;%Java_home%\lib\dt.jar;%Java_home%\lib\tools.jar;%tomcat_home%\common\lib\msbase.jar;%tomcat_home%\common\lib\msutil.jar;%tomcat_home%\common\lib\mssqlserver.jar;%tomcat_home%\common\lib\servlet.jar;//红色部分就是新添加的部分。
除此之外,还有一件很重要的事,就是安装SQLServer2000SP3补丁。
SQLServer2000SP3补丁可以直接在网上下载,其文件名为chs_sql2ksp3.exe。
下载完后,双击该文件安装SQLServer2000SP3补丁。
准备好了后,加载纯Java驱动程序:
//注意,这里的参数和ODBC桥接器方式不一样。
try{
Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).newInstance();
}
catch(Exceptione){
out.println(e);
}
2.和指定的数据库建立连接
假设网页程序要与SQLServer数据库服务器管理的数据库jspdb建立连接,而有权访问数据库jspdb的用户的id和密码分别是sa、空,那么建立连接的代码如下:
try{
Stringurl=”jdbc:
microsoft:
sqlserver:
//localhost:
1433;DatabaseName=jspdb”;
Stringuser=”sa”;
Stringpassword=””;
con=DriverManager.getConnection(url,user,password);
}
catch(SQLExceptione){
out.println(e);
}
下面的例子是采用纯Java数据库驱动程序方式来实现上一个例题的例子。
例2 使用纯Java数据库驱动方式显示表中的全部记录
网页文件名example2.jsp
<%@pagecontentType="text/html;charset=GB2312"%>
<%@pageimport="java.sql.*"%>
<%@pageimport="java.util.*"%>
<%
Connectioncon;
Statementsql;
ResultSetrs;
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
}
catch(Exceptione){
out.print(e);
out.print("***************");out.print("
");
}
try{
Stringurl;
url="jdbc:
microsoft:
sqlserver:
//localhost:
1433;DatabaseName=jspdb";
Stringuser="sa";
Stringpassword="";
con=DriverManager.getConnection(url,user,password);
sql=con.createStatement();
rs=sql.executeQuery("SELECT*FROMtrade");
%>
序列号
商品名称
类型
|
供应商
价格
数量
<%
while(rs.next()){
%>
<%=rs.getObject("id")%> | <%=rs.getObject("tradename")%> | <%=rs.getObject("class")%> | <%=rs.getObject("provider")%> | <%=rs.getObject("price")%> | <%=rs.getObject("num")%> |
<%}%>
<%con.close();
}
catch(SQLExceptione1){
out.println(e1);
}
%>
运行后,效果同例1完全一样。
[拓展案例18]通过本地协议纯Java驱动程序访问SQLServer2000数据库
网页文件名jspSQLServer.jsp
--jspSQLServer.jsp-->
<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%>
通过本地协议纯Java驱动程序访问SQLServer2000数据库通过本地协议纯Java驱动程序访问SQLServer2000数据库
<%//下面程序段用于连接到数据库
//加载类com.microsoft.jdbc.sqlserver.SQLServerDriver,并通过newInstance()方法实例化
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
//设置url在本地主机1433端口上访问sqlserver数据库,数据库名为jspdb
Stringurl="jdbc:
microsoft:
sqlserver:
//localhost:
1433;DatabaseName=jspdb";
//设置用户名和密码
Stringuser="admin";
Stringpassword="";
//建立与数据库的连接,将连接赋给conn
Connectionconn=DriverManager.getConnection(url,user,password);
//通过Connection类的createStatement()方法创建Statement实例,
//并赋给stmt,以方便操作数据库
Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
//创建SQL查询字符串,以选择数据表trade中的记录
Stringsql="select*fromtrade";
//通过Statement类的ex