第4章 JDBC数据库访问技术 数据库是Web应用程序重要组成部分,在Java Web应用程序中,数据库访问是通过Java数据库连接(Java DataBase Connectivity,简称JDBC )实现的。JDBC为开发人员提供了一个标准的API。 本章介绍使用JDBC驱动程序连接数据库和使用连接池技术连接数据库并设计应用程序的方法、步骤和实例。
第4章 JDBC数据库访问技术 4.1 JDBC技术概述 4.2 JDBC访问数据库 4.3 综合案例——学生身体体质信息管理系统的开发 4.4 数据源与连接池技术 本章小结
4.1 JDBC技术概述 JDBC是一种用于执行SQL语句的Java API,由一组类与接口组成,通过调用这些类和接口所提供的方法,可以使用标准的SQL语言来存取数据库中的数据。 本节内容: 4.1.1 驱动程序接口Driver 4.1.2 驱动程序管理器DriverManager 4.1.3 数据库连接接口Connection 4.1.4 执行SQL语句接口Statement 4.1.5 执行动态SQL语句接口PreparedStatement 4.1.6 访问结果集接口ResultSet
java.sql.DriverManager 该类处理驱动程序的加载和建立新数据库连 接 类或接口 作用 java.sql.DriverManager 该类处理驱动程序的加载和建立新数据库连 接 java.sql.Connection 该接口实现对特定数据库的连接 java.sql.Satement 该接口表示用于执行静态SQL语句并返回它 所生成结果的对象 java.sql.PreparedStatemen t 该接口表示预编译的SQL语句的对象,派生 自Satement,预编译SQL效率高且支持参数 查询 java.sql.CallableStatement 该接口表示用于执行SQL语句存储过程的对 象。派生自PreparedStatement,用于调用数 据库中的存储过程 java.sql.ResultSet 该接口表示数据库结果集的数据表,统称通 过执行查询数据库的语句生成
4.1.1 驱动程序接口Driver 每种数据库都提供了数据库驱动程序,并且都提供了一个实现java.sql.Driver接口的类,简称Driver类。 在应用程序开发中,需要通过java.lang.Class类的静态方法forName(String className),加载该Driver类。在加载时,创建自己的实例并向java.sql.DriverManager类注册该实例。
4.1.2 驱动程序管理器DriverManager java.sql.DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,作用于用户和驱动程序之间,负责跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接。 DriverManager类即可用来建立数据库连接。 DriverManager类提供的最常用的方法是: Connection getConnection(String url,String user,String password) 该方法为静态方法,用来获得数据库连接,有3个入口参数,依次为要连接数据库的URL、用户名和密码,返回值类型为java.sql.Connection
4.1.3 数据库连接接口Connection java.sql.Connection接口负责与特定数据库的连接,形成连接对象。由该对象完成相关的操作。 表4-2 Connection接口的常用方法 方法名称 功能描述 createStatement() 创建并返回一个Statement实例,通常在执行无参 数的SQL语句时创建该实例 prepareStatement() 创建并返回一个PreparedStatement实例,通常在 执行包含参数的SQL语句时创建该实例,并对SQL 语句进行了预编译处理 close() 立即释放Connection实例占用的数据库和JDBC资 源,即关闭数据库连接
4.1.4 执行SQL语句接口Statement java.sql.Statement接口用来执行静态的SQL语句,并返回执行结果。Statement接口提供的常用方法。 方法名称 功能描述 executeQuery(String sql) 执行指定的静态SELECT语句,并返回 一个永远不能为null的ResultSet实例 executeUpdate(String sql) 执行指定的静态INSERT、UPDATE或 DELETE语句,并返回一个int型数值, 为同步更新记录的条数 close() 立即释放Statement实例占用的数据库 和JDBC资源,即关闭Statement实例
4.1.5 执行动态SQL语句接口 ——PreparedStatement java.sql.PreparedStatement接口继承于Statement接口,是Statement接口的扩展,用来执行动态的SQL语句,即包含参数的SQL语句。PreparedStatement接口提供的常用方法。 方法名称 功能描述 executeQuery() 执行前面包含参数的动态SELECT语句,并返回一个永 远不能为null的ResultSet实例 executeUpdate() 执行前面包含参数的动态INSERT、UPDATE或DELETE 语句,并返回一个int型数值,为同步更新记录的条数 setXxx() 为指定参数设置Xxx型值 close() 立即释放Statement实例占用的数据库和JDBC资源,即 关闭Statement实例
4.1.6 访问结果集接口ResultSet 通过该接口的实例可以获得检索结果集,以及对应数据表的相关信息。ResultSet实例是通过执行查询数据库的语句生成。ResultSet接口提供的常用方法。 方法名称 功能描述 first() 移动指针到第一行;如果结果集为空则返回false,否则返回true; 如果结果集类型为TYPE_FORWARD_ONLY将抛出异常 last() 移动指针到最后一行;如果结果集为空则返回false,否则返回true; 如果结果集类型为TYPE_FORWARD_ONLY将抛出异常 previous() 移动指针到上一行;如果存在上一行则返回true,否则返回false; 如果结果集类型为TYPE_FORWARD_ONLY将抛出异常 next() 移动指针到下一行;指针最初位于第一行之前,第一次调用该方法 将移动到第一行;如果存在下一行则返回true,否则返回false getRow() 查看当前行的索引编号;索引编号从1开始,如果位于有效记录行 上则返回一个int型索引编号,否则返回0 findColumn() 查看指定列名的索引编号;该方法有一个String型入口参数,为要 查看列的名称,如果包含指定列,则返回int型索引编号,否则将抛 出异常 close() 释放ResultSet实例占用的数据库和JDBC资源,当关闭所属的 Statement实例时也将执行此操作
4.2 JDBC访问数据库 使用JDBC访问数据库,其访问流程是: (1)注册驱动。 (2)建立连接(Connection)。 (3)创建数据库操作对象用于执行SQL的语句。 (4)执行语句。 (5)处理执行结果(ResultSet)。 (6)释放资源。 本节内容: 4.2.1 注册驱动MySQL的驱动程序 4.2.2 JDBC连接数据库创建连接对象 4.2.3 创建数据库的操作对象 4.2.4 执行SQL 4.2.5 获得查询结果并进行处理 4.2.6 释放资源 4.2.7 数据库乱码解决方案
4.2.1 注册驱动MySQL的驱动程序 1.将驱动程序文件添加到应用项目 将驱动程序mysql-connector-java-5.1.6-bin,拷贝到Web应用程序的WEB-INF\lib目录下,Web应用程序就可以通过JDBC接口访问MySQL数据库了。 2.加载注册指定的数据库驱动程序 对于MySQL数据库,其驱动程序加载格式: Class.forName("com.mysql.jdbc.Driver"); 其中,“com.mysql.jdbc.Driver”为MySQL数据库驱动程序类名。
4.2.2 JDBC连接数据库创建连接对象 创建数据库连接对象,需要首先形成“连接符号字(URL)”,然后利用“连接符号字”实现连接并创建连接对象。 1.数据库连接的URL 对于MySQL数据库的连接符号字,可采用如下方式创建: String url1="jdbc:mysql://数据库服务器IP:3306/数据库名"; String url2="?user=root&password=密码"; String url3="&useUnicode=true&characterEncoding=UTF-8"; String url=url1+url2+ url3;
2.利用连接符号字实现连接,获取连接对象 DriverManager类提供了getConnection方法,用来建立与数据库的连接。调用getConnection()方法可返回一个数据库连接对象。 getConnection方法有3种不同的重载形式: 第1种:通过url指定的数据库建立连接,其语法原型为: static Connection getConnection(String url) 第2种:通过url指定的数据库建立连接,info提供了一些属性,这些属性里包括了user和password等属性,其语法原型为: static Connection getConnection(String url,Properties info); 第3种:传入参数用户名为user,密码为password,通过url指定的数据库建立连接,,其语法原型为: static Connection getConnection(String url,String user,String password):
3.利用JDBC连接MySQL数据库,获取连接对象的通用格式 设MySQL数据库为:“students”,用户名为“root”,密码为“123456”,数据库读写的编码采用UTF-8,连接格式: String driverName = "com.mysql.jdbc.Driver"; //驱动程序名 String userName = "root"; //数据库用户名 String userPwd = "123456"; //密码 String dbName = "students"; //数据库名 String url1="jdbc:mysql://localhost:3306/"+dbName; String url2 ="?user="+userName+"&password="+userPwd; String url3="&useUnicode=true&characterEncoding=UTF-8"; String url =url1+url2+url3; //形成连接字 Class.forName(driverName); //加载并注册驱动程序 //获取数据库连接对象 Connection conn=DriverManager.getConnection(url);
4.2.3 创建数据库的操作对象 1.创建Statement对象 4.2.3 创建数据库的操作对象 数据库的操作对象是指能执行SQL语句的对象,需要Connection类中创建数据库的操作对象的方法实现创建。 可创建两种不同的数据库操作对象: Statement对象、PrepareStatement对象。 1.创建Statement对象 利用Connection类的方法createStatement()可以创建一个Statement类实例,用来执行SQL操作。 例如,假设通过数据库连接,得到其连接对象为conn,那么,可创建Statement的一个实例stmt: Statement stmt = conn.createStatement();
2.创建PrepareStatement对象 (1)PreparedStatement对象使用PreparedStatement()方法创建,并且在创建时直接指定SQL语句。 例如: String sql="select * from stu_info" PreparedStatement pstmt= conn.preparedStatement(sql); (2)使用带参数的SQL语句(“?”表示参数值),创建PreparedStatement对象。 String ss="select * from stu_info where age>=? and sex=?"; PreparedStatement pstmt= conn.preparedStatement(ss); 但在SQL语句中,没有指定具体的年龄和性别,在实际执行该SQL前,需要向PreparedStatement对象传递参数值。 设置参数值的格式为: PreparedStatement对象.setXXX(position,value);
4.2.4 执行SQL 创建操作对象后,就可以利用该对象,实现对数据库的具体操作,即执行SQL语句。 1. Statement对象执行SQL语句 Statement主要提供了两种执行SQL语句的方法: (1)ResultSet executeQuery(String sql): 执行select语句,返回一个结果集。 (2)int executeUpdate(String sql): 执行update、insert、delete,返回一个整数,表示执行SQL语句影响的数据行数。
2 . PreparedStatemen对象执行SQL语句 PreparedStatement也有ResultSet executeQuery()和int executeUpdate()两个方法,但都不带参数。 PreparedStatement两种执行SQL语句的方法: (1)ResultSet executeQuery(): 执行select语句,返回一个结果集。 (2)int executeUpdate(): 执行update、insert、delete的SQL语句。它返回一个整数,表示执行SQL语句影响的数据行数。
4.2.5 获得查询结果并进行处理 如果SQL语句是查询语句,执行executeQuery()方法返回的是ResultSet对象。ResultSet对象是一个由查询结果构成的数据表。 对查询结果的处理,一般需要,首先定位记录位置,然。后对确定记录的字段项实现操作。 1.记录定位操作 在ResultSet结果记录集中隐含着一个数据行指针,可使用4.1节中表4-5中的方法将指针移动到指定的数据行。
2.读取指定字段的数据操作 有两种格式,一是用整数指定字段的索引(索引从1开始),二是用字段名来指定字段。下表列出采用“指定字段的索引号”获取各种类型的字段值的方法。 方法名称 方法说明 boolean getBoolean(int ColumnIndex) 返回指定字段的以Java的booelan类型表示的字段值 String getString(int ColumnIndex) 返回指定字段的以Java的String类型表示的字段值 byte getByte(int ColumnIndex) 返回指定字段的以Java的byte类型表示的字段值 short getShort(int ColumnIndex) 返回指定字段的以Java的short类型表示的字段值 int getInt(int ColumnIndex) 返回指定字段的以Java的int类型表示的字段值 long getLong(int ColumnIndex) 返回指定字段的以Java的long类型表示的字段值 float getFloat(int ColumnIndex) 返回指定字段的以Java的float类型表示的字段值 double getDouble(int ColumnIndex) 返回指定字段的以Java的Double类型表示的字段值 byte[ ] getBytes(int ColumnIndex) 返回指定字段的以Java的字节数组类型表示的字段值 Date getDate(int ColumnIndex) 返回指定字段的以Java.sql.Date的Date类型表示的字 段值
3.修改指定字段的数据操作 移到指定的数据行后,可使用updateXxx()方法设置字段新的数值,其中“Xxx”指的是Java的数据类型。方法的参数也有两种格式,一是用整数指定字段的索引(索引从1开始),二是用字段名来指定字段。 格式: updateXxx(字段名或字段序号,新数值) 例如: 对数据表stu,其中的字段是xh(学号,字符串),name(姓名,字符串),cj(成绩,整型),并且查询结果集为rs,则对数据表stu当前记录中成绩改为90,则需要执行: String sql="select xh,name,cj from stu"; RrsultSet rs=stmt.executeQuery(sql); rs.updateInt(3,90); //或rs.updateInt("cj",90);
4.2.6 释放资源 当完成对数据库记录的一次操作后,应及时关闭这些对象并释放资源。 假设建立的对象依次为:连接对象为conn(Connection conn),操作对象为pstmt (PreparedStatement pstmt),得到的查询结果集对象为rs(RrsultSet rs),则需要依次关闭的对象是: rs.close(); stmt.close(); con.close();
4.2.7 数据库乱码解决方案 在实现对数据库操作时,对于汉字信息,有时不能正确处理,其原因是由于汉字编码的不同所造成的。为了正确处理汉字信息,必须使汉字编码使用统一的编码格式。汉字编码,目前主要使用UTF-8和GB2312。本教材中统一使用UTF-8编码。 在设计Web应用程序时,涉及到汉字信息编码的组件主要有: (1)数据库和数据表建立时,所建立的数据库和数据表及其各字段的编码格式。 (2)对数据库中记录的读写访问所采用的编码格式。 (3)在JSP页面之间传递参数(request对象)时,其汉字编码格式。 (4)在JSP页面(HTML页面)本身中汉字编码格式。 (5)由服务器响应(response),返回到客户端的信息编码格式。 在所设计应用程序时,需要将这几部分的编码格式统一为一种汉字编码方式,就可以解决汉字乱码问题。
4.3 综合案例 ——学生身体体质信息管理系统的开发 4.3 综合案例 ——学生身体体质信息管理系统的开发 【案例说明】描述一个学生身体体质的信息有:有id(序号,整型),name(姓名,字符串),sex(性别,字符串),age(年龄,整型),weight(体重,实型),hight(身高,实型)。存放学生体质信息的数据库为students,数据表为stu_info。要求,利用JDBC技术实现对学生身体体质信息的管理。 该问题是一个简单的数据库信息管理系统,基本操作主要有:数据库和数据表的建立;数据库记录信息的添加(插入);数据库记录信息的查询;数据库记录信息的删除;数据库记录信息的修改。
1.功能划分 整个系统的业务逻辑,可以分为4个功能模块: (1)添加记录模块:完成向数据库添加新记录。 (2)查询记录模块:完成将数据库的记录以网页的方式显示出来,一般需要采用有条件的查询。 (3)修改记录模块:完成对指定条件的数据库记录实现修改。 (4)删除记录模块:完成对指定条件记录从数据库中删除。
2.每个模块的操作流程 对数据库记录的每种操作,需要的操作步骤是: (1)注册驱动,并建立数据库的连接; (2)创建执行SQL的语句; (3)执行语句; (4)处理执行结果; (5)释放资源; 下面按各功能模块和实现操作步骤,分别给出其设计思想和设计过程。
设计过程: 4.3.1 数据库和数据表的建立 4.3.2 注册驱动并建立数据库的连接 4.3.3 添加记录模块的设计与实现 4.3.4 查询记录模块的设计与实现 4.3.5 修改记录模块的设计与实现 4.3.6 删除记录模块的设计与实现 4.3.7 数据库操作的模板 4.3.8 整合各设计模块形成完整的应用系统 4.3.9 问题与思考
4.3.1 数据库和数据表的建立 该系统需要创建一个数据库以及该库中的一个数据表在MySQL中创建一个数据库:students,并在数据库students中创建表students_info。 字段 中文描述 数据类型 是否为空 id 学生学号 int 否 name 学生名字 Varchar(20) 是 sex 性别 Varchar(4) age 年龄 weight 体重 double hight 身高 数据库和数据表的建立代码
4.3.2 注册驱动并建立数据库的连接 对数据库进行查询、添加、删除、修改等操作时,都必须通过JDBC建立应用程序与数据库的连接,在本小节中给出实现“注册驱动并建立数据库的连接”的公共代码。 连接数据库时,一般需要指定数据库读写的编码,这里采用“UTF-8”编码。 实现注册驱动并建立数据库的连接的关键代码段。
4.3.3 添加记录模块的设计与实现 【设计与实现】《源代码》 【运行】 《程序运行》 4.3.3 添加记录模块的设计与实现 【例4-1】利用PreparedStatement对象实现在数据库中插入一条记录。其相应的记录信息是:序号、姓名、性别、年龄、体重、身高,分别为:16、“张三”、“男”、20、70.0、175。 【分析】使用PreparedStatement对象向数据库中插入(添加)记录,其处理步骤: (1)建立数据库的连接。 (2)形成SQL语句(可以带参数,也可以不带参数)。 (3)利用连接对象建立PreparedStatement对象。 (4)若是带参数的SQL执行语句,则需要对各参数设置相应的参数值。 (5)调用PreparedStatement对象,执行executeUpdate()方法。 (6)根据executeUpdate()方法返回的整数,判定是否执行成功,如果大于0表示成功,否则执行失败。 (7)关闭所有资源。 【设计与实现】《源代码》 【运行】 《程序运行》
【实现】(1)提交页面程序insert_stu_2_tijiao.jsp (2)插入记录程序insert_stu_2.jsp 【例4-2】设计程序,实现利用提交页面提交要添加的学生信息。然后进入添加处理程序实现将信息添加到数据库。 【分析】需要两个JSP程序,程序insert_stu_2_tijiao.jsp将提交信息存放到request对象中,而程序insert_stu_2.jsp从request对象中获取数据,形成插入记录的SQL语句,并实现插入。 request对象 insert_stu_2.jsp insert_stu_2_tijiao.jsp 【设计关键】 (1)该例题有两个组件,其关键是实现这两个组件之间的数据共享,即,使用request对象实现两个页面信息的共享,分别使用了id,name,sex,age,weight,hight等变量。 (2)在添加处理页面,设置查询参数值时,必须注意各字段的数据类型,不同的类型采用不同的设置方法。 【实现】(1)提交页面程序insert_stu_2_tijiao.jsp (2)插入记录程序insert_stu_2.jsp 【运行】 《程序运行》
4.3.4 查询记录模块的设计与实现 【例4-3】采用PreparedStatement的对象实现记录的查询操作,要求查询表stu_info中的所有学生信息并显示在网页上。 【分析】使用PreparedStatement对象实现数据库查询,其处理步骤: (1)建立数据库的连接。 (2)形成查询SQL语句(可以带参数,也可以不带参数。) (3)利用连接对象建立PreparedStatement对象。 (4)若是带参数的SQL执行语句,则需要对各参数设置相应的参数值(若SQL语句不带参数,该步可以省)。 (5)再调用PreparedStatement对象的executeQuery()方法,并返回ResultSet对象。 (6)对所得到的ResultSet对象中的各记录依次进行处理。 (7)关闭所有资源。
【设计关键】该题目要求是显示出所有的记录,对于查询SQL语句不需要参数,其查询语句为: String sql="select 【设计关键】该题目要求是显示出所有的记录,对于查询SQL语句不需要参数,其查询语句为: String sql="select * from stu_info " 另外,对于获得的查询结果集ResultSet中每条记录的处理方式,在本例中采用HTML的表格标签实现数据的显示。 【实现】《源代码》 【运行】 《程序运行》
【分析】其处理步骤与例4-3的处理步骤一样,这里采用带参数的查询SQL语句。【设计关键】该例题的设计关键是查询SQL语句的形成,即: 【例4-4】采用PreparedStatement的对象实现有条件的查询操作,要求在表stu_info中,查询出体重介于60至80之间的所有同学并在网页上显示。 【分析】其处理步骤与例4-3的处理步骤一样,这里采用带参数的查询SQL语句。【设计关键】该例题的设计关键是查询SQL语句的形成,即: String sql="select * from stu_info where weight>=? and weight<=?"; 另外,对于该题目,其查询条件是固定的,其参数值的设置是: pstmt.setInt(1,60); pstmt.setInt(2,80); 【实现】find_stu_2.jsp修改为如下代码即可 【运行】《程序运行》 也可以采用不带参数的SQL语句, String sql="select * from stu_info where weight>=60 and weight<=80"; PreparedStatement pstmt= conn.prepareStatement(sql); ResultSet rs=pstmt.executeQuery();
【例4-5】设计一个提交页面(find_stu_3_tijiao.jsp),将要查询的条件通过该页面提交给查询处理页面(find_stu_5.jsp),在该页面中获取所提交的信息,并将这些信息作为SQL语句的参数信息,查询结束后,显示出所有满足条件的记录。 【分析】 该例题,需要设计两个JSP程序,提交页面(find_stu_3_tijiao.jsp)和查询处理程序(find_stu_3.jsp)。 该例题的两个组件之间的处理流程如图4-4所示。 request对象 findt_stu_3.jsp find_stu_3_tijiao.jsp
【实现】(1)提交页面find_stu_3_tijiao.jsp (2)查询和信息显示的程序find_stu_3.jsp 【设计关键】 (1)该例题有两个组件,其关键是实现这两个组件之间的数据共享,即,使用request对象实现两个页面信息的共享,分别使用了sex,w1,w2。 (2)在提交页面中性别的默认值为“男”,体重的默认值分别为0和150。 (3)在查询处理页面,设置查询参数值时,必须注意个字段的数据类型,性别为字符串类型,体重为float类型。 【实现】(1)提交页面find_stu_3_tijiao.jsp (2)查询和信息显示的程序find_stu_3.jsp 【运行】 《程序运行》
4.3.5 修改记录模块的设计与实现 【例4-6】更新数据库记录操作,设计一个JSP程序(update_stu_1.jsp),实现将数据库students中数据表stu_info中的学生记录,姓名为“张三”的同学的体重改为80.0。 【分析】使用PreparedStatement对象实现数据库记录的修改,其处理步骤: (1)建立数据库的连接; (2)形成SQL语句(可以带参数,也可以不带参数) (3)利用连接对象建立PreparedStatement对象, (4)若是带参数的SQL执行语句,则需要对各参数设置相应的参数值; (5)调用PreparedStatement对象,执行executeUpdate()方法; (6)根据executeUpdate()方法返回的整数,判定是否执行成功,如果大于0表示成功,否则执行失败。 (7)关闭所有资源。
【设计关键】该例题的设计与实现记录的添加操作一样,所不同的是该例题需要用修改记录的SQL语句,即: String sql="update stu_info set weight=? where name=?"; 另外,对于该题目,其条件是固定的,其参数值的设置是: pstmt.setFloat(1,80); pstmt.setInt(2, "张三"); 【实现】《源代码》 【运行】 《程序运行》
【例4-7】对数据库students中的数据表stu_info,对满足条件的记录进行修改(为了简化设计,假设满足条件的记录只有一条)。 【分析】该例题需要3个组件,一个是update_stu_2_tijiao.jsp,实现查询条件的提交;第二个程序是update_stu_2_edit.jsp,实现对满足条件的记录信息返回编辑页面并修改,待编辑修改完成后提交;第三程序是update_stu_2.jsp,实现将修改后的信息重新写入数据库中。 【设计关键】该例题需要在3个页面之间共享信息,需要使用JSP内置对象request和session。实现共享的过程。
【实现】 【运行】《程序运行》 (1)查询条件的提交:update_stu_2_tijiao.jsp; (2)对满足条件的记录信息返回编辑页面并修改:update_stu_2_edit.jsp: (3)将修改后的信息重新写入数据库中:update_stu_2.jsp 【运行】《程序运行》
4.3.6 删除记录模块的设计与实现 【实现】《源代码》 【运行】 《程序运行》 4.3.6 删除记录模块的设计与实现 【例4-8】采用PreparedStatement的对象,实现将数据表stu_info中体重大于等于80的所有同学删除。 【分析】删除记录的操作步骤与添加记录(修改记录)的操作步骤一样(参考例4-1或例4-6)。 【设计关键】该例题需要用删除记录的SQL语句,即: String sql="delete from stu_info where weight>=?"; 另外,对于该题目,其条件是固定的,其参数值的设置是: pstmt.setFloat(1,80); 【实现】《源代码》 【运行】 《程序运行》
【例4-9】对数据库students中的数据表stu_info,删除满足条件(由提交页面提供)的所有记录。 【分析】该例题要2个组件,一个是delete_stu_2_tijiao.jsp,实现条件的提交;第二个是delete_stu_2.jsp,删除满足条件的所有记录。 request对象 delete_stu_2.jsp delete_stu_2_tijiao.jsp 【设计关键】 (1)该例题需要在2个页面之间共享信息,需要使用JSP内置对象request实现共享。为了简化设计,按“姓名”、“性别”、“体重范围段”设置查询条件。 (2)在提交页面,提交信息可以是“空值”,表示该字段不受限制。 (3)在查询处理页面,设置查询参数值时,必须注意各字段的数据类型。
【实现】 【运行】《程序运行》 (1)delete_stu_2_tijiao.jsp,实现条件的提交; (2)delete_stu_2.jsp,删除满足条件的所有记录 【运行】《程序运行》
4.3.7 数据库操作的模板 “数据库操作的模板”代码。实现数据库的添加、查询、修改、删除操作。由于实现数据库操作,存在数据库连接等各种异常,通常需要异常处理,其数据库操作的通用结构。
4.3.8 整合各设计模块形成完整的应用系统 系统的应用界面如图4-10所示。页面的左部分是操作功能菜单选项,当单击某选项时,会相应的执行该选项的功能,图4-10所示是选择“按条件修改学生”后所显示的网页界面。
功能模块划分: 1. 列出全部学生模块:该功能模块在【例4-3】中已实现,其程序为find_stu_1. jsp。 2 功能模块划分: 1.列出全部学生模块:该功能模块在【例4-3】中已实现,其程序为find_stu_1.jsp。 2.按条件查询学生模块:该功能模块在【例4-5】中已实现,其程序为find_stu_3_tijiao.jsp和find_stu_3.jsp。 3.新添加学生模块:该功能模块在【例4-2】中已实现,其程序为insert_stu_2_tijiao.jsp和insert_stu_2.jsp。 4.按条件删除学生模块:该功能模块在【例4-9】中已实现,其程序为delete_stu_2_tijiao.jsp和delete_stu_2.jsp。 5.按条件修改学生模块:该功能模块在【例4-7】中已实现,其程序为update_stu_2_tijiao.jsp、update_stu_2_edit.jsp、update_stu_2.jsp。 6.主页面框架的设计 该应用系统的主页面框架如图4-10所示,由3部分组成: 最上方的显示标题部分(index_title.jap), 左边的显示操作菜单的显示(index_stu_left.jsp), 右边显示运行界面部分(index_stu_right.jsp), 另外,由这3部分组合形成主页面的程序(index_stu.jsp)。 运行程序 设计过程与源代码
4.4 数据源与连接池技术 使用连接池技术连接数据库需要两步处理:首先配置数据源,然后在程序中通过连接池建立数据库的连接,从而再访问数据库。 本节主要内容: 4.4.1 配置数据源 4.4.2 使用连接池技术访问数据库处理步骤 4.4.3 连接池应用 ——学生身体体质信息显示模块的设计与实现 4.4.4 问题与思考
4.4.1 配置数据源 在通过连接池技术访问数据库时,首先需要Web服务器下配置数据库连接池。 下面以MySQL数据库为例介绍在服务器Tomcat下配置数据库连接池的方法。 1.在服务器上添加MySQL数据库驱动程序 将MySQL数据库的驱动程序复制到Tomcat安装路径下的common\lib文件夹中。
2.数据源参数配置 在Web工程目录下的META-INF\context.xml文件中,若在Web工程目录下META-INF不存在context.xml文件,则需要自己建立该文件。配置数据源的具体代码如下: <Context> <Resource name="jdbc/mysql" type="javax.sql.DataSource" auth="Container" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/数据库名字" username="用户名字" password="用户密码" maxActive="4" maxIdle="2" maxWait="6000" /> </Context>
配置数据源时需要配置的<Resource>元素的属性及其说明 属性名称 说 明 name 设置数据源的JNDI名 type 设置数据源的类型 auth 设置数据源的管理者,有两个可选值Container和Application,Container表 示由容器来创建和管理数据源,Application表示由Web应用来创建和管理 数据源 driverClassName 设置连接数据库的JDBC驱动程序 url 设置连接数据库的连接字串 username 设置连接数据库的用户名 password 设置连接数据库的密码 maxActive 设置连接池中处于活动状态的数据库连接的最大数目,0表示不受限制 maxIdle 设置连接池中处于空闲状态的数据库连接的最大数目,0表示不受限制 maxWait 设置当连接池中没有处于空闲状态的连接时,请求数据库连接的请求的最 长等待时间(单位为ms),如果超出该时间将抛出异常,−1表示无限期等 待
4.4.2 使用连接池技术访问数据库处理步骤 通过三个步骤来使用数据源对象: (1)获得对数据源的引用: (2)获得数据库连接对象: 4.4.2 使用连接池技术访问数据库处理步骤 通过三个步骤来使用数据源对象: (1)获得对数据源的引用: Context ctx=new InitalContext(); DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql"); (2)获得数据库连接对象: Connection con = ds.getConnection(); (3)返回数据库连接到连接池: con.close();
4.4.3 连接池应用 ——学生身体体质信息显示模块的设计与实现 4.4.3 连接池应用 ——学生身体体质信息显示模块的设计与实现 【例4-10】应用连接池技术访问数据库students,并显示数据表stu_info中的全部数据。该数据库和数据表在4.3节中已经定义。 该题目的设计过程如下: (1)JDBC驱动程序复制到Tomcat安装目录下的lib/目录下(若存在,则省略)。 (2)在Web工程目录META-INF下建立文件context.xml(若已经存在,则只需添加配置信息即可), 【实现】 (1)文件context.xml (2)访问数据库的databasePool.jsp程序 【运行】《程序运行》
配置数据源信息,具体代码如下: <Context> <Resource name="jdbc/mysql" type="javax.sql.DataSource" auth="Container" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/students" username="root" password="123456" maxActive="4" maxIdle="2" maxWait="6000"/> </Context>
(3)编写databasePool.jsp程序,通过数据池访问数据库students,并显示数据表stu_info中的全部数据,其代码如下: <%@ page contentType="text/html;charset=UTF-8"%> <%@ page import="java.sql.*"%> <%@ page import="javax.sql.*"%> <%@ page import="javax.naming.*"%> <html> <head> <title>MySQL 数据源应用</title> </head> <body> <% DataSource ds = null; Connection conn=null; PreparedStatement pstmt=null; ResultSet rs=null;
try { InitialContext ctx = new InitialContext(); ds = (DataSource) ctx try { InitialContext ctx = new InitialContext(); ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql"); conn = ds.getConnection(); String sql="select * from stu_info"; pstmt= conn.prepareStatement(sql); rs=pstmt.executeQuery(); rs.last(); //移至最后一条记录 %> 你要查询的学生数据表中共有 <font size="5" color="red"> <%=rs.getRow()%></font>人 <table border="2" width="650"> <tr> <td>记录条数</td> <td>学号</td> <td>姓名</td> <td>性别</td> <td>年龄</td><td>体重</td><td>身高</td> </tr> <% rs.beforeFirst(); //移至第一条记录之前
while(rs. next()){%> <tr align="center"> <td><%= rs while(rs.next()){%> <tr align="center"> <td><%= rs.getRow()%></td> <td><%= rs.getString("id") %></td> <td><%= rs.getString("name") %></td> <td><%= rs.getString("sex") %></td> <td><%= rs.getString("age") %></td> <td><%= rs.getString("weight") %></td> <td><%= rs.getString("hight") %></td> </tr> <% }%> </table> <%} catch (Exception e) {%>出现意外,信息是:<%=e.getMessage()%><% } finally { if(rs!=null){ rs.close(); } if(pstmt!=null){ pstmt.close(); } if(conn!=null){ conn.close(); } }%> </body> </html>
本章小结 本章首先介绍了JDBC技术中常用的接口,然后介绍了MySQL数据库的连接方法及其访问数据库的方法,接着介绍了数据库的查询、添加、修改、删除等操作方法和处理步骤。 通过较多的实例演示了设计思想和设计方法。进一步介绍了数据池技术及其利用数据源实现对数据库的访问方法和过程。
上机实习 1.建立数据库lianxi,在该数据库下建立一个图书表book,图书包含信息:图书号、图书名、作者、价格、备注字段。 设计一应用程序,完成图书信息的管理。主要完成图书信息的添加、查询、删除、修改等操作。
2.设计一个简单的网上名片管理系统,实现名片的增、删、改、查等操作。该名片管理系统包括如下功能: (1)用户登录与注册 用户登录:在登录时,如果用户名和密码正确,进入系统页面。 用户注册:新用户应该先注册,然后再登录该系统。 (2)名片管理 增加名片:以仿真形式(按常用的名片格式)增加名片信息。 修改名片:以仿真形式(按常用的名片格式)修改名片信息。 查询名片:以模糊查询方式查询名片。 删除名片:名片的删除由2种方式,即把名片移到回收站,把名片彻底删除。 (3)回收站管理 还原:把回收站中的名片还原回收。 彻底删除:把名片彻底从回收站删除。 浏览/查询:可以模糊查询、浏览回收站中的名片。