Java Web程序开发与分析课件:数据库访问(二)_第1页
Java Web程序开发与分析课件:数据库访问(二)_第2页
Java Web程序开发与分析课件:数据库访问(二)_第3页
Java Web程序开发与分析课件:数据库访问(二)_第4页
Java Web程序开发与分析课件:数据库访问(二)_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb程序设计

——数据库访问(2)2主要内容JDBC操作数据库

Statement接口执行SQL语句

PreparedStatement接口

ResultSet结果集3使用Statement执行SQL语句java.sql包下有两个非常重要的接口:

Statement:定义了运行SQL指令所需的方法,在使用Statement的方法之前,需要取得其对象,Statement类型的对象是通过Connection接口的方法creatStatement()产生的;

ResultSet:如果运行的SQL是Select类型的指令,ResultSet将封装运行后返回的数据内容;4返回结果集Statement与ResultSet之间的运行过程Statement对象Connection对象ResultSet对象数据库数据库连接传送SQL指令5Statement主要提供运行SQL指令的方法,主要包括:executeQuery(Stringsql):用于运行SQL查询语句,如:Select语句;executeUpdate(Stringsql):运行SQL更改指令,如:insert,delete,update;

execute(Stringsql):用于执行返回结果集、更新计数的SQL语句;executeBatch():运行SQL批处理指令;close():结束对象,释放资源;6

该方法用于执行产生单个结果集的查询SQL语句,如:Select语句,该方法在Statement接口中的定义为:

ResultSetexecuteQuery(Stringsql)throwsSQLException

例:通过使用executeQuery()方法对某数据库中的数据进行访问,将数据用表格方式显示;(1)executeQuery()方法7<body><%Stringurl=“jdbc:sqlserver://localhost:1433/Data"; StringuserName="sa"; Stringpassword=""; Stringsql=null; Connectionconn=null; Statementstmt=null; try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); }catch(ClassNotFoundExceptione){ ut.println("加载驱动器类时出现异常"); }

加载数据库驱动程序8在Eclipse开发环境中加载数据库驱动(1)打开Reference窗口9(2)在当前运行的JRE中加载数据库驱动10(3)打开所使用Web工程的Property窗口,选择JavaBuildPath,在libraries中加载数据库驱动;11try{

conn=DriverManager.getConnection(url,userName,password);

//创建Statement语句

stmt=conn.createStatement();

sql=“SELECT*FROMstudent”;

//使用executeQuery执行SQL查询语句

ResultSetrs=stmt.executeQuery(sql);

%>

连接数据库生成Statement对象12<tablewidth=“740”border=“1”cellspacing=“0”cellpadding=“6”>

<tr>

<tdwidth=“120”align=“center”valign=“middle”>编号</td>

<tdwidth="145"align="center">姓名</td>

<tdwidth="253"align="center">地址</td>

<tdwidth="148"align="center">出生日期</td>

</tr>

13<%

//显示返回的结果集

while(rs.next()){

intid=rs.getInt(1);

Stringname=rs.getString(2);

Stringaddress=rs.getString(3);

Stringbirthday=rs.getString(4); %>

<tr>

<tdheight=“40”align=“center”valign=“middle”><%=id%></td>

<tdalign=“center”valign=“middle”><%=name%></td>

<tdvalign=“middle”><%=address%></td>

<tdalign=“center”valign=“middle”><%=birthday%></td>

</tr>

<%}------while循环结束14

rs.close();

stmt.close();

}catch(SQLExceptione){

out.println("出现SQLException异常");

}finally{

//关闭语句和数据库连接

try{

if(conn!=null)conn.close();

}catch(SQLExceptione){

out.println("关闭数据库连接时出现异常");

}}

%></body>释放Statement和ResultSet对象15(2)executeUpdate()方法executeUpdate()方法执行SQL中的更改语句,如:insert,update,delete语句;CREATETable,DROPTable语句。其在Statement接口中的定义为:

intexecuteUpdate(Stringsql)throwsSQLException

