配合< JSP程序设计>例子源代码一起使用 普通高等教育“十一五”国家级规划教材 <JSP程序设计>第6章 JSP 中使用数据库 Power point 制作:耿祥义 张跃平 配合< JSP程序设计>例子源代码一起使用
第6章导读 主要内容 难点 关键实践 JDBC 连接数据库的常用方式 查询记录 更新记录 添加记录 删除记录 用结果集更新数据库 预处理 事务 常见数据库连接 查询Excel电子表格 难点 关键实践
第6章 在JSP中使用数据库 本章将学习在JSP技术中怎样使用数据库,为了更好的体现一个Web应用将数据的处理和显示相分离,除个别例子为了说明基本知识外,本章大部分例子采用JSP+Tag模式,即JSP页面调用Tag文件来完成对数据库的操作。
§6.1. SQL Server 2000数据库管理系统 本章选用SQLServer 2000数据库管理系统。 单击“开始”→“程序”→“Microsoft SQL Server” →“服务器管理器” 2 建立数据库 单击“开始”→“所有程序”→“Microsoft SQL Server” →“企业管理器”,新建立的数据库名称是“Warehouse” 3 创建表 打开“企业管理器”,用鼠标单击“数据库”下的Warehouse数据库,在Warehouse管理的“表”的选项上单击右键,选择“新建表”,将出现相应的建表界面,我们建立的表是product,该表的字段(属性)为: number(char),name(char),madeTime(datetime),price(float).其中 “number”字段为主键.
§6. 2. JDBC JDBC(Java DataBase Connectivity)是Java运行平台的核心类库中的一部分,提供了访问数据库的API,它由一些Java类和接口组成。 JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库 .我们经常使用JDBC进行如下操作: 与一个数据库建立连接。 向已连接的数据库发送SQL语句。 处理SQL语句返回的结果。
§6.3. 连接数据库的常用方式 1.一种常见方式是使用JDBC-ODBC桥接器: 2.另一种是加载Java数据库驱动程序
使用JDBC-ODBC桥接器方式的机制是,应用程序只需建立JDBC和ODBC之间的连接,而和数据库的连接由ODBC去完成。
使用JDBC-ODBC桥接器访问数据库的步骤: try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e){ out.print(e); 创建ODBC数据源 Windows控制面板_管理工具_ ODBC数据源 和ODBC数据源建立连接 Connection con= DriverManager.getConnection(“jdbc:odbc:数据源名字”,“登录名”,“密码”); 例6-1 P144
用Java语言编写的数据库驱动程序称作Java数据库驱动程序。 JDBC可以调用本地的Java数据库驱动程序和相应的数据库建立连接 。
使用纯Java驱动程序方式和数据库建立连接的两个步骤: 加载纯Java驱动程序(以连接SQL Server 2000为例) 连接SQL Server 2000用的纯Java驱动程序(从www.microsoft.com下载) sqljdbc_1.1.1501.101_enu.exe 安装后此文件后,在enu子目录中找到驱动文件sqljdbc.jar,将其复制到Tomcat所用的JDK的\jre\lib\ext文件夹中或Tomcat的安装目录\common\lib中。 和指定的数据库建立连接 try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch(Exception e){ out.print(e); 例6-2 P146
§6.4 查询记录 与数据库建立连接后,就可以使用JDBC提供的API和数据库交互信息,如查询、修改和更新数据库中的表等。对一个数据库中表进行查询操作的具体步骤: 创建SQL语句对象 try{ Statement sql=con.createStatement(); } catch(SQLException e ){ System.out.println(e); 处理查询结果 sql对象可以调用相应的方法实现对数据库中表的查询和修改,并将查询结果存放在一个ResultSet类声明的对象中。 ResultSet rs=sql.executeQuery(“SELECT * FROM 表名”); ResultSet对象使用next()方法一次看到一个数据行,用getXxx (索引或字段名)方法获取字段值。 注: P148 注意内容。
DatabaseMetaData metadata=con. getMetaData(); 6.4.1 顺序查询 如何知道一个表中有哪些字段? 1.与数据库建立的连接对象con调方法getMetaData返回一个DatabaseMetaData对象. DatabaseMetaData metadata=con. getMetaData(); 2. Metadata对象再调用getColumns()方法可以将表的字段信息以行列的形式存储在一个ResultSet对象中。 ResultSet tableMessage= metadata. getColumns(null,null, “employee“,null); 表的字段信息以行列的形式存储在tableMessage对象中. 该对象使用next()方法和getXxx (索引)方法查看该行中信息,第4列是字段名。 例6-3 P149 example6_3.jsp 提交 数据源和表名 inquire.jsp调用tag查询数据库 QueryTag.tag 查询数据库并返回结果
为了在结果集中可以前后移动,随机显示若干记录,必须要返回一个可滚动的结果集。 6.4.2 随机查询 为了在结果集中可以前后移动,随机显示若干记录,必须要返回一个可滚动的结果集。 Statement stmt=con. createStatement(int type,int concurrency); ResultSet re=stmt. executeQuery(SQL语句); int type,int concurrency取值情况及ResultSet常用方法见p151。 例6-4 P152
6.4.3 条件查询 在JSP页面中输入查询条件,Tag文件可以根据JSP提交的条件进行查询。 例6-5 P155
6.4.4 排序查询 可以在SQL语句中使用ORDER BY子语句,对记录排序。在JSP页面中输入排序方式, Tag文件可以根据JSP提交的数据进行排序查询。 例6-6 P158
在JSP页面中输入模糊查询条件,Tag文件可以根据JSP提交的条件进行模糊查询。 6.4.5 模糊查询 在JSP页面中输入模糊查询条件,Tag文件可以根据JSP提交的条件进行模糊查询。 在SQL语句中用like进行模式匹配,% 代替零个或多个字符,下划线代替一个字符等。 比如,下述语句查询产品名称中含有“机”的记录: rs=sql.executeQuery("SELECT * FROM product WHERE name LIKE '%机%'"); 下述语句查询产品名称中含有“电”或“手”的记录: rs=sql.executeQuery(“SELECT * FROM product WHERE name LIKE ‘%[电手]%’ ”); 例6-7 P160
§6.5 更新记录 可以使用SQL语句更新记录中字段的值。 Statement对象调用方法: 例如: 例6-8 P163 §6.5 更新记录 可以使用SQL语句更新记录中字段的值。 Statement对象调用方法: public int executeUpdate(String sqlStatement); 通过参数sqlStatement指定的方式实现对数据库表中记录的字段值更新。 例如: executeUpdate("UPDATE product SET price = 6866 WHERE name='海尔电视机'"); 例6-8 P163
§6.6 添加记录 可以使用SQL语句添加新的记录。 Statement对象调用方法: 例如: 例6-9 P164 §6.6 添加记录 可以使用SQL语句添加新的记录。 Statement对象调用方法: public int executeUpdate(String sqlStatement); 通过参数sqlStatement指定的方式实现向数据库表中添加新的记录。 例如: executeUpdate("INSERT INTO students VALUES ('012','神通手机’,'2010-2-26',2687)"); 例6-9 P164
§6.7 删除记录 可以使用SQL语句删除记录。 Statement对象调用方法: 删除数据库表中的记录。 例如: 例6-10 P167 §6.7 删除记录 可以使用SQL语句删除记录。 Statement对象调用方法: public int executeUpdate(String sqlStatement); 删除数据库表中的记录。 例如: executeUpdate("DELETE FROM product WHERE number = '888' "); 例6-10 P167
§6.8 用结果集操作数据库中的表 可以使用内存中ResultSet对象对底层数据库表进行更新和插入操作。前提是要事先返回结果集。 Connnection con= DriverManager.getConnection("jdbc:odbc:mystar","",""); Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs=sql.executeQuery("SELECT * FROM product"); 1。更新记录中的列值 结果集rs的游标移动到第n行 rs.absolute(n); 结果集将第n行的p列的列值更新 updateInt(String columnName, int x)更多方法见p168 更新数据库中的表 rs.absolute(3); rs.updateString("name", "IBM笔记本"); rs.updateRow(); 2。插入记录 结果集rs的游标移动到插入行 rs.moveToInsertRow(); 更新插入行的列值updateXXX() rs.updateString(2, "神通手机"); 插入记录 insertRow() 例6-11 P169
§6.9 预处理语句 例6-12, 6-13 P171 ResultSet executeQuery() 1。预处理语句优点 §6.9 预处理语句 1。预处理语句优点 对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么con就可以调用方法对参数sql指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象pre中 PreparedStatement pre=con.prepareStatement(String sql); 对象pre可以随时地执行下述方法,提高访问数据库的速度。 ResultSet executeQuery() boolean execute() int executeUpdate() 2。使用统配符 在对SQL进行预处理时可以使用统配符“?”来代替字段的值,只要在预处理语句执行之前再设置统配符所表示的具体值即可。例如: pre=con.prepareStatement("SELECT * FROM product WHERE price < ? "); pre.setDouble(1,6565);(设置统配符“?”的值) 的功能等同于 pre=con.prepareStatement("SELECT * FROM message WHERE price < 6565 "); 预处理语句设置统配符“?”的值的常用方法见p173. 例6-12, 6-13 P171
§6.10 事务 事务由一组SQL语句组成,所谓“事务处理”是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。 事务是保证数据库中数据完整性与一致性的重要机制。JDBC事务处理步骤如下: 1。setAutoCommit(boolean autoCommit)方法 为了能进行事务处理,必须关闭连接对象 con的默认设置。 con.setAutoCommit(false); 2. commit()方法 连接对象 con调用commit()方法就是让事务中的SQL语句全部生效。 con.commit(); 3. rollback()方法 连接对象 con调用rollback()方法,撤消事务中成功执行过的SQL语句对数据库数据所做的更新、插入或删除操作,即撤消引起数据发生变化的SQL语句操作,将数据库中的数据恢复到commi()方法执行之前的状态。 con. rollback(); 例6-4 P176
§6.11 常见数据库连接 6.11.1 连接Oracle数据库 下面介绍通过直接加载Oracle的Java数据库驱动程序来连接数据库的方法。 安装Oracle后,找到目录Oracle/ora81/jdbc中的classes.jar(classes12.zip),即用java编写Oracle数据库驱动程序。将classes.jar复制到Tomcat引擎所使用的JDK的扩展目录中。通过如下的两个步骤和一个Oracle数据库建立连接。 1.加载驱动程序 Class.forName("oracle.jdbc.driver.OracleDriver"); 2.建立连接 Connection con= DriverManager.getConnection( “jdbc:oracle:thin:@主机host:端口号:数据库名“, ”用户名“, ”密码“); 例6-15 P177
Access也是比较流行的一种数据库管理系统,操作简单、使用方便。一些规模不大的Web应用经常使用Access数据库数据库管理系统。 下面介绍使用JDBC-ODBC桥接器方式连接Access数据库。 1.建立JDBC-ODBC桥接器 try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e){ out.print(e); 2.创建ODBC数据源时选择的数据库驱动程序为:Microsoft Access Driver(*.mdb),设置的数据源的名字为redsun 3.和ODBC数据源建立连接 Connection con= DriverManager.getConnection(“jdbc:odbc: “数据源名字”,“登录名”,“密码”); 例6-16 P179
MySql是开源项目,但功能强大、不依赖于平台,受到广泛的关注。 下面介绍使用加载MySql的Java驱动程序来和MySql数据库建立连接。 解压mysql-connector-java-5.0.4.zip文件至硬盘,在解压目录下的mysql-connector-java-5.0.4-bin.jar文件就是连接MySql数据库的Java数据库驱动程序。将该驱动程序复制到Tomcat服务器所使用的JDK的扩展目录中,比如:D:\jdk1.6\jre\lib\ext,或复制到Tomcat服务器安装目录的\common\lib文件夹中。 1.加载驱动程序 try{ Class.forName("com.mysql.jdbc.Driver"); } catch(Exception e){} 2.和指定的数据库建立连接 try{ String uri= "jdbc:mysql://localhost/数据库名"; String user=“用户名"; String password=“密码"; con=DriverManager.getConnection(uri,user,password); catch(SQLException e){} 例6-17 P183
通过JDBC-ODBC桥接器访问Excel电子表格. 步骤: 1.设置数据源 2.选择表 为数据源选择的驱动程序是Microsoft Excel Driver。 2.选择表 必须在电子表格中选出一工作区作为连接时使用的表。在Excel电子表格中拖动鼠标选出范围,如上图6.34所示。然后在Excel菜单中选择“插入”→“名称”→“定义”,给选中的工作区命名(这一工作区的名称将作为连接时使用的表名)。 例6-18 P185