《JSP中使用数据库.ppt》由会员分享,可在线阅读,更多相关《JSP中使用数据库.ppt(93页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、清华大学出版社理解JDBC应用程序编程接口;掌握使用纯Java驱动程序操作数据库的编程方法;掌握对数据的增加、删除、修改和查询编程技术;查询记录的分页面显示;数据库连接池编程技术。7.1 JDBC概述概述7.2 JDBC应用程序接口简介应用程序接口简介7.3 利用利用JDBC访问数据库访问数据库7.4 数据库操作案例数据库操作案例7.5 上机实训上机实训7.6 本本 章章 习习 题题7.1.1 什么是JDBCJDBC是Java数据库连接(Java Data Base Connectivity)技术的简称,指Java同许多数据库之间连接的一种标准。JDBC为数据库应用开发人员、数据库前台工具开发
2、人员提供了一种标准的JavaAPI,使开发人员可以用纯Java语言编写完整的数据库应用程序。简单地说,JDBC能够完成下列三件事:与一个数据库建立连接(connection)。向数据库发送SQL语句(statement)。处理数据库返回的结果(resultset)。7.1.2 JDBC的构的构成成1.JDBC API:定义了标准接口,无论编写Mysql还是Oracle等数据库程序,这些接口是一致的。2.JDBC数据库驱动程序7.2.1 DrvierManager类提供管理一组JDBC驱动程序所需要的基本服务,可以跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。该类的常用方法有:ge
3、tConnection和forName方法。public static Connection getConnection(String url,String user,String password)public static Class forName(String className)DrvierManager类的使用法:(1)加载驱动)加载驱动例如:Class.forName(com.mysql.jdbc.Driver);(2)与数据库建立连接)与数据库建立连接DriverManager.getConnection(String url,String user,String passwo
4、rd);对getConnection函数中的参数解释:url参数的命名方法:url由3部分组成,各部分间用冒号分隔,如下所示:jdbc:其中:jdbc协议名称。在JDBC URL中的协议总是jdbc。驱动程序名或数据库连接机制的名称。如“odbc”,它是用于指定ODBC风格的数据库资源名称的URL而保留的。一种标识数据库的方法。子名称可以依不同的子协议而变化。它还可以有子名称的子名称(含有驱动程序编程人员所选的任何内部语法)。使用子名称的目的是为定位数据库提供足够的信息。7.2.2 Connection接口Connection接口是java.sql包中最重要的接口。Connection对象代表
5、与数据库的连接。一个应用程序可与单个数据库有一个或多个连接,或者可与许多数据库有连接。数据库连接一旦建立,就可用来向它所涉及的数据库发送SQL语句。Connection的作用是创建向数据库发送SQL语句的三个接口。这三个接口分别是:Statement接口PreparedStatement接口CallableStatement接口。7.2.2 Connection接口Connection接口提供了多个同名但是参数不同的方法创建以上的三个接口。例如:public Statement createStatement();public Statement createStatement(int res
6、ultSetType,int resultSetConcurrency);其中:参数resultSetType指返回记录集的类型resultSetConcurrency指发送的SQL语句的权限7.2.2 Connection接口常用的一些方法:boolean isClosed():用于判断Connection对象是否已经被关闭;void commit():用于提交SQL语句,确认从上一次提交以来所进行的修改;void close():断开连接,释放资源;void rollback():取消SQL语句,取消当前事务中进行的修改。DatabaseMetaData getMetaData():获取一
7、个DatabaseMetaData对象。7.2.3 Statement接口Statement接口对象创建完毕后,主要使用以下方法:public ResultSet executeQuery(String sql):用于执行产生单个结果集的语句,如select。public int executeUpdate(String sql):用于执行insert、update或delete语句以及SQL DLL(数据定义)语句。当执行insert、update或delete语句时将返回一个整数,用于表示受影响的行数,返回结果为0时表示操作失败;当执行SQL DLL语句,如create table时,由于
8、它不操作行,返回值将总为0。7.2.3 Statement接口public boolean execute(String sql):用于执行返回多个结果集、多个更新计数或二者结合的SQL语句。public int executeBatch():用于执行几个SQL语句。Statement接口使用addBatch(String sql)方法将几个SQL语句添加到一个语句块中,然后一同提交给数据库服务器,同时执行。当执行多个SQL insert语句时效率将很高,因为一次提交比多次提交要节省很多系统资源。void close():释放Satement对象的数据库和JDBC资源。7.2.3 Statem
9、ent接口PreparedStatement接口对象主要使用以下方法:public ResultSet executeQuery(String sql):使用Select命名对数据库进行查询。public int executeUpdate(String sql):用于执行insert、update或delete语句对数据库进行新增、删除和修改操作。void setXXX(int parameterIndex,XXX x):设定XXX数据类型值给PreparedStatement 类对象的IN参数。7.2.3 Statement接口CallableStatement接口主要用于执行存储过程,其
10、主要方法同Statement。存储过程有两种参数,IN参数和OUT参数。CallableStatement接口继承了PerpareedStatement接口的setXXX方法对IN参数赋值。在CallableStatement接口中使用OUT参数,要做两件事情,一是对OUT参数进行类型注册,二是获取OUT参数的值。CallableStatement提供了多种方法进行类型注册,下面是常用的两种:registerOutParameter(String parameterStringName,int sqlType);registerOutParameter(String parameterStri
11、ngName,int sqlType,int scale);7.2.4 数据结果集ResultSet接口ResultSet接口用于获取执行SQL语句(或数据库存储过程)返回的结果。它的实例对象是符合SQL语句条件的所有行。常用的方法有:public boolean next():用于数据库游标移动到结果集的下一行,使之成为当前行。如果当前行为最后一行,返回值为false;否则,返回true。在定位到结果集中的某行后,就可以读取数据。对于不同数据类型,要使用不同的读取方法getXXX()。JDBC提供了两种形式:7.2.4 数据结果集ResultSet接口public XXX getXXX(St
12、ring columnName):XXX代表任意的数据类型,参数columnName代表列名。public XXX getXXX(int columnIndex):XXX代表任意的数据类型,参数columnIndex代表列号。ResultSetMetaData getMetaData():获取结果集的列编号、类型和属性下面是ResultSet接口的示例:private Statement stmt=null;private ResultSet rs=null;private PreparedStatement prpSql=null;);Connection conn=:端口号/数据库名称,用
13、户名,密码);stmt=conn.createStatement();rs=stmt.executeUpdate(select*from database);while(rs.next()rs.getString(1);rs.close();stmt.close();conn.close();7.2.5 数据库元数据数据库元数据-DatabaseMetaData和和ResultSetMetaDataDatabaseMetaData接口可以从数据库管理系统中获得数据库的信息,例如数据库所有的表名、存储过程名等信息。这个类提供了许多方法来取得这些信息,常用的方法如下:String getDatab
14、aseProductName():获得数据库的名称。ResultSet getCooumns(String databasename,String dboname,String tablename,String columnname):获得表字段信息,以列的方式存储在一个ResultSet对象中。7.2.5 数据库元数据数据库元数据-DatabaseMetaData和和ResultSetMetaDataResultSetMetaData接口用来获取数据库表的结构。通过它提供的一些常用方法,可以获得ResultSet对象中的类型和属性信息的对象。常用方法如下:int getColumnType(
15、int column):检索指定列的SQL类型;String getTableName(int column):获取指定列的名称;所有的利用JDBC访问数据库的程序都具有以下的流程:加载JDBC驱动程序建立和数据库的连接执行SQL语句存放处理结果与数据库断开连接7.3.1 通过通过JDBC-ODBC桥连接来访问数据桥连接来访问数据库库 可以使JDBC有能力访问几乎所有类型的数据库。下面通过一个例子介绍:1、首先建立一个access数据库,数据库名称为:book,保存数据库文件。7.3.1 通过通过JDBC-ODBC桥连接来访问数据桥连接来访问数据库库2、配置数据源、配置数据源首先要配置ODBC
16、数据源。选择数据源(ODBC)(Win 2000在管理工具中;Win XP在控制面板中)先看图片,在现场演示。先看图片,在现场演示。在管理工具中,选择“数据源”在对话框中选择用户dsn,添加在对话框中选择access driver(*。Mdb)单击“完成”。在数据源名称输入“book”。选择数据库为book。选择图书管理数据库.mdb权限默认,在登录用户名输入对应的用户名和密码。7.3.1 通过通过JDBC-ODBC桥连接来访问数据桥连接来访问数据库库3 编写相应的程序编写相应的程序(1)加载数据库的驱动程序(2)建立连接(3)向数据库发送SQL语句(4)处理查询结果(5)关闭数据库连接7.3
17、.1 通过通过JDBC-ODBC桥连接来访问数据桥连接来访问数据库库【例7.1】利用JDBC-ODBC桥连接数据库,执行SQL语句,并在数据库中插入一条记录。ch7_1.jsp文件内容如下:0)out.println(添加成功);else out.println(添加失败);rs=stmt.executeQuery(select*from book);out.print();out.print();out.print(+书号);out.print(+书名);out.print(+作者);out.print(+出版社);out.print(+单价);out.print();while(rs.ne
18、xt()out.print();out.print(+rs.getString(1)+);out.print(+rs.getString(2)+);out.print(+rs.getString(3)+);out.print(+rs.getString(publish)+);out.print(+rs.getFloat(price)+);out.print();out.print();stmt.close();/关闭数据库 conn.close();catch(Exception e)out.println(e.toString();%7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连
19、接数驱动程序连接数据库据库1.安装安装mysql数据库数据库从网上下载,将mysql安装到了E:mysql目录中。2.启动启动mysqlcd e:mysqlbinmysqld-nt7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数驱动程序连接数据库据库7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数据驱动程序连接数据库库3.启动启动mysql监视器监视器用户再启动一个MS-DOS窗口,切换到E:MYSQLBIN目录中,执行如下命令:e:cd mysql cd bin mysql-u root7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数驱动程序连接数据
20、库据库7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数驱动程序连接数据库据库4.创建数据库创建数据库启动mysql监视器后,可以在提示符下输入sql语句来创建数据库和表,sql语句结束必须使用“;”符号。在编辑sql语句的过程中可以使用/c终止当前sql语句的编辑。在mysql监视器提示符下,输入创建图书管理数据库booklib的SQL语句并执行,7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数驱动程序连接数据库据库7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数据库驱动程序连接数据库5.创建数据库中的表创建数据库中的表在booklib数据库中创建bo
21、ok表的SQL语句为:CREATE TABLE book(bid char(20)NOT NULL,name char(20)default NULL,author char(10)default NULL,publish varchar(50)default NULL,price float default NULL,PRIMARY KEY (bid)ENGINE=InnoDB DEFAULT CHARSET=utf8;7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数驱动程序连接数据库据库5.创建数据库中的表创建数据库中的表7.3.2 利用本地协议纯利用本地协议纯Java驱动程
22、序连接数据库驱动程序连接数据库6.编写相应的程序编写相应的程序-连接连接mysql数据库数据库try);try/和数据库建立连接 conn=DriverManager.getConnection(jdbc:mysql:/localhost:3306/booklib,root,);conn.close();catch(Exception e)out.println(e.toString();7.3.2 利用本地协议纯利用本地协议纯Java驱动程序连接数驱动程序连接数据库据库【例7.2】利用纯Java驱动程序连接mysql数据库,查询book表中的所有记录连接不同的数据库,除Class.forNa
23、me()中的驱动程序类及url的书写方式不同之外,其他所有部分均相同。7.3.3 配置和连接不同的数据库配置和连接不同的数据库1.连接连接Oracle数据库数据库安装完Oracle后,找到文件classes12.zip(可以在Oracle安装目录搜索得到),将该文件复制到Java JDK的子目录/jre/lib/ext目录中,并其更名为classes.jre或cleasses.jar。);DriverManager.getConnection(jdbc:oracle:thinhost:端口号:数据库名,用户名,密码);7.3.3 配置和连接不同的数据库配置和连接不同的数据库2.连接连接Sql
24、Server数据库数据库下载驱动安装文件。找到sqljdbc.jar文件,将其复制到Tomcat所使用的JDK的jrelibext目录中。连接方法:);DriverManager.getConnection(jdbc:sqlserver:/172.0.0.1:1443;DatabaseName=数据库名,“用户名”,“密码”);提示:如果应用程序和要连接的Sql Server2000服务器在不同的计算机上,可以使用Sql Server 2000服务器的ip地址,例如。如果应用程序无法和Sql Server2000连接,可能需要更新Sql Server 2000服务器。用户可以从微软网站下载补丁
25、sqlsp4.rar,安装该补丁即可。7.4.1 查询数据查询数据1.顺序查询数据顺序查询数据ResultSet rs=stmt.executeQuery(select bid,name,author,publish,price from book);对于结果集rs的列数为5列,第一列对用bid,第二列对应name,第三列对应author,第四列对应publish,第五列对应price;而每一次rs只能看到一行,要在看到下一行,必须使用next()方法移动当前行。ResultSet对象使用getXXX()方法获得当前行字段的值。下面是一个实例:QueryBean.java代码ch7_3.jsp
26、文件内容:2.随机查询随机查询如果需要在结果集中前后移动或随机显示某一条记录,这时就必须得到一个可以滚动的结果集。得到滚动结果集的方法如下:Statement stmt=conn.createStatement(int type,int concurrency);ResultSet rs=stmt.executeQuery(sqlstr);其中type的取值决定结果集的滚动方式,可以取下列值:2.随机查询随机查询ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下移动。ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库
27、的数据变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE:结果集的游标可以上下移动,当数据库的数据变化时,当前结果集同步变化。2.随机查询随机查询滚动结果集ResultSet对象可以使用的方法如下:public boolean previous():将游标向上移动,当移动到结果集第一行之前返回false。public void beforeFirst():将游标移到结果集第一行之前。public void afterLast():将游标移到结果集最后一行之后。public void first():将游标移到结果集的第一行。public void last(
28、):将游标移到结果集的最后一行。public boolean isAfterLast():判断游标是否在结果集的最后一行之后。2.随机查询随机查询滚动结果集ResultSet对象可以使用的方法如下:public boolean isBeforeFirst():判断游标是否在结果集第一行之前。public boolean isFirst():判断游标是否在结果集第一行。public boolean isLast():判断游标是否在结果集的最后一行。public int getRow():得到当前游标所在的行,行号从1开始,如果结果集没有行,则返回0。public boolean absolute
29、(int row):将游标移到到row所指定的行,row取负值则倒数,如-1,则移动到最后一行。2.随机查询随机查询【例7.4】随机查询示例。RandomQuerybean.javach7_3.jsp文件内容:3.条件查询条件查询在顺序查询和随机查询中得到的是表中的全部记录。如果要得到表中满足条件的记录,就要采用条件查询。条件查询是由客户端提供查询条件,即查询的参数,再由这些参数构造SQL语句,执行该语句并得到筛选结果的查询。下面的例子根据用户选择的字段和输入的关键字查询图书信息,如果没有输入关键字则显示所有图书的信息。3.条件查询条件查询【例7.5】条件查询图书信息keyQueryBean.
30、javach7_5.jsp文件内容:7.4.2 更新查询更新查询Statement对象提供了int executeUpdate(String sqlStatement)方法,用于实现对数据库中数据的添加、删除和更新操作。sqlStatement参数是由insert、delete和update等关键字构成的Sql语句。函数返回值为查询所影响的行数,失败返回0。例如添加记录的sql语句:String sqlStatement=insert book values(tp1004,高数,杨,清华出版社,35);7.4.2 更新查询更新查询stmt.executeUpdate(sqlStatement)
31、;例如更新记录的sql语句:String sqlStatement=update book set name=新值 where bid=tp1001;stmt.executeUpdate(sqlStatement);例如删除记录的sql语句:String sqlStatement=delete from book where bid=tp1001;stmt.executeUpdate(sqlStatement);7.4.2 更新更新查询查询1、添加记、添加记录录【例7.6】向mysql数据库中的表追加记录addBean.javach7_6.jsp文件内容:7.4.2 更新更新查询查询2、删除记
32、、删除记录录【例7.7】删除book表中的记录。listBean.javadeleteBean.javach7_7.jsp文件内容:7.4.2 更新更新查询查询3.修改记录修改记录【例7.8】修改记录,页面如图效果如图所示:use booklibdelimiter$create procedure update_book_p(in p_bid char(20),in p_name char(20),in p_author char(10),in p_publish varchar(50),in p_price float)reads sql databegin update book set
33、name=p_name,author=p_author,publish=p_publish,price=p_price where bid=p_bid;end$delimiter;showBean.java三个页面代码:第三个页面上的Javabean代码:7.4.3 分页查询分页查询分页显示程序中可以使用CachedRowSetImpl类,CachedRowSetImpl对象可以保存ResultSet对象中的数据,它不依赖与Connection对象,并且继承了ResultSet的所有方法。CachedRowSetImpl类在包中。使用CachedRowSetImpl对象的代码如下:7.4.3
34、分页查询分页查询import.*;ResultSet rs=stmt.executeQuery(select*from book);CachedRowSetImpl rowSet=new CachedRowSetImpl();rowSet.populate(rs);while(rowSet.next()rowSet.getString(1);7.4.3 分页查询分页查询【例7.9】数据库记录的分页显示showbypageBean.javach7_3.jsp文件内容:7.4.4 使用连接池使用连接池所谓数据库连接池就是为数据库连接建立一个“存储池”。类似“蓄水池”。1.在在tomcat6.0上配
35、置连接池上配置连接池用任意一种文本编辑器打开tomcat6.0安装目录下conf子目录中的server.xml文件,在文档内容中的之前加入如下配置:7.4.4 使用连接池使用连接池7.4.4 使用连接池使用连接池name项是JNDI的名称定义,程序通过JNDI才能找到此对象,这里取名为“jdbc/dataBook”;auth项即连接池管理权限,这里取值为Container,声明为容器管理,此连接池为容器管理池,对应ch7服务目录。type项即对象类型,这里取值为,声明为数据库连接池。driverClassName项为数据库驱动程序。url项为数据库连接地址。username为连接用户名。pas
36、sword为连接用户密码。maxActive为最大连接数,maxIdle为最小连接数。7.4.4 使用连接池示例使用连接池示例【例7.10】使用连接池操作数据库。ch7_10.jsp文件内容:实训目的实训目的理解JDBC编程接口。掌握利用JDBC访问数据库的方法。掌握对表中数据的增、删、改、查编程技术。掌握连接池的使用技术。掌握查询结果的分页显示技术。实训内容实训内容实训实训1 编写一个简单的图书管理系统。要求:(1)建立一个图书管理数据库booklib,库中有一个book表。(2)完成一个管理系统主界面,主界面功能包括添加图书、修改图书、删除图书和查询图书等功能的链接。(3)参照本章示例,完成图书管理系统各链接的功能。思考题思考题(1)什么是JDBC编程接口?(2)什么是数据库连接池?(3)使用纯Java驱动操作mysql数据库的步骤?(3)加载Sql Server 2000纯Java驱动程序的代码是什么?(4)使用预处理语句和存储过程有什么好处?(5)使用CachedRowSetImpl类有什么好处?(6)如何使用滚动的结果集?