第9章 使用JDBC访问数据库要点Word格式.docx
《第9章 使用JDBC访问数据库要点Word格式.docx》由会员分享,可在线阅读,更多相关《第9章 使用JDBC访问数据库要点Word格式.docx(70页珍藏版)》请在冰豆网上搜索。
2。
加载JDBC驱动程序
通过JDBC可将Java程序连接到SQLSever、Oracle、Sybase、Informix等关系型数据库和其它数据源。
通过将驱动程序用作到数据源的桥梁,你可以直接在Java中存储和检索数据。
要与数据库连接,需要JDBC驱动程序。
可用如下方法加载JDBC驱动程序。
Class.forName("
sun.jdbc.odbc.JdbcOdbcDriver"
);
当创建了数据源并加载了JDBC驱动程序后,就可创建数据库的连接Connection对象。
下面的实例演示了如何创建并打开到数据库的连接。
任务9.1创建和打开一个到SQLServer的连接
主要知识点:
创建到数据库的连接。
关闭到数据库的连接。
问题描述:
创建图10.7所示的应用程序,单击“连接”按钮创建并打开一个到SQLServer的连接。
packageservlets;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.sql.*;
importjava.io.*;
publicclassExcuteSQLextendsHttpServlet{
publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException
{
try
{
Class.forName("
ConnectionaConnection=
DriverManager.getConnection("
jdbc:
odbc:
mydata"
"
sa"
1234"
req.setAttribute("
Message"
连结成功……<
br>
"
aConnection.close();
}
catch(ClassNotFoundExceptione1){
System.out.print("
加载驱动器有错误:
+e1.getMessage());
return;
catch(SQLExceptione2){
创建连接有错误:
+e2.getMessage());
}
RequestDispatcherdispatcher=req.getRequestDispatcher("
/SQLTest.jsp"
if(dispatcher!
=null)
dispatcher.forward(req,resp);
}
publicvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
doGet(req,resp);
}
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
web-appversion="
2.4"
xmlns="
xmlns:
xsi="
http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
<
servlet>
servlet-name>
ExcuteSQL<
/servlet-name>
servlet-class>
servlets.ExcuteSQL<
/servlet-class>
/servlet>
servlet-mapping>
url-pattern>
/excuteSQL<
/url-pattern>
/servlet-mapping>
/web-app>
SQLTest.jsp
%@pagecontentType="
text/html;
charset=gb2312"
%>
HTML>
HEAD>
/HEAD>
body>
formaction="
excuteSQL"
method="
post"
>
%
java.lang.StringaMessage=(java.lang.String)request.getAttribute("
if(aMessage!
out.print(aMessage+"
%>
<
p>
输入SQL:
/p>
textareaname="
txtSQL"
cols="
30"
rows="
5"
/textarea>
&
nbsp;
inputtype="
submit"
name="
Submit1"
value="
连接"
reset"
Reset1"
重置"
/form>
/body>
/HTML>
代码分析与讨论
1)加载JDBC驱动程序。
所有使用ODBC(开放数据库连接性,它是访问数据库的通用接口)数据源的程序都要用到sun.jdbc.odbc.JdbcOdbcDriver——Java2中一个JDBC-ODBC桥驱动程序。
在建立到数据源的连接前,必须加载该驱动程序。
在doGet方法中,首先装载驱动程序:
Class类位于java.lang包中,方法forName装载字符串参数指定的类,并可能引发ClassNotFoundException异常。
JDBC-ODBC桥产品经由ODBC驱动程序提供JDBC访问。
2)创建并打开连接。
装载驱动程序后,可以使用java.sql包中的DriverManager类的getConnection方法来建立到数据源的连接。
在doGet中,加载驱动程序后调用DriverManager类的getConnection方法创建一个Connection对象aConnection:
ConnectionaConnection=
如果使用数据源时发生了错误,方法getConnection以及数据源的其它所有方法都可能引发SQLException异常。
3)DriverManager.getConnection(Stringurl,Stringuser,Stringpassword)方法。
DriverManager.getConnection方法用于建立到数据库的连接,它返回一个Connection对象。
参数:
url:
指定数据源和用于连接到该数据源的数据库连接类型。
其格式如下:
subprotocol>
:
subname>
JDBCurl的三个部分如下:
●jdbc:
协议。
JDBCurl中的协议总是jdbc。
●<
:
驱动程序或连接机制的名称,可以有一个或多个驱动程序支持。
数据库的唯一标识符。
例如,通过JDBC-ODBC桥和数据库数据库的标识符mydata访问northwind数据库的url为:
user:
为用户名,其值为数据库登录帐户。
Password:
为密码,其值为数据库帐户登录的密码。
仅当数据源通过用户名和密码进行保护的情况下,才需要后面两个参数,否则,这两个参数可设置为空字符串("
)。
3)关闭连接。
每次使用完Connection后都必须将其关闭。
这可以使用Connection对象的Close方法来实现。
aConnection.close();
9.1.2Statement对象
Statement对象用来执行要对数据库执行操作的一个SQL语句和获得SQL语句产生的结果,利用Statement对象可直接对数据库进行处理。
任务9.2:
操作数据库
创建Statement对象。
使用Statement对象执行SQL命令。
继续完成“任务9.1:
创建和打开一个到SQLServer的连接”,单击“执行SQL”按钮,使用文本框中输入的SQL命令修改SQLServerstore数据库。
分析:
为了使用SQL命令修改SQLServerstore数据库,必须创建Statement对象,使用Statement对象执行SQL命令操作数据库。
StringsqlString=req.getParameter("
StatementaStatement=aConnection.createStatement();
intresult=aStatement.executeUpdate(sqlString);
影响数据库的行数为:
+String.valueOf(result)+"
1)创建Statement对象。
Statement为一接口,它本身不能被实例化。
但可用Connection对象的createStatement方法创建一Statement对象。
如下突出显示的代码调用Connection对象aConnection的createStatement方法,该方法返回一Statement对象,将其赋给Statement类型的对象变量aStatement:
StatementaStatement=aConnection.createStatement();
2)使用Statement对象修改数据库。
有了Statement对象后,可以调用Statement对象的executeUpdate方法执行参数指定的SQLINSERT或UPDATE或DELETE语句修改数据库。
如下突出显示的代码调用Statement对象aStatement的executeUpdate方法的参数sqlString指定的SQL命令(sqlString的值来自文本区txtSQL)。
StringsqlString=req.getParameter("
result=aStatement.executeUpdate(sqlString);
req.setAttribute("
3)Statement.executeUpdate(StringsqlString)方法。
对Connection执行SQL命令如INSERT、DELELE、UPDATE和SET等命令。
对于UPDATE、INSERT和DELETE语句,返回值为该命令所影响的行数。
对于其他所有类型的命令(如CREATETABLE),返回值为0。
参数sqlString:
其值为SQL命令(如INSERT、UPDATE或DELETE)字符串。
返回值:
方法的返回值为执行SQL命令后数据库受影响的行的数目。
Updateproductssetmodelnumber='
RU0070'
whereproductid=355
9.5使用ResultSet
ResultSet提供了一种读取通过在数据源执行查询命令获得的结果集中的数据的一种方法。
ResultSet是一接口,若要创建ResultSet对象,必须调用Statement对象的executeQuery方法,而不直接使用构造函数。
ResultSet是一个包含表格式形式(即行和列)的查询结果集。
可通过ResultSet对象的方法访问ResultSet中的数据。
任务9.3类别信息
对SQLServer中的Store数据库创建一数据库应用程序,该应用程序能够实现浏览每一产品类别的相关信息(如图10.10)。
%@pageimport="
java.sql.*"
charset=GB2312"
table>
tr>
td>
CategoryID<
/td>
CategoryName<
/tr>
%Connectioncon=null;
Statementstmt=null;
ResultSetrs=null;
try{
Class.forName("
con=DriverManager.getConnection("
stmt=con.createStatement();
Stringquery="
SELECT*FROMCategories"
;
rs=stmt.executeQuery(query);
while(rs.next()){%>
%=rs.getInt("
CategoryID"
)%>
%=rs.getString("
CategoryName"
%}
stmt.close();
con.close();
}
catch(SQLExceptione){
out.println("
数据库操作失败,产生异常:
+e.getMessage());
finally{
if(stmt!
=null)
stmt.close();
if(con!
con.close();
%>
/table>
1)ResultSet的作用。
JDBC通过Statement对象执行SQL语句可直接对数据库进行处理。
当Statement对象执行SQL查询语句之后,会返回一个ResultSet对象,通常称为结果集。
该结果集是由满足查询条件的所有行组成的集合,它排列成表的形式,可通过ResultSet对象的方法访问数据。
2)创建ResultSet对象。
executeQuery方法的返回值为ResultSet对象。
ResultSet对象是一个包含表格式形式(即行和列)的查询结果集。
例如,以下代码实现创建一ResultSet对象rs,然后调用ResultSet对象的getString方法获取结果集的CategoryName列的值。
ResultSetrs=aStatement.executeQuery("
SELECT*FROMCategories"
stringCateName=rs.getString("
ResultSet.getXXX方法在给定列名称的情况下或在给定列序号的情况下,获取指定列的值。
如rs.getString("
)或rs.getString
(2)获取CategoryName列的值。
3)ResultSet应用举例。
查询Categories数据库表中的所有记录,将每条记录显示在浏览器。
以下代码首先创建一与数据库的一个连接实例con,并通过调用该连接实例的createStatement方法创建Statement对象。
然后,调用Statement对象的executeQuery方法执行参数指定的查询命令,检索所有雇员的属性并将它们存储在ResultSet实例中。
调用ResultSet.next方法使游标移动到下一行(我们访问的是游标指向的行)。
如果存在数据行,则next方法返回值为true;
否则为false。
执行while循环迭代ResultSet实例的多条记录。
每一个迭代调用ResultSet.getXXX方法以获取一个类别的类别ID(rs.getInt("
))和类别名称(rs.getString("
))。
注意:
调用Statement对象的executeQuery方法返回的结果集中游标的最初位置在第一行的前面,因此要访问结果集需要首先调用ResultSet.next方法。
4)检索ResultSetd中的数据。
ResultSetd.getXXX方法。
如rs.getInt("
)或rs.getInt
(1)获取CategoryID列的值。
get方法中的XXX为指定