版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章JSP中使用数据库2021/6/271学习目的与要求理解JDBC应用程序编程接口;掌握使用纯Java驱动程序操作数据库的编程方法;掌握对数据的增加、删除、修改和查询编程技术;查询记录的分页面显示;数据库连接池编程技术。2021/6/272本章主要内容7.1JDBC概述7.2JDBC应用程序接口简介7.3利用JDBC访问数据库7.4数据库操作案例7.5上机实训7.6本章习题2021/6/2737.1JDBC概述7.1.1什么是JDBCJDBC是Java数据库连接(JavaDataBaseConnectivity)技术的简称,指Java同许多数据库之间连接的一种标准。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的JavaAPI,使开发人员可以用纯Java语言编写完整的数据库应用程序。简单地说,JDBC能够完成下列三件事:与一个数据库建立连接(connection)。向数据库发送SQL语句(statement)。处理数据库返回的结果(resultset)。2021/6/2747.1JDBC概述7.1.2JDBC的构成1.JDBCAPI:定义了标准接口,无论编写Mysql还是Oracle等数据库程序,这些接口是一致的。2.JDBC数据库驱动程序2021/6/2757.2JDBC应用程序接口简介7.2.1DrvierManager类提供管理一组JDBC驱动程序所需要的基本服务,可以跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。该类的常用方法有:getConnection和forName方法。publicstaticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)publicstaticClassforName(StringclassName)2021/6/2767.2JDBC应用程序接口简介DrvierManager类的使用法:(1)加载驱动例如:Class.forName("com.mysql.jdbc.Driver");(2)与数据库建立连接DriverManager.getConnection(Stringurl,Stringuser,Stringpassword);2021/6/2777.2JDBC应用程序接口简介对getConnection函数中的参数解释:url参数的命名方法:url由3部分组成,各部分间用冒号分隔,如下所示:jdbc:<子协议>:<子名称>其中:jdbc——协议名称。在JDBCURL中的协议总是jdbc。<子协议>——驱动程序名或数据库连接机制的名称。如“odbc”,它是用于指定ODBC风格的数据库资源名称的URL而保留的。<子名称>——一种标识数据库的方法。子名称可以依不同的子协议而变化。它还可以有子名称的子名称(含有驱动程序编程人员所选的任何内部语法)。使用子名称的目的是为定位数据库提供足够的信息。2021/6/2787.2JDBC应用程序接口简介7.2.2Connection接口Connection接口是java.sql包中最重要的接口。Connection对象代表与数据库的连接。一个应用程序可与单个数据库有一个或多个连接,或者可与许多数据库有连接。数据库连接一旦建立,就可用来向它所涉及的数据库发送SQL语句。Connection的作用是创建向数据库发送SQL语句的三个接口。这三个接口分别是:Statement接口PreparedStatement接口CallableStatement接口。2021/6/2797.2JDBC应用程序接口简介7.2.2Connection接口Connection接口提供了多个同名但是参数不同的方法创建以上的三个接口。例如:publicStatementcreateStatement();publicStatementcreateStatement(intresultSetType,intresultSetConcurrency);其中:参数resultSetType指返回记录集的类型resultSetConcurrency指发送的SQL语句的权限2021/6/27107.2JDBC应用程序接口简介7.2.2Connection接口常用的一些方法:booleanisClosed():用于判断Connection对象是否已经被关闭;voidcommit():用于提交SQL语句,确认从上一次提交以来所进行的修改;voidclose():断开连接,释放资源;voidrollback():取消SQL语句,取消当前事务中进行的修改。DatabaseMetaDatagetMetaData():获取一个DatabaseMetaData对象。2021/6/27117.2JDBC应用程序接口简介7.2.3Statement接口Statement接口对象创建完毕后,主要使用以下方法:publicResultSetexecuteQuery(Stringsql):用于执行产生单个结果集的语句,如select。publicintexecuteUpdate(Stringsql):用于执行insert、update或delete语句以及SQLDLL(数据定义)语句。当执行insert、update或delete语句时将返回一个整数,用于表示受影响的行数,返回结果为0时表示操作失败;当执行SQLDLL语句,如createtable时,由于它不操作行,返回值将总为0。2021/6/27127.2JDBC应用程序接口简介7.2.3Statement接口publicbooleanexecute(Stringsql):用于执行返回多个结果集、多个更新计数或二者结合的SQL语句。publicint[]executeBatch():用于执行几个SQL语句。Statement接口使用addBatch(Stringsql)方法将几个SQL语句添加到一个语句块中,然后一同提交给数据库服务器,同时执行。当执行多个SQLinsert语句时效率将很高,因为一次提交比多次提交要节省很多系统资源。voidclose():释放Satement对象的数据库和JDBC资源。2021/6/27137.2JDBC应用程序接口简介7.2.3Statement接口PreparedStatement接口对象主要使用以下方法:publicResultSetexecuteQuery(Stringsql):使用Select命名对数据库进行查询。publicintexecuteUpdate(Stringsql):用于执行insert、update或delete语句对数据库进行新增、删除和修改操作。voidsetXXX(intparameterIndex,XXXx):设定XXX数据类型值给PreparedStatement类对象的IN参数。2021/6/27147.2JDBC应用程序接口简介7.2.3Statement接口CallableStatement接口主要用于执行存储过程,其主要方法同Statement。存储过程有两种参数,IN参数和OUT参数。CallableStatement接口继承了PerpareedStatement接口的setXXX方法对IN参数赋值。在CallableStatement接口中使用OUT参数,要做两件事情,一是对OUT参数进行类型注册,二是获取OUT参数的值。CallableStatement提供了多种方法进行类型注册,下面是常用的两种:registerOutParameter(StringparameterStringName,intsqlType);registerOutParameter(StringparameterStringName,intsqlType,intscale);2021/6/27157.2JDBC应用程序接口简介7.2.4数据结果集——ResultSet接口ResultSet接口用于获取执行SQL语句(或数据库存储过程)返回的结果。它的实例对象是符合SQL语句条件的所有行。常用的方法有:publicbooleannext():用于数据库游标移动到结果集的下一行,使之成为当前行。如果当前行为最后一行,返回值为false;否则,返回true。在定位到结果集中的某行后,就可以读取数据。对于不同数据类型,要使用不同的读取方法getXXX()。JDBC提供了两种形式:2021/6/27167.2JDBC应用程序接口简介7.2.4数据结果集——ResultSet接口publicXXXgetXXX(StringcolumnName):XXX代表任意的数据类型,参数columnName代表列名。publicXXXgetXXX(intcolumnIndex):XXX代表任意的数据类型,参数columnIndex代表列号。ResultSetMetaDatagetMetaData():获取结果集的列编号、类型和属性下面是ResultSet接口的示例:2021/6/2717privateStatementstmt=null;privateResultSetrs=null;privatePreparedStatementprpSql=null;Class.forName("com.mysql.jdbc.Driver");Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:端口号/数据库名称","用户名","密码");stmt=conn.createStatement();rs=stmt.executeUpdate("select*fromdatabase");while(rs.next()){……rs.getString(1);}rs.close();stmt.close();conn.close();2021/6/27187.2JDBC应用程序接口简介7.2.5数据库元数据--DatabaseMetaData和ResultSetMetaDataDatabaseMetaData接口可以从数据库管理系统中获得数据库的信息,例如数据库所有的表名、存储过程名等信息。这个类提供了许多方法来取得这些信息,常用的方法如下:StringgetDatabaseProductName():获得数据库的名称。ResultSetgetCooumns(Stringdatabasename,Stringdboname,Stringtablename,Stringcolumnname):获得表字段信息,以列的方式存储在一个ResultSet对象中。2021/6/27197.2JDBC应用程序接口简介7.2.5数据库元数据--DatabaseMetaData和ResultSetMetaDataResultSetMetaData接口用来获取数据库表的结构。通过它提供的一些常用方法,可以获得ResultSet对象中的类型和属性信息的对象。常用方法如下:intgetColumnType(intcolumn):检索指定列的SQL类型;StringgetTableName(intcolumn):获取指定列的名称;2021/6/27207.3利用JDBC访问数据库所有的利用JDBC访问数据库的程序都具有以下的流程:加载JDBC驱动程序建立和数据库的连接执行SQL语句存放处理结果与数据库断开连接2021/6/27217.3利用JDBC访问数据库7.3.1通过JDBC-ODBC桥连接来访问数据库可以使JDBC有能力访问几乎所有类型的数据库。下面通过一个例子介绍:1、首先建立一个access数据库,数据库名称为:book,保存数据库文件。2021/6/27227.3利用JDBC访问数据库7.3.1通过JDBC-ODBC桥连接来访问数据库2、配置数据源首先要配置ODBC数据源。选择数据源(ODBC)(Win2000在管理工具中;WinXP在控制面板中)先看图片,在现场演示。2021/6/2723在管理工具中,选择“数据源”在对话框中选择用户dsn,添加2021/6/2724在对话框中选择accessdriver(*。Mdb)单击“完成”。在数据源名称输入“book”。选择数据库为book。2021/6/2725选择图书管理数据库.mdb权限默认,在登录用户名输入对应的用户名和密码。2021/6/27267.3利用JDBC访问数据库7.3.1通过JDBC-ODBC桥连接来访问数据库3编写相应的程序(1)加载数据库的驱动程序(2)建立连接(3)向数据库发送SQL语句(4)处理查询结果(5)关闭数据库连接2021/6/27277.3利用JDBC访问数据库7.3.1通过JDBC-ODBC桥连接来访问数据库【例7.1】利用JDBC-ODBC桥连接数据库,执行SQL语句,并在数据库中插入一条记录。2021/6/2728ch7_1.jsp文件内容如下:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.sql.*"%><html><bodybgcolor=cyan><%Connectionconn;Statementstmt=null;ResultSetrs;intn;try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){out.print(e);}2021/6/2729try{//和数据库建立连接conn=DriverManager.getConnection("jdbc:odbc:book","","");stmt=conn.createStatement();//创建Statement对象,用于执行SQL语句n=stmt.executeUpdate( "insertintobookvalues('TP003','ASP.NET动态网站开发教程','李英俊','清华大学出版社',35)");//向表中插入一条记录if(n>0)out.println("添加成功");elseout.println("添加失败");rs=stmt.executeQuery("select*frombook");2021/6/2730out.print("<tableborder=2>");out.print("<tr>");out.print("<thwidth=50>"+"书号");out.print("<thwidth=100>"+"书名");out.print("<thwidth=50>"+"作者");out.print("<thwidth=100>"+"出版社");out.print("<thwidth=50>"+"单价");out.print("</tr>");2021/6/2731while(rs.next()){ out.print("<tr>"); out.print("<td>"+rs.getString(1)+"</td>"); out.print("<td>"+rs.getString(2)+"</td>"); out.print("<td>"+rs.getString(3)+"</td>"); out.print("<td>"+rs.getString("publish")+"</td>"); out.print("<td>"+rs.getFloat("price")+"</td>"); out.print("</tr>");}out.print("</table>");stmt.close();//关闭数据库conn.close();}2021/6/2732catch(Exceptione){out.println(e.toString());}%></body></html>2021/6/27337.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库1.安装mysql数据库从网上下载mysql-5.0.22-win32.zip,将mysql安装到了E:\mysql目录中。2.启动mysqlcde:\mysql\binmysqld-nt2021/6/27347.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库2021/6/27357.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库3.启动mysql监视器用户再启动一个MS-DOS窗口,切换到E:\MYSQL\BIN目录中,执行如下命令:e:cdmysqlcdbinmysql-uroot2021/6/27367.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库2021/6/27377.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库4.创建数据库启动mysql监视器后,可以在提示符下输入sql语句来创建数据库和表,sql语句结束必须使用“;”符号。在编辑sql语句的过程中可以使用/c终止当前sql语句的编辑。在mysql监视器提示符下,输入创建图书管理数据库booklib的SQL语句并执行,2021/6/27387.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库2021/6/27397.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库5.创建数据库中的表在booklib数据库中创建book表的SQL语句为:
CREATETABLEbook(bidchar(20)NOTNULL,namechar(20)defaultNULL,authorchar(10)defaultNULL,publishvarchar(50)defaultNULL,pricefloatdefaultNULL,PRIMARYKEY(bid))ENGINE=InnoDBDEFAULTCHARSET=utf8;2021/6/27407.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库5.创建数据库中的表2021/6/27417.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库6.编写相应的程序--连接mysql数据库try{Class.forName("com.mysql.jdbc.Driver");}try{//和数据库建立连接conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/booklib","root","");……conn.close();}catch(Exceptione){out.println(e.toString());}2021/6/27427.3利用JDBC访问数据库7.3.2利用本地协议纯Java驱动程序连接数据库【例7.2】利用纯Java驱动程序连接mysql数据库,查询book表中的所有记录2021/6/27432021/6/27442021/6/27452021/6/2746连接不同的数据库,除Class.forName()中的驱动程序类及url的书写方式不同之外,其他所有部分均相同。2021/6/27477.3利用JDBC访问数据库7.3.3配置和连接不同的数据库1.连接Oracle数据库安装完Oracle后,找到文件classes12.zip(可以在Oracle安装目录搜索得到),将该文件复制到JavaJDK的子目录/jre/lib/ext目录中,并其更名为classes.jre或cleasses.jar。Class.forName("oracle.jdbc.driver.OracleDriver");DriverManager.getConnection("jdbc:oracle:thin"@host:端口号:数据库名","用户名","密码");2021/6/27487.3利用JDBC访问数据库7.3.3配置和连接不同的数据库2.连接SqlServer数据库下载sqljdbc_1.1.1501.101_enu.exe驱动安装文件。找到sqljdbc.jar文件,将其复制到Tomcat所使用的JDK的\jre\lib\ext目录中。连接方法:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");DriverManager.getConnection("jdbc:sqlserver://:1443;DatabaseName=数据库名",“用户名”,“密码”);2021/6/2749
提示:
如果应用程序和要连接的SqlServer2000服务器在不同的计算机上,可以使用SqlServer2000服务器的ip地址,例如。如果应用程序无法和SqlServer2000连接,可能需要更新SqlServer2000服务器。用户可以从微软网站下载补丁sqlsp4.rar,安装该补丁即可。7.3利用JDBC访问数据库2021/6/27507.4数据库操作案例7.4.1查询数据1.顺序查询数据ResultSetrs=stmt.executeQuery("selectbid,name,author,publish,pricefrombook");对于结果集rs的列数为5列,第一列对用bid,第二列对应name,第三列对应author,第四列对应publish,第五列对应price;而每一次rs只能看到一行,要在看到下一行,必须使用next()方法移动当前行。ResultSet对象使用getXXX()方法获得当前行字段的值。下面是一个实例:2021/6/27512021/6/2752QueryBean.java代码2021/6/2753ch7_3.jsp文件内容:2021/6/27547.4数据库操作案例2.随机查询如果需要在结果集中前后移动或随机显示某一条记录,这时就必须得到一个可以滚动的结果集。得到滚动结果集的方法如下:Statementstmt=conn.createStatement(inttype,intconcurrency);ResultSetrs=stmt.executeQuery(sqlstr);其中type的取值决定结果集的滚动方式,可以取下列值:2021/6/27557.4数据库操作案例2.随机查询ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下移动。ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库的数据变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE:结果集的游标可以上下移动,当数据库的数据变化时,当前结果集同步变化。2021/6/27567.4数据库操作案例2.随机查询滚动结果集ResultSet对象可以使用的方法如下:publicbooleanprevious():将游标向上移动,当移动到结果集第一行之前返回false。publicvoidbeforeFirst():将游标移到结果集第一行之前。publicvoidafterLast():将游标移到结果集最后一行之后。publicvoidfirst():将游标移到结果集的第一行。publicvoidlast():将游标移到结果集的最后一行。publicbooleanisAfterLast():判断游标是否在结果集的最后一行之后。2021/6/27577.4数据库操作案例2.随机查询滚动结果集ResultSet对象可以使用的方法如下:publicbooleanisBeforeFirst():判断游标是否在结果集第一行之前。publicbooleanisFirst():判断游标是否在结果集第一行。publicbooleanisLast():判断游标是否在结果集的最后一行。publicintgetRow():得到当前游标所在的行,行号从1开始,如果结果集没有行,则返回0。publicbooleanabsolute(introw):将游标移到到row所指定的行,row取负值则倒数,如-1,则移动到最后一行。2021/6/27587.4数据库操作案例2.随机查询【例7.4】随机查询示例。2021/6/2759RandomQuerybean.java2021/6/2760ch7_3.jsp文件内容:2021/6/27617.4数据库操作案例3.条件查询在顺序查询和随机查询中得到的是表中的全部记录。如果要得到表中满足条件的记录,就要采用条件查询。条件查询是由客户端提供查询条件,即查询的参数,再由这些参数构造SQL语句,执行该语句并得到筛选结果的查询。下面的例子根据用户选择的字段和输入的关键字查询图书信息,如果没有输入关键字则显示所有图书的信息。2021/6/27627.4数据库操作案例3.条件查询【例7.5】条件查询图书信息2021/6/2763keyQueryBean.java2021/6/2764ch7_5.jsp文件内容:2021/6/27657.4数据库操作案例7.4.2更新查询Statement对象提供了intexecuteUpdate(StringsqlStatement)方法,用于实现对数据库中数据的添加、删除和更新操作。sqlStatement参数是由insert、delete和update等关键字构成的Sql语句。函数返回值为查询所影响的行数,失败返回0。例如添加记录的sql语句:StringsqlStatement="insertbookvalues('tp1004','高数','杨','清华出版社',35)";2021/6/27667.4数据库操作案例7.4.2更新查询stmt.executeUpdate(sqlStatement);例如更新记录的sql语句:StringsqlStatement="updatebooksetname='新值'wherebid='tp1001'";stmt.executeUpdate(sqlStatement);例如删除记录的sql语句:StringsqlStatement="deletefrombookwherebid='tp1001'";stmt.executeUpdate(sqlStatement);2021/6/27677.4数据库操作案例7.4.2更新查询1、添加记录【例7.6】向mysql数据库中的表追加记录2021/6/2768addBean.java2021/6/2769ch7_6.jsp文件内容:2021/6/27707.4数据库操作案例7.4.2更新查询2、删除记录【例7.7】删除book表中的记录。2021/6/2771listBean.java2021/6/2772deleteBean.java2021/6/2773ch7_7.jsp文件内容:2021/6/27747.4数据库操作案例7.4.2更新查询3.修改记录【例7.8】修改记录,页面如图效果如图所示:2021/6/2775创建存储过程的sql代码如下:usebooklibdelimiter$$createprocedureupdate_book_p(inp_bidchar(20),inp_namechar(20),inp_authorchar(10),inp_publishvarchar(50),inp_pricefloat)readssqldatabeginupdatebooksetname=p_name,author=p_author,publish=p_publish,price=p_pricewherebid=p_bid;end$$delimiter;2021/6/27767.4数据库操作案例2021/6/2777showBean.java2021/6/2778三个页面代码:2021/6/2779第三个页面上的Javabean代码:2021/6/27807.4数据库操作案例7.4.3分页查询分页显示程序中可以使用CachedRowSetImpl类,CachedRowSetImpl对象可以保存ResultSet对象中的数据,它不依赖与Connection对象,并且继承了ResultSet的所有方法。CachedRowSetImpl类在com.sun.rowset包中。使用CachedRowSetImpl对象的代码如下:2021/6/27817.4数据库操作案例7.4.3分页查询importcom.sun.rowse.*;……ResultSetrs=stmt.executeQuery("select*frombook");CachedRowSetImplrowSet=newCachedRowSetImpl();rowSet.populate(rs);while(rowSet.next()){……rowSet.getString(1);}2021/6/27827.4数据库操作案例7.4.3分页查询【例7.9】数据库记录的分页显示2021
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版无人驾驶汽车测试协议
- 二零二四年度LED路灯购销合同协议书3篇
- 二零二五年度餐饮行业营销推广服务合同3篇
- 2024版履约担保公司履约担保管理系统
- 2025年生态小区绿化水资源利用承包合同3篇
- 建筑碗扣支架出租合同(2025版)3篇
- 2024路演合同范本:路演活动应急预案合同3篇
- 二零二五年度环保科技水处理技术与应用合同3篇
- 二零二五版防盗门品牌加盟与区域经营合同3篇
- 2025年度旅游度假村麻石景观设计与施工合同4篇
- 《庖丁解牛》获奖课件(省级公开课一等奖)-完美版PPT
- 化工园区危险品运输车辆停车场建设标准
- 6月大学英语四级真题(CET4)及答案解析
- 气排球竞赛规则
- 电梯维修保养报价书模板
- 危险化学品目录2023
- FZ/T 81024-2022机织披风
- GB/T 33141-2016镁锂合金铸锭
- JJF 1069-2012 法定计量检定机构考核规范(培训讲稿)
- 综合管廊工程施工技术概述课件
- 公积金提取单身声明
评论
0/150
提交评论