1、第6章 JDBC数据库访问技术 本章主要内容 MS SQL Server 2000的安装 JDBC驱动程序的类型及安装方法 常用的JDBC API接口和类 使用JDBC进行增、删、改、查的基本方法 预编译SQL语句和存储过程的调用 JDBC事务处理 连接池与数据源 数据库与Excel报表的动态生成 6.1 MS SQL Server 2000的安装 6.1.1 MS SQL Server 2000概述概述SQL Server 2000 是 Microsoft 公司于 2000 年 10 月推出的一个关系型数据库管理系统,有以下几个版本:SQL Server 2000 企业版(Enterpris
2、e Edition)SQL Server 2000 标准版(Standard Edition)SQL Server 2000 个人版(Personal Edition)SQL Server 2000开发人员版(Developer Edition)6.1.2 SQL Server 2000个人版的安装 在安装前,建议以Windows的administrator管理员身份登录操作系统,用其它Windows帐户登录可能因权限不足而导致无法连接数据库。在光驱中放入SQL Server 2000个人版的安装光盘,光盘一般会自动运行,如图6-1示。单击界面上的第一项【安装 SQL Server 2000组
3、件】。图6-1 SQL Server 2000个人版安装启动界面 图6-2 安装组件界面 在图6-2的安装组件界面中,单击选中第一项【安装数据库服务器】。在图6-3的欢迎对话框中,单击【下一步】按钮。在图6-4的计算机名对话框中,选择【本地计算机】,再单击【下一步】按钮。在图6-5的安装选择对话框中,选择【创建新的SQL Server实例或安装客户端工具】,再单击【下一步】按钮。图6-3 欢迎对话框 图6-4计算机名对话框 在图6-6的用户信息对话框中,姓名、公司取默认值,单击【下一步】按钮。图6-5 安装选择对话框 图6-6用户信息对话框 在图6-7的软件许可协议对话框中,单击【是】按钮。在
4、图6-8的安装定义对话框中,选择【服务器和客户端工具】,单击【下一步】按钮。图6-7 软件许可证协议 图6-8安装定义对话框 在图6-9的实例名对话框中,取【默认】项,单击【下一步】按钮。在图6-10的安装类型对话框中,取【典型】项,单击【下一步】按钮。图6-9 实例名对话框 图6-10 安装类型对话框 在图6-11的服务器帐户对话框中,取【对每个服务使用同一帐户。自动启动SQL Server服务】项,服务设置中取【使用本地系统帐户】项,单击【下一步】按钮。图6-11 服务帐户对话框 在图6-12的身份验证模式对话框中,选择【混合模式(Windows身份验证和SQL Server身份验证)】项
5、,添加sa登录密码选择【空密码(不推荐)】项,单击【下一步】按钮。最后出现复制文件对话框,单击【下一步】按钮开始复制文件,直到安装完成。图6-12 身份验证模式 安装安装SQL Server 2000的的补丁补丁在Windows XP 以上的操作系统中安装SQL Server 2000以后,数据库系统还不能正常工作,需要下载并安装SQL Server 2000 sp4以上的补丁。补丁可在微软公司的官方网站http:/ Server 2000数据数据库服务器库服务器使用Windows XP的菜单:【开始】【程序】【Microsoft SQL Server】【服务管理器】,在图6-13的服务管理器
6、窗口中,单击【开始/继续】按钮,并选择【当启动OS时自动启动服务】,最后关闭窗口。图6-13 服务管理器窗口 4、样例数据库样例数据库SQL Server 2000自带两个供学习SQL语句用的样例数据库,一个是Northwind数据库,另一个pubs数据库。Northwind数据库模仿罗斯文贸易公司的业务模型,罗斯文公司专门经营世界各地风味食品的进出口业务。pubs数据库用于模拟一个图书出版社的业务模型。6.2 JDBC概述概述 6.2.1 ODBC概述 ODBC是Microsoft公司推出的开放式数据库接口。应用系统通过SQL结构化查询语言访问数据管理系统(DBMS)。ODBC接口对不同的D
7、BMS提供半透明的存取,这样开发人员便能在虚拟数据库上展开工作,通过加载的驱动程序将逻辑结构映射到具体的DBMS。6.2.2 JDBC概述概述 JDBC(Java Database Connectivity)是Java环境中访问SQL数据库的一组API。它包括一些用Java语言编写的类和接口,能更方便地向任何关系型数据库发送SQL命令。JDBC提供给程序员的编程接口由两部分组成:一是面向应用程序的编程接口JDBC API,它是供应用程序员用;二是支持底层开发的驱动程序接口JDBC Driver API,它是供商业数据库厂商或专门的驱动程序生产厂商开发JDBC驱动程序用。当前流行的大多数数据库系
8、统都推出了自己的JDBC驱动程序。6.2.3 JDBC驱动程序的类型驱动程序的类型 JDBC驱动程序大致分为四种类型:1、JDBC Type-1 类型1的JDBC驱动程序是将JDBC API映射到另一种数据库的API上。JDBC-ODBC桥属于类型1的JDBC驱动程序。2、JDBC Type-2 这类JDBC驱动程序有一部分是用Java语言编写,另外一部分是用本地代码编写,一般也称之为JDBC Native API。3、JDBC Type-3 类型3的JDBC驱动程序也叫JDBC Network Bridge驱动程序,驱动程序是使用Java语言编写,具有跨平台特性。4、JDBC Type-4
9、类型4的JDBC驱动程序也是用纯Java语言编写,也具有跨平台特性,一般称之为Pure Java JDBC Driver。6.2.4 JDBC Type-4驱动程序的安装方法 将JDBC Type-4驱动程序sqljdbc.jar文件复制到C:tomcatcommonlib文件夹中,重启Tomcat后,JSP/Servlet中就可以使用此驱动程序。在Tomcat下安装其它数据库的JDBC Type-4驱动程序的基本方法也是将*.jar驱动程序文件复制到C:tomcatcommonlib文件夹中。6.3 JDBC API中关键的类和接口 6.3.1 java.sql包包 JDBC API的核心部
10、分在java.sql包中,这个包提供使用 Java 编程语言访问并处理存储在数据源中数据的 API。6.3.2 javax.sql包包javax.sql包提供了通过数据源访问数据库的API,这个包是java.sql 包的补充,它从 1.4 版本开始包含在 JDK 中,支持连接池和数据源技术,支持分布式事务处理。6.3.3 常用的常用的JDBC API类和接口类和接口1、java.sql.Driver接口接口这个接口的实现类是某种数据库的一个驱这个接口的实现类是某种数据库的一个驱动程序类,用于初始化驱动程序。动程序类,用于初始化驱动程序。本书所使用的本书所使用的MS SQL Server 200
11、0的的JDBC Type-4驱动程序的类名为:驱动程序的类名为:com.microsoft.sqlserver.jdbc.SQLServerDriver 要加载此驱动程序,代码类似于:要加载此驱动程序,代码类似于:Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);Type-1类型的类型的JDBC-ODBC的驱动程序的驱动程序名为:名为:sun.jdbc.odbc.JdbcOdbcDriverjava.sql.DriverManager类类DriverManager类的主要作用是管理注册类的主要作用是管理注册到到DriverM
12、anager中的中的JDBC驱动程序,驱动程序,并根据需要使用并根据需要使用JDBC驱动程序建立与数驱动程序建立与数据库服务器的网络连接。类中常用的方法据库服务器的网络连接。类中常用的方法有:有:(1)public static Connection getConnection(String url,String user,String password)throws SQLException 例如,取得SQL Server 2000连接的代码为:String url=jdbc:sqlserver:/127.0.0.1:1433;databaseName=pubs;String user=sa
13、;String pw=null;Connection con=DriverManager.getConnection(url,user,pw);如果要用Type-1类型的JDBC-ODBC驱动程序连接SQL Server 2000的pubs数据库,首先要在Windows的控制面板中建立一个名为“mypubs”的ODBC数据源,获得连接代码如下:Connection con=DriverManager.getConnection(jdbc:odbc:mypubs,);(2)public static Connection getConnection(String url)throws SQLEx
14、ception 对于SQL Server 2000,url连接串可写为:String url=jdbc:sqlserver:/127.0.0.1:1433;databaseName=pubs;user=sa;password=;Connection con=DriverManager.getConnection(url);3、java.sql.Connection接口接口一个一个Connection对象表示一个数据库连接,接口中对象表示一个数据库连接,接口中常用的方法有:常用的方法有:(1)Statement createStatement(int resultSetType,int resu
15、ltSetConcurrency)throws SQLException作用作用:创建一个创建一个 Statement 对象发送对象发送SQL 语句给语句给数据库服务器,两个形参指定数据库服务器,两个形参指定ResultSet 对象的对象的类型和并发性,含义如下:类型和并发性,含义如下:第一个形参第一个形参指明结果集游标的类型,通过游标来指明结果集游标的类型,通过游标来读取结果集中的记录。读取结果集中的记录。SQL Server 支持四种游支持四种游标类型:静态游标、动态游标、只进游标和键集标类型:静态游标、动态游标、只进游标和键集驱动游标。驱动游标。第二个形参指明结果集的并发性,并发控制是指
16、多名用户同时更新行时,用于保护数据库完整性的技术。不正确的并发可能导致脏读、幻读和不可重复读等问题。ResultSet中并发控制常用的取值主要有两个:一个是ResultSet.CONCUR_READ_ONLY,它是只读的,不允许通过游标进行更新,并且不对组成结果集的行锁定。第二个取值是ResultSet.CONCUR_UPDATABLE,它是乐观读写,不锁定行。(2)Statement createStatement()throws SQLException 作用:创建一个Statement对象来发送SQL语句给数据库服务器,默认参数:结果集的类型是ResultSet.TYPE_FORWARD
17、_ONLY,结果集的并发模式是ResultSet.CONCUR_READ_ONLY。(3)PreparedStatement prepareStatement(String sql,int resultSetType,int resultSetConcurrency,int resultSetHoldability)throws SQLException 作用:给一条带参数的SQL语句生成PreparedStatement对象(SQL语句预编译对象),中的第一个形参是带“?”号参数的预编译SQL语句,例如:select*from titles where price?(4)PreparedSt
18、atement prepareStatement(String sql)throws SQLException 作用:为一条带参数的SQL语句生成PreparedStatement对象(SQL语句预编译对象),第一个形参是带“?”号参数的SQL语句,默认参数:结果集的类型是ResultSet.TYPE_FORWARD_ONLY,结果集的并发模式是ResultSet.CONCUR_READ_ONLY。(5)CallableStatement prepareCall(String sql,int resultSetType,int resultSetConcurrency,int resultSe
19、tHoldability)throws SQLException 作用:为一条带有“?”号参数的存储过程调用命令创建预编译语句对象,第一个参数为待编译的SQL语句,第24个形参的含义同上。(6)CallableStatement prepareCall(String sql)throws SQLException 作用:为一条带参数的存储过程调用语句生成预编译对象,第一个形参是带“?”号参数的SQL语句,默认参数:结果集的类型是ResultSet.TYPE_FORWARD_ONLY,结果集的并发模式是ResultSet.CONCUR_READ_ONLY。(7)void setAutoCommi
20、t(boolean autoCommit)throws SQLException 作用:定义连接的JDBC事务提交模式,形参取值为true,表示连接处于自动事务提交模式,则连接将接收到的一条SQL语句当作一个独立的事务提交。形参取值为false,则表示连接处于JDBC手动事务提交模式,通过调用commit()手动提交事务或调用rollba(8)void commit()throws SQLException 作用:提交事务,这个方法只有在手动事务提交模式下才有效。(9)Savepoint setSavepoint()throws SQLException 作用:在当前语句处创建一个回滚点,并返
21、回一个Savepoit对象表示此回滚点。(10)void rollback(Savepoint savepoint)throws SQLException 作用:回滚事务到指定的回滚点处。(11)void rollback()throws SQLException 作用:回滚所有的事务。(12)void close()throws SQLException 作用:释放数据库连接。4、java.sql.Statement接口接口通过Statement对象向数据库服务器发送SQL语句,接口中常用的方法有:(1)public ResultSet executeQuery(String sql)thr
22、ows SQLException这个方法将一条select查询语句发送给数据库服务器,查询结果封装在ResultSet对象中,形参是以字符串表示的SQL语句。这个方法不执行update、delete、insert等更新操作语句。如:要从pubs数据库的titles表中查询出单价大于5美元的图书书名、单价,代码片段为:(2)public int executeUpdate(String sql)throws SQLException 这个方法主要执行delete、update和insert语句,也可以执行一些建库、建表语句,返回值是整数,表示语句影响的记录数。例如,给pubs数据库titles表
23、中单价在4美元以下的图书提价2美元,代码片段为:(3)public void setMaxRows(int max)throws SQLException 对于一条select语句的查询结果,此方法定义ResultSet对象最多存储max条记录,超过部分被丢弃。例如:String sql=select title,price from titles where price+4;st.setMaxRows(3);ResultSet rs=st.executeQuery(sql);(4)public void addBatch(String sql)throws SQLException 将多条i
24、nsert或update语句添加到Statement对象中,形成一个批处理,最后调用executeBatch()执行这个批处理。(5)public int executeBatch()throws SQLException 执行批处理中的各条insert、update语句,返回一个整型数组,一个数组分量表示一条SQL语句的影响行数。例如:5、java.sql.ResultSet接口接口用用Connection对象生成对象生成Statement对象时,对象时,可定义可定义ResultSet对象中的指针能够前后对象中的指针能够前后移动,并且也可以定义移动,并且也可以定义ResultSet对象中对象
25、中的数据可以被更改。的数据可以被更改。ResultSet中和记录指针移动相关的方法有:(1)public int getRow()throws SQLException 获得当前记录的记录号。(2)public boolean next()throws SQLException 将ResultSet对象中的记录指针移到下一条记录处,如果成功移动返回true,移动失败返回false。一般利用此方法来构造一个遍历结果集的循环(3)boolean previous()throws SQLException 将ResultSet对象中的记录指针移到当前记录的上一条记录处,如果成功移动返回true,移动
26、失败返回false。注意此时记录指针应该是可滚动的。(4)public boolean first()throws SQLException 将ResultSet对象中的记录指针移到第一条记录处,如果成功移动返回true,移动失败返回false。注意此时记录指针应该是可滚动的。(5)public boolean last()throws SQLException 将ResultSet对象中的记录指针移到最后一条记录处,如果成功移动返回true,移动失败返回false。注意此时记录指针应该是可滚动的。(6)public boolean absolute(int row)throws SQLExc
27、eption 将ResultSet对象中的记录指针移到第n条记录处,如果成功移动返回true,移动失败返回false。注意此时记录指针应该是可滚动的。在ResultSet对象中,读取当前记录各字段值的方法是getXXX()方法,常用的如下:(1)public String getString(String columnName)throws SQLException 读取当前记录中指定字段名的值,这个值以字符串形式返回。(2)public String getString(int columnIndex)throws SQLException 读取当前记录中指定索引号字段的值,返回值是字符串。
28、字段索引号从1开始编号,各字段的索引号以字段在select语句中的先后位置为准。类似于getString(),如果当前记录中的某个字段是整数,可以用getByte()、getShort()、getInt()、getLong()直接读取到整数值。如果当前记录某字段是浮点型的,可以用getFloat()、getDouble()读取。如果当前记录某字段是布尔型的,可以用getBoolean()读取。如果当前记录是日期型的,可以用getDate()、getTime()分别读取日期和时间。(3)public Object getObject(String columnName)throws SQLExc
29、eption 读取当前记录中指定字段名的值,返回一个Java对象。(4)public Blob getBlob(String colName)throws SQLException 读取当前记录中指定字段名的值,返回一个java.sql.Blob对象。Blob是一个大二进制对象,例如存储在数据库中的图片数据等。通过Blob接口中的getBinaryStream()方法可获得此二进制对象的输入流对象,通过setBinaryStream()方法可获得此二进制对象的输出流对象。(5)public Clob getClob(String colName)throws SQLException 读取结果
30、集当前记录中指定字段名的值,返回一个java.sql.Clob对象,Clob是一个大字符对象,例如存储在数据库的个人简历等,通过Clob接口中的getCharacterStream()方法可获得此对象的Reader输入流对象,通过setCharacterStream()可获得此对象的Writer输出流对象。例如:Clob memo=rs.getClob(1);Reader str=memo.getCharacterStream();要对ReusltSet对象中的数据进行更新操作,可用如下的方法:(1)public void deleteRow()throws SQLException 删除Re
31、sultSet对象中当前指针处的记录。(2)public void updateRow()throws SQLException 把ResultSet对象中当前记录的值回写至数据库中。(3)public void updateDouble(String columnName,double x)throws SQLException把当前记录中指定字段名的double型值更新为一个新的值x。相类似的方法还有:updateShort()、updateInt()、updateLong()、updateByte()、updateDate()、updateTime()、updateFloat()、upd
32、ateBoolean()、updateClob()、updateBlob()、updateString()等。6、com.microsoft.sqlserver.jdbc.SQLServerDataSource这个类是sqljdbc.jar驱动程序提供的、以数据源方式获得SQL Server 2000连接的一种方案,类中常用的方法有:(1)public SQLServerDataSource()构造函数,取得一个实例。(2)public void setUser(java.lang.String user)给出登录数据库服务器所用的用户名。(3)public void setPassword(
33、java.lang.String password)给出登录数据库服务器所用的口令。(4)public void setServerName(java.lang.String serverName)给出数据库服务器的名字或IP地址。(5)public void setPortNumber(int portNumber)给出数据库服务器的端口号,用整数表示,SQL Server默认的端口号为1433。(6)public void setDatabaseName(java.lang.String databaseName)给出待连接数据库的名字。(7)public java.sql.Connect
34、ion getConnection()试图取得一个数据库的网络连接。6.4 JDBC应用样例 6.4.1 查询与分页样例查询与分页样例 在分页显示查询结果时,关键是设计分页导航条,一般用超链接来实现,提供上一页、下一页的导航超链接。分页导航超链接中,一般把查询关键字和目标页码附在URL查询串中传递给目标程序处理。【例6-1】要求对pubs数据库的titles表按书名字段(title)进行模糊查询,用户在表单中输入查询关键字,关键字可以有多个,并默认用空格符分隔,查询结果每页最多显示5条记录,并提供上一页、下一页、首页、最后一页共计四种翻页导航超链接。操作步骤如下:第1步:新建JSP文件exam
35、604.jsp。在设计视图插入表单,表单中加入一个名为“key”的文本域供用户输入查询关键字,再加入一个提交按钮,表单提交给“exam605.jsp”。第2步:定义一个名为“DBConnection”的类获得数据库连接。第3步:写一个名为“QueryVO”的VO类封装查询到的结果集记录。第4步:写一个简单的JavaBean类,能够从输入的字符串中分离出多个查询关键字,构作出相应的SQL查询条件,并连接数据库实施查询,从查询结果集中读取指定页面所需要的记录,将一条记录用一个QueryVO类对象封装,最后存入ArrayList集合中返回给调用程序。第5步:新建名为exam605.jsp的文件 在设
36、计视图中,插入一个显示数据用的表格,显示查询的结果,表格参数:2行,4列,表格宽度400像素,边框粗细为0,单元格边距为0,单元格间距为1。表格标题栏的背景色为#FF9999,表格第1行标题栏4个单元格分别填写4个提示文字:记录号、书名、类型、单价。在表格的后部回车,将光标移至下一个空行处,输入分页导航条要用到的超链接文字“首页 上一页 下一页 最后一页”。第6步:制作分页导航超链接。在exam605.jsp页面中,切换到设计视图。用鼠标左键选中“首页”两个字,在属性面板的【链接】项中输入如下的代码:exam605.jsp?key=&pageNO=URL查询串中,key参数保存查询关键字,pa
37、geNO参数保存待显示的页号为第1页。用鼠标左键选中“上一页”三个字,在属性面板的【链接】项中输入如下的代码:exam605.jsp?key=&pageNO=用鼠标左键选中“下一页”三个字,在属性面板的【链接】项中输入如下的代码:exam605.jsp?key=&pageNO=下一页的页号保存在nextPage变量中,此处将此变量的值打印在超链接中。用鼠标左键选中“最后一页”三个字,在属性面板的【链接】项中输入如下的代码:exam605.jsp?key=&pageNO=最后一页的页号就是查询结果集的总页数,此处将此变量的值打印在超链接中。6.4.2 预编译SQL语句 对于要多次执行的SQL语句
38、,SQL Server 2000支持将其写成预编译SQL语句形式,而后直接多次调用。预编译SQL语句分为准备和执行两个过程,准备语句过程是通知SQL Server 2000服务器将预编译语句编译成执行计划,SQL语句只需编译一次,后续执行是直接调用编译得到的机器代码段,执行效率较高。在预编译语句中,具体数据值用“?”代替。在执行预编译语句前,要将具体数据值写入“?”处。在JDBC中,使用Connection类的prepareStatement()方法为一条预编译语句建立一个PreparedStatement预编译对象,此方法的传入参数为等待编译的SQL语句。SQL语句中可变动的数据值用“?”表
39、示,一般用法形如:Connection con=.;String sql=“insert into xxxTable values(?,?)”;PreparedStatement st=con.prepareStatement(sql);【例6-2】使用预编译语句技术给pubs数据库的titles表添加2条图书信息,操作步骤如下:第1步:建立exam606.jsp的页面,在间添加如下代码:6.4.3 存储过程的调用存储过程的调用 存储过程是用SQL语句和控制流语句等编写的一段程序代码,在创建时已被编译成机器代码并存储在数据库中供客户端调用。存储过程有以下优点:所生成的机器代码被永久存储在数据库
40、中,客户端调用时不需要重新编译,执行起来效率要高一些。存储过程的网络使用效率比等效的SQL 语句要高。调用存储过程的命令如下示:1、存储过程调用命令形式一、存储过程调用命令形式一如果存储过程无返回值,但允许有传入参数时,调用命令格式形如:call 过程名(?,?,.)2、存储过程调用命令形式二、存储过程调用命令形式二如果存储过程有返回值,调用命令格式形如:?=call 过程名(?,?,.)左边第一个“?”处的参数存储返回值。3、CallableStatement接口接口CallableStatement接口继承了PreparedStatement,PreparedStatement中常用的方法
41、也适用于CallableStatement接口,接口中常用的方法有:(1)public void setString(int n,String x)throws SQLException 将一个字符串类型的数据值x写入存储过程调用命令的第n个“?”号处,代替“?”,n为预编译语句中“?”的序号,第一个“?”的序号为1。(2)public ResultSet executeQuery()throws SQLException 执行一个会返回ResultSet结果集的存储过程。(3)public boolean execute()throws SQLException 通用的存储过程执行方法。(4
42、)public void registerOutParameter(int n,int sqlType)throws SQLException将存储过程调用命令call 中第n个位置处的“?”参数注册声明为输出(OUT)参数,并定义返回数据的类型。返回数据类型SqlType可以用java.sql.Types类中的符号常量表达。(5)public int getInt(int n)throws SQLException 读取存储过程调用命令中“?”位置处的一个整数返回值,n为“?”号在存储过程调用命令中的序号。【例6-3】调用一个能够返回一个ResulSet结果集的存储过程,对titles表的书
43、名字段进行模糊查询,返回书名、类型、单价数据。操作步骤如下:第1步:在pubs中创建一个名为exam4的存储过程完成查询。use pubs go create proc exam4 key varchar(50)as begin select title,type,price from titles where title like key end 第2步:新建一个名为exam608.jsp的页面,在此JSP网页中调用此存储过程。6.4.4 添加新记录 通过JSP向数据库中添加记录的基本方法是:提供一个表单页供用户输入记录数据,提交表单后,后台JSP程序从表单中读取数据,构作SQL语句,或调用
44、预编译语句,将数据添加到数据库中。【例6-4】调用一个存储过程,给titles表添加一条新记录,新记录中至少包含书号、书名、类型、单价、出版日期五个数据。用存储过程实现。操作步骤如下:第1步:在pubs中创建一个名为newRecord的存储过程,输入以下代码:use pubs go create proc newRecord title_id varchar(50),title varchar(100),type varchar(30),price money,pubdate datetime as begin insert into titles(title_id,title,type,pr
45、ice,pubdate)values(title_id,title,type,price,pubdate)end 第2步:建立一个名为exam609.jsp的JSP表单页面供用户输入图书信息。第3步:定义exam610.jsp读取表单中的数据并写入数据库中。6.4.5 删除记录 通过JSP页面删除一条记录的基本方法是:获得待删除记录的主键值,根据主键值构作一条delete语句或调用存储过程等删除表中指定主键值的记录。【例6-5】写一个应用删除pubs数据库authors作者表中的记录。首先模仿前述样例,设计一个查询应用,列表显示表中的作者信息,每一条记录增加一个删除超链接供用户删除记录。操作步
46、骤如下:第1步:新建一个名为exam611.jsp,在设计视图中,插入一个2行4列500像素宽的数据表格,显示authors作者表中的作者编号(au_id)、名字(au_lname)、电话(phone),最后增加一个删除超链接,将作者号传给exam612.jsp删除。第2步:制作删除页 6.4.6 修改记录 通过JSP修改记录值的基本思想是:设计一个查询应用,供用户查询并列表显示待修改的记录,单击选中一条待修改的记录后,超链接将记录的主键值传入修改应用,修改应用从数据库中读取指定主键值的记录显示在表单中供用户修改,表单提交后程序从表单中读出数据构作SQL语句,将新的记录值更新至数据库中。【例6
47、-6】设计一个可修改作者表中作者名字、电话的应用。不妨在例6-5的基础上修改程序。操作步骤如下:第1步:制作记录浏览页。第2步:新建一个名为exam614.jsp的页面,把从数据库读取到的记录,显示在文本域中供用户修改。第3步:制作记录更新页,将用户修改的信息更新到数据库中。6.4.7 JDBC事务处理 1、事务事务事务是作为单个逻辑工作单元执行的一系列操作。事务是作为单个逻辑工作单元执行的一系列操作。事务维护了数据的事务维护了数据的完整性、正确语义、持久性完整性、正确语义、持久性。事务中的所有事务中的所有SQL语句必须被成功执行,则事务语句必须被成功执行,则事务才会对数据库产生持久性的影响,
48、如果事务中的才会对数据库产生持久性的影响,如果事务中的第第n条语句执行出错,表示事务运行失败,则前条语句执行出错,表示事务运行失败,则前面的面的n-1条语句对数据库产生的影响可以撤销条语句对数据库产生的影响可以撤销(回回滚滚)到事务执行前的初始状态或出错点之前的某到事务执行前的初始状态或出错点之前的某个正确状态。个正确状态。2、JDBC事务处理的程序结构事务处理的程序结构 JDBC在默认情况下,使用事务自动提交模式,它将接收到的每一条SQL操作当作一个事务提交给数据库服务器处理。如果要启动手动事务模式,程序的基本结构如下:3、JDBC事务回滚方式事务回滚方式JDBC事务回滚主要有两种方式:事务
49、回滚主要有两种方式:(1)一种是回滚所有事务,恢复到事务的初始状一种是回滚所有事务,恢复到事务的初始状态,直接调用态,直接调用Connection中的中的rollback()方方法实现。法实现。(2)另一种是回滚部分事务,要事先要定义保存另一种是回滚部分事务,要事先要定义保存点,发生异常时回滚到指定的保存点处。定点,发生异常时回滚到指定的保存点处。定义保存点的方法如下:义保存点的方法如下:Savepoint save3=con.setSavepoint();【例6-7】用JDBC的手动事务处理给pubs数据库的authors作者表添加两条新记录,第一条记录的信息是正确的,第二条记录的作者编号是
50、错误的,分别用回滚全部事务和回滚部分事务处理异常。操作步骤如下:(1)回滚全部事务。新建一个名为exam616.jsp的 JSP页面,找到标记,输入如下示的代码:(2)回滚部分事务。新建一个名为exam617.jsp 的JSP页面,找到标记,输入如下示的代码:6.4.8 数据库与Excel报表的动态生成 读取数据库的数据动态生成Excel报表,这是JSP应用中常遇到的问题,本节采用的基本方法是:在Excel工作薄中,将报表模板制作在第一张工作表中,从数据库中读取数据,利用POI组件复制模板工作表而得到一张新的工作表,将查询数据填写到新的工作表中。【例6-8】写一个Servlet程序,查询pub