对于insert等更改语句,其返回值为受影响的行数;对于CreateTable等语句,其返回值为0。16例:使用executeUpdate()方法更新数据库中的数据。

<body>

<%

----加载SQLServer数据库驱动程序;

Class.forName();

----与数据库建立连接;

DriveManager.getConnection();17try{ //创建Statement语句

stmt=conn.createStatement();

sql="DELETEFROMstudentWHEREstu_id=10";

//使用executeUpdate执行更新语句

intaffectedRowCount=stmt.executeUpdate(sql); out.println("删除操作影响的数据行数为:"+affectedRowCount+"<br>");

//使用executeUpdate执行更新语句

sql="INSERTINTOstudent(name,address,birthday)"+ "VALUES('小王','北京','1980-05-10')"; affectedRowCount=stmt.executeUpdate(sql); out.println("插入操作影响的数据行数为:"+affectedRowCount+"<br>");创建Statement对象执行Insert更新语句18sql="updatestudentsetaddress='shanghai'wherestu_id=11";

affectedRowCount=stmt.executeUpdate(sql);

out.println("修改操作影响的数据行数为:"+affectedRowCount+"<br>");

stmt.close();

}catch(SQLExceptione){

out.println("出现SQLException异常");

}执行Update更新语句19finally{

//关闭语句和数据库连接

try{

if(conn!=null)conn.close();

}catch(SQLExceptione){

out.println("关闭数据库连接时出现异常");

}

}

%></body>20(3)execute()方法execute()方法应用于执行作为参数传递的SQL语句,返回:①ResultSet对象;②更新计数(受影响的行数);该方法定义如下:

booleanexecute(Stringsql)throwsSQLException

其返回值为true时,执行结果为ResultSet对象,为false时,为更新的行数。21(3)execute()方法

执行SQL查询语句

Statementstmt=conn.creatStatement();stringstrsql=“select*fromtable1”;booleanisResult=stmt.execute(strsql);if(isResult){

ResultSetrs=stmt.getResultSet();}22(3)execute()方法

执行数据更新语句

stringstrsql=“DeleteFromtable1whereid=10”;boolisResult=stmt.execute(strsql);if(!isResult){//isResult==false

intcount=stmt.getUpdateCount();}23例:使用execute()方法访问数据库中的数据,如果SQL语句正确(SQL语句未知),将返回结果。

<body>

<%Stringsql=request.getParameter("sqltest");

if(sql==null){%>

<formname="Example"method="post"action="">

<p>sql语句:<inputtype="text"name="sqltest"size="100"maxlength="100"></p>

<p><inputtype="submit"value="传送"></p>

<%}24else{----加载SQLServer数据库驱动程序

-----建立与数据库的连接try{ //创建Statement语句

stmt=conn.createStatement();

out.println("执行的SQL语句为:"+sql+"<br>");

//使用execute执行未知SQL语句

booleanisResultSet=stmt.execute(sql);

25if(isResultSet){

ResultSetrs=stmt.getResultSet(); out.println("返回的执行结果"+count+"为结果集"+"<br>"); //显示返回的结果集

while(rs.next()){ intf1=rs.getInt(1); Stringf2=rs.getString(2); Stringf3=rs.getString(3); out.println(f1+""+f2+""+f3); out.println("<br>"); } rs.close(); }获取ResultSet对象26else{ intaffectedRowCount=stmt.getUpdateCount(); if(affectedRowCount==-1)break; out.println("更新计数为:"+affectedRowCount+"<br>"); }

stmt.close();}catch(SQLExceptione){ out.println("出现SQLException异常");}}%></form></body>27(4)executeBatch()方法executeBatch()方法用于成批地执行SQL语句,但不能执行返回值为ResultSet结果集的SQL语句,如:Select语句,该方法定义如下:

int[]executeBatch()throwsSQLException

另外还有两个辅助方法:

addBatch():向批处理中加入SQL语句;

clearBatch():清空批处理中的SQL语句;28----加载SQLServer数据库驱动程序

