490 likes | 677 Views
第 9 章 JSP 与数据库. 9.1 SQL 语言简介 9.2 JDBC 简介 9.3 使用 JDBC 连接数据库 9.4 访问数据库 9.5 数据库访问应用举例. 9.1 SQL 语言简介. 将系统讲述在 JSP 中最常用到的语句如下: ( 1 ) Select 语句 —— 查询数据; ( 2 ) Insert 语句 —— 添加记录; ( 3 ) Delete 语句 —— 删除记录; ( 4 ) Update 语句 —— 更新记录。 注意: SQL 语句不区分大小写. 9.1.1 Select 语句
E N D
第 9 章 JSP与数据库 • 9.1 SQL语言简介 • 9.2 JDBC简介 • 9.3 使用JDBC连接数据库 • 9.4 访问数据库 • 9.5 数据库访问应用举例
9.1 SQL语言简介 • 将系统讲述在JSP中最常用到的语句如下: • (1)Select语句——查询数据; • (2)Insert语句——添加记录; • (3)Delete语句——删除记录; • (4)Update语句——更新记录。 • 注意:SQL语句不区分大小写
9.1.1 Select语句 • SQL语言的主要功能之一是实现数据库查询,其Select语句可以从数据库中查询满足特定条件的有关记录。Select语句的语法如下: • Select[Top(数据)]字段列表From表[Where条件][Order By字段][Group By字段]
① Top(数据) • ② 字段列表 • ③ 表 • ④ 条件 • ⑤ Order By • ⑥ Group By
下列举一些常见的例子说明。 • (1)选取全部数据 • Select*From users • (2)选取指定字段的数据 • 如果只想选取列表中某些字段的数据,在Select后面指定字段,可以指定多个列,但每个列之间必须用逗号隔开。 • Select real_name, email From users
(3)只选取前若干条记录 • 比如选取前3条记录: • Select Top (3)* From users • (4)用表中原有的字段产生派生字段 • 有时候为了需要,可以利用一列或若干列产生一个新的字段。例如,在上面建立的用户数据库中,可以显示客户注册一年后的日期: • Select real _ name, (submit _ date+365) As new _ date From users
(5)根据条件选取数据 • 比如选取2003年11月1日之前注册的用户: • Select * From users Where submit _ date<#2003-11-1#
(6)按关键字查找记录 • 有时候查找条件可能不太精确,比如,要查询所有姓名中“勇”字的用户: • Select * From users Where real _ name like “%勇%”
(7)查询结果排序 • 在查询表中数据时,特别是表中数据较多时,总是希望表中的数据能够按照我们要求的顺序显现出来,利用Order By就可以实现。例如,将查询结果按姓名升序排列: • Select * From users Order By real _ name ASC
(8)查询满足条件的记录的总数 • Select Count (*) As total From users Where submit _ date<#2003-11-1# • (9)组合查询 • Select users.real_name, day_log.log_date,day_log.IP From users, day_log Where users.user_ name=day_log.user_name
① 在选取各个表的字段时,要标明是哪个表的字符。 • ② 用到的两个表之间用逗号隔开。 • ③ 在两个表连接时,用到users.user_name=pday_log.user_name条件,表示根据两个表中的user_name字段将两个表合成一个表。 • ④ 这只是最简单的组合查询,还有左连接、右连接等,请参考专门的SQL参考书籍。
(10)利用Group By分类合并 • 假如有一个学生成绩表usergrade,字段有user_name(学号)和grade(学分)和class(班级),现在要求每个班级的总分和平均分: • Select Sum(grade) As total_grade, Average (grade) As average_grade From usergrade Group By class
9.1.2 Insert语句 • Insert Into表(字段1,字段2,…)Values(字段1的值,字段2的值,…) • 下面举一些常见的例子说明。 • (1)只插入user_name字段 • Insert Into users (user_name) Values ("liya") • (2)只插入user_name和real_name字段 • Insert Into users (user_name , real_name) Values ("feiyun", "费云")
(3)只插入user_name和submit_date字段 • Insert Into users (user_name, submit_date) Values ("luofang",#2003-12-5#) • (4)假如在users表中增加一条完整的记录 • Insert Into users (user_name, age) Values ("zhangpen",23) • (5)在users表中增加一条完整的记录 • Insert Into users (user_name, password, real_name, tel, email, submit_date) Values ("mengment", "123456", "萌萌", "6887150", "mengmeng@henan.com", #2003-11-2#)
下面举几条经常出错的Insert语句。 • (1)user_name 是主键,但没有赋值 • Insert Into users (real_name) Values ("涂涂") • (2)real_name 字段不允许空字符串,却赋了空字符串(两个双引号表示空字符串) • Insert Into users (user_name, real_name) Values ("tutu" "") • (3)字符串字段两边没有加双引号 • Insert Into users (user_name, real_name) Values ("tutu",涂涂)
9.1.3 Delete • 在SQL语言中,可以使用Delete语句删除表中无用的记录。其语法如下: • Delete From表[Where条件] • 下面举一些常用的例子。 • (1)删除user_name为“tutu”的用户。 • (2)删除2003年1月1日前注册,且real_name为“李亚”的用户。 • (3)删除表中所有数据
9.1.4 Update语句 • Update数据表名Sel字段1=字段值1,字段2=字段值2,…[Where条件] • (1)修改user_name为“jjshang”的用户的电话和E-mail地址。 • (2)将所有2003年1月1日前注册的用户的注册日期统一更改为2003年1月1日。 • (3)若有年龄字段age,将所有人的年龄增加10岁。
9.2 JDBC简介 • JDBC(Java DataBase Connectivity,中文意为Java数据库连接)是在Java中用面向对象的方法来连接数据库的技术。 • 9.2.1 什么是JDBC
1.JDBC的主要类包 • (1)java.sql包,提供在Java中访问和处理存储于客户端数据源中数据的API。 • (2)javax.sql包,提供在Java中对服务器端数据源进行访问和处理的API。
2.JDBC可访问的数据源 • (1)关系型数据库,如:Oracle,DB2,SQL Server,My SQL,Access等。 • (2)电子数据表格,如:Excel等。 • (3)平面数据文件,如:DBase,Foxpro,Paradox等。 • 3.JDBC的驱动程序
9.2.2 使用JDBC的访问数据库的方法 • 1.JDBC实现对数据库访问与操作的步骤 • (1)建立与数据源的连接。 • (2)发送查询、更新等SQL语句到数据源。 • (3)处理由SQL语句得到的结果。2.JDBC访问数据库的简单例子
9.2.3 JDBC支持的数据访问模式 • 1.两层模型 • 2.三层模型
9.3 使用JDBC连接数据库 • 9.3.1 JDBC连接数据库的方法 • 1.Java程序连接数据库的4种方法 • Java 程序连接数据库的方法实际上有下面4种。
(1)JDBC-ODBC桥和ODBC驱动程序。 • (2)本机代码和Java驱动程序。 • (3)JDBC网络的纯Java驱动程序。 • (4)本机协议纯Java驱动程序。 • 2.连接数据库4种方法的性质
9.3.2 建立数据库连接 • 1.建立连接的基本步骤 • (1)加载要使用的数据库驱动程序类,该工作由Class类的静态方法forName完成,它加载相应的驱动程序类,并创建该类的一个实例。如要加载JDBC-ODBC桥驱动类采用如下语句: • Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
(2)声明一个Connection接口的对象。如: • Connection conn; • (3)并使用driverManager类的静态方法getConnection建立数据库连接,该方法主要有两种重载形式: • Connection getConnection(String url) • Connection getConnection(String url,String user,String password)
2.JDBC URL字符串 • (1)JDBC URL字符串语法格式 • ① jdbc • ② <subprotocol> • ③ <subname> • (2)JDBC URL字符串的例子
9.3.3 使用JDBC-ODBC桥的连接应用 • 1.使用JDBC-ODBC桥建立“数据源名称”的步骤 • (1)打开Windows的控制面板,选择“ODBC”设置程序
(2)打开该程序后,选择“系统DSN”选项卡建立系统的ODBC数据源(2)打开该程序后,选择“系统DSN”选项卡建立系统的ODBC数据源 • (3)单击“添加”按钮添加新的系统DSN • (4)在图9-5所示的对话框中选择适当的ODBC驱动程序,此处选择Microsoft Access Driver(*.MDB),然后按“完成”按钮 • (5)在图9-6中设置“数据源名”,并按“选择”按钮选择特定的数据库。 • (6)单击“确定”按钮完成ODBC DSN的建立。 • 2.编写JDBC-ODBC桥连接数据库的代码
9.3.4 使用JDBC桥直接连接数据库应用 • 9.3.5 关闭与数据库的连接
9.4 访问数据库 • java.sql包中与数据库操作有关的接口主要有以下几个: • (1)Connection • (2)Statement • (3)PreparedStatement • (4)CallableStatement • (5)ResultSet
9.4.1 使用SQL语句对数据库进行操作 • 1.查询操作 • 2.获取结果集的字段
3.记录的插入、删除和更新操作 • 4.使用带参数的SQL语句 • (1)set方法组 • (2)clearParameters()方法 • (3)executeQuery()方法 • (4)executeUpdate()方法
9.4.2 使用ResultSet对象对数据库进行操作 • 1.结果集的游标操作 • (1)使用get或update方法组对当前记录的字段进行操作。 • (2)使用insertRow、deleteRow和updateRow等方法对整条记录进行操作。 • (3)以当前记录为起点进行游标的相对移动操作。
2.结果集的类型 • Statement createStatement(int resultSetType,int resultSetConcurrency) • (1)resultSetType定义了结果集的类型 • (2)resultSetConcurrency决定结果集的更新方式
3.使用结果集对表进行操作 • (1)更新操作 • ① update方法组 • ② updateRow()方法 • ③ cancelRowUpdates()方法
(2)插入操作 • ① 使用moveToInsertRow()方法将游标移动到插入行。 • ② 使用update方法组对插入行的字段进行赋值。 • ③ 使用insertRow()方法向数据库的表提交插入操作。 • (3)删除操作
9.4.3 数据库的高级操作 • 1.批量操作 • 实现批量操作需要使用Statement对象的下面3个方法。 • (1)void addBatch(String sql),向Statement对象添加SQL语句。 • (2)int[] executeBatch(),向数据库提交Statement对象中的SQL语句,SQL语句的执行情况以整型数组返回,数组元素的顺序与SQL语句的顺序一致。 • (3)void clearBatch(),清空Statement对象的SQL语句列表。
2.事务处理 • (1)setAutoCommit(Boolean) • (2)commit() • (3)rollback()
3.调用数据库的存储过程 • JDBC的CallableStatement对象提供了调用关系数据库的存储过程的标准方法。CallableStatement对象使用call命令调用存储过程,call命令的语法形式如下,其中的问号代表存储过程的参数。 • {[? = ]call storedProcedure_name[(?, ?, ...)]}
创建CallableStatement对象使用Connection对象的prepareCall方法。下面的语句创建了一个CallableStatement对象。 创建CallableStatement对象使用Connection对象的prepareCall方法。下面的语句创建了一个CallableStatement对象。 • CallableStatement cst; • cst = conn.prepareCall("{call getTestData(?, ?)}");
存储过程的参数有3种:输入参数、输出参数和输入输出参数。每种参数的作用不同,使用的方法也有所不同。 存储过程的参数有3种:输入参数、输出参数和输入输出参数。每种参数的作用不同,使用的方法也有所不同。 • (1)输入参数,用于在调用存储过程时向存储过程传入数据。 • (2)输出参数,用于返回存储过程执行后的结果。 • (3)输入输出参数,同时具有输入参数和输出参数的功能。
9.5 数据库访问应用举例 • 9.5.1 JavaApplet访问数据库应用 • 9.5.2 JavaApplication访问数据库应用实例