-----建立与数据库的连接try{ //创建Statement语句

stmt=conn.createStatement();

stmt.addBatch(“DeleteFromtabel1whereid=09”);stmt.addBatch(“DropTabletable1”); //使用execute执行未知SQL语句

int[]Counts=stmt.executeBatch();

29for(inti=0;i<Counts.length;i++){out.println(“更新的语句行数:”+Counts[i]);} stmt.close();}catch(SQLExceptione){ out.println("出现SQLException异常");}}%>30主要内容JDBC操作数据库

Statement接口执行SQL语句

PreparedStatement接口

ResultSet结果集31PreparedStatement接口PreparedStatement接口继承自Statement接口,与Statement接口相比,有两方面的不同:

PreparedStatement实例包含预编译的SQL语句,使得SQL语句“准备好”;

PreparedStatement对象包含的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定,由“?”保留。每个IN参数的值由适当的方法来提供。32

作为Statement的子类,PreparedStatement继承了Statement的所有功能;另外它还添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值。(1)创建PreparedStatement对象

PreparedStatementps=con.prepareStatement(“UPDATEtestSETa=?Whereb=?”)

其中,con为Connection对象,该SQL语句包含2个IN参数。33(2)传递IN参数:在执行PreparedStatement对象之前,必须设置每个IN参数的值。可以通过调用:setXXXX()方法,其中XXX代表该参数的数据类型,如:String、int、long型。例如:

ps.setLong(1,1);ps.setString(2,”name”);

其中,setXXX()方法中的第一个参数为所设置参数的位置,第二个参数为所设定的值。34

(3)IN参数中的数据类型的一致性

setXXX()方法中的XXX代表参数的数据类型,这里的数据类型是Java类型。但驱动程序会将Java数据类型映射为JDBC类型,然后发送给数据库:

Java数据类型JDBC类型如:ps.setShort(2,4)

short(Java数据类型)SMALLINT(JDBC类型)

驱动程序35Java数据类型到JDBC数据类型的映射:

Java数据类型JDBC数据类型

StringVARCHAR,LONGVARCHAR

BooleanBIT

ByteTINYINT

ShortSMALLINT

Int

Long

Float

DoubleDOUBLEREALINTEGERBIGINT36(4)数据流发送IN参数值在PreparedStatement对象中,可以通过输入流的方式进行参数数据的传输,提供了3种将IN参数设置为Java输入流的方法:

setBinaryStream():字节流

setAsciiStream():含有ASCII字符的流

setUnicodeStream():含有Unicode字符的流其中,这三个方法相比于setXXX()方法,多了一个指定流的总长度的参数。37例:使用PreparedStatement执行SQL语句(预编译)。

<body>

<%

----加载SQLServer数据库驱动程序

-----建立与数据库的连接

38try{ //创建PreparedStatement语句

PreparedStatementpstmtDelete=conn.prepareStatement( "DELETEFROMstudentWHEREstu_id=?");

PreparedStatementpstmtInsert=conn.prepareStatement( "INSERTINTOstudent(name,address,birthday)VALUES(?,?,?)");

PreparedStatementpstmtSelect=conn.prepareStatement( "SELECT*FROMstudentWHEREstu_id>=?"+ "ORDERBYstu_id");pstmtSelect.setInt(1,1);创建执行Delete语句的对象创建执行Insert语句的对象创建执行Select语句的对象39//多次执行同一语句

for(inti=1;i<4;i++){

//使用setXXX方法设置IN参数

pstmtDelete.setInt(1,i);

pstmtInsert.setString(1,"name"+i);

pstmtInsert.setString(2,"city"+i);

pstmtInsert.setDate(3,newDate(85,12,i));

//执行PreparedStatement语句

pstmtDelete.executeUpdate();

pstmtInsert.executeUpdate();

ResultSetrs=pstmtSelect.executeQuery();

设置参数值40

// 显示返回的结果集

while(rs.next()){ intstuID=rs.getInt(1); Stringname=rs.getString(2); Stringaddress=rs.getString(3); Stringbirthday=rs.getString(4); out.prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论