JSP 与数据库 SQL 语言简介 SQL 语言简介 JDBC 简介 JDBC 简介 使用 JDBC 连接数据库 使用 JDBC 连接数据库 访问数据库 数据库访问应用举例
SQL 语言简介 将系统讲述在 JSP 中最常用到的语句如下: ( 1 ) Select 语句 —— 查询数据; ( 2 ) Insert 语句 —— 添加记录; ( 3 ) Delete 语句 —— 删除记录; ( 4 ) Update 语句 —— 更新记录。 注意: SQL 语句不区分大小写
Select 语句 SQL 语言的主要功能之一是实现数据库 查询,其 Select 语句可以从数据库中查询满足 特定条件的有关记录。 Select 语句的语法如下: Select[Top( 数据 )] 字段列表 From 表 [Where 条件 ][Order By 字段 ][Group By 字段 ]
① Top (数据) ② 字段列表 ③ 表 ④ 条件 ⑤ Order By ⑥ Group By
下列举一些常见的例子说明。 ( 1 )选取全部数据 Select*From users Select*From users ( 2 )选取指定字段的数据 如果只想选取列表中某些字段的数据,在 Select 后面指定字段,可以指定多个列,但 每个列之间必须用逗号隔开。 Select real_name, From users Select real_name, From users
( 3 )只选取前若干条记录 比如选取前 3 条记录: Select Top (3)* From users Select Top (3)* From users ( 4 )用表中原有的字段产生派生字段 有时候为了需要,可以利用一列或若干列产 生一个新的字段。例如,在上面建立的用户 数据库中,可以显示客户注册一年后的日期: Select real _ name, (submit _ date+365) As new _ date From users Select real _ name, (submit _ date+365) As new _ date From users
( 5 )根据条件选取数据 比如选取 2003 年 11 月 1 日之前注册的用户: Select * From users Where submit _ date < # # Select * From users Where submit _ date < # #
= 等 于 <>不等于 >大于 >=大于等于 <小于 <=小于等于 Not 非 And 与 Or 或 Between 介于 Not Between 不介于 In 列的数据值位于所列的范围内 Not In 列的数据值不位于所列的范围内 Is NULL 列的数据值为 NULL Is Not NULL 列的数据值不为 NULL 表 9-1 条件连接符
( 6 )按关键字查找记录 有时候查找条件可能不太精确,比如, 要查询所有姓名中 “ 勇 ” 字的用户: Select * From users Where real _ name like “% 勇 %” Select * From users Where real _ name like “% 勇 %”
( 7 )查询结果排序 在查询表中数据时,特别是表中数据较多时, 总是希望表中的数据能够按照我们要求的顺序 显现出来,利用 Order By 就可以实现。例如, 将查询结果按姓名升序排列: Select * From users Order By real _ name ASC Select * From users Order By real _ name ASC
( 8 )查询满足条件的记录的总数 Select Count (*) As total From users Where submit _ date < # # Select Count (*) As total From users Where submit _ date < # # ( 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
Insert 语句 Insert Into 表 ( 字段 1 ,字段 2 , …)Values( 字段 1 的 值,字段 2 的值, …) Insert Into 表 ( 字段 1 ,字段 2 , …)Values( 字段 1 的 值,字段 2 的值, …)下面举一些常见的例子说明。 ( 1 ) 只插入 user_name 字段 Insert Into users (user_name) Values ("liya") Insert Into users (user_name) Values ("liya") ( 2 ) 只插入 user_name 和 real_name 字段 Insert Into users (user_name, real_name) Values ("feiyun", " 费云 ") Insert Into users (user_name, real_name) Values ("feiyun", " 费云 ")
( 3 ) 只插入 user_name 和 submit_date 字段 Insert Into users (user_name, submit_date) Values ("luofang",# #) Insert Into users (user_name, submit_date) Values ("luofang",# #) ( 4 ) 假如在 users 表中增加一条完整的记录 Insert Into users (user_name, age) Values ("zhangpen",23) Insert Into users (user_name, age) Values ("zhangpen",23) ( 5 ) 在 users 表中增加一条完整的记录 Insert Into users (user_name, password, real_name, tel, , submit_date) Values ("mengment", "123456", " 萌萌 ", " ", # #) Insert Into users (user_name, password, real_name, tel, , submit_date) Values ("mengment", "123456", " 萌萌 ", " ", # #)
下面举几条经常出错的 Insert 语句。 ( 1 ) user_name 是主键,但没有赋值 Insert Into users (real_name) Values (" 涂涂 ") ( 2 ) real_name 字段不允许空字符串,却赋了 空字符串(两个双引号表示空字符串) Insert Into users (user_name, real_name) Values ("tutu" "") Insert Into users (user_name, real_name) Values ("tutu" "") ( 3 ) 字符串字段两边没有加双引号 Insert Into users (user_name, real_name) Values ("tutu" ,涂涂 ) Insert Into users (user_name, real_name) Values ("tutu" ,涂涂 )
Delete 在 SQL 语言中,可以使用 Delete 语句删除 表中无用的记录。其语法如下: Delete From 表 [Where 条件 ] 下面举一些常用的例子。 ( 1 ) 删除 user_name 为 “tutu” 的用户。 ( 2 ) 删除 2003 年 1 月 1 日前注册,且 real_name 为 “ 李亚 ” 的用户。 ( 3 ) 删除表中所有数据
Update 语句 Update 数据表名 Sel 字段 1= 字段值 1 ,字 段 2= 字段值 2 , …[Where 条件 ] Update 数据表名 Sel 字段 1= 字段值 1 ,字 段 2= 字段值 2 , …[Where 条件 ] ( 1 ) 修改 user_name 为 “jjshang” 的用户的电 话和 地址。 ( 2 ) 将所有 2003 年 1 月 1 日前注册的用户的注 册日期统一更改为 2003 年 1 月 1 日。 ( 3 ) 若有年龄字段 age ,将所有人的年龄增 加 10 岁。
JDBC 简介 JDBC ( Java DataBase Connectivity , 中文意为 Java 数据库连接)是在 Java 中用 面向对象的方法来连接数据库的技术。
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 语句得到的结果。
JDBC 支持的数据访问模式 1 .两层模型 2 .三层模型
图 两层数据访问模型图
图 三层数据访问模型
使用 JDBC 连接数据库 JDBC 连接数据库的方法 1 . Java 程序连接数据库的 4 种方法 Java 程序连接数据库的方法实际上有 下面 4 种。
( 1 ) JDBC-ODBC 桥和 ODBC 驱动程序。 ( 2 ) 本机代码和 Java 驱动程序。 ( 3 ) JDBC 网络的纯 Java 驱动程序。 ( 4 ) 本机协议纯 Java 驱动程序。 2 .连接数据库 4 种方法的性质
建立数据库连接 1 .建立连接的基本步骤 ( 1 ) 加载要使用的数据库驱动程序类,该工 作由 Class 类的静态方法 forName 完成,它加载 相应的驱动程序类,并创建该类的一个实例。 如要加载 JDBC-ODBC 桥驱动类采用如下语句: Class.forName("sun.jdbc.odbc.JdbcOdbcDriv er"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriv er");
( 2 ) 声明一个 Connection 接口的对象。如: Connection conn; Connection conn; ( 3 ) 并使用 driverManager 类的静态方法 getConnection 建立数据库连接,该方法主 要有两种重载形式: Connection getConnection(String url) Connection getConnection(String url) Connection getConnection(String url,String user,String password) Connection getConnection(String url,String user,String password)
2 . JDBC URL 字符串 ( 1 ) JDBC URL 字符串语法格式 ① jdbc ② ② ③ ③
使用 JDBC-ODBC 桥的连接应用 1 .使用 JDBC-ODBC 桥建立 “ 数据源名称 ” 的步骤 ( 1 ) 打开 Windows 的控制面板,选择 “ODBC” 设置程序
( 2 ) 打开该程序后,选择 “ 系统 DSN” 选项卡建立系 统的 ODBC 数据源 ( 3 ) 单击 “ 添加 ” 按钮添加新的系统 DSN ( 4 ) 在对话框中选择适当的 ODBC 驱动程序,此处 选择 Microsoft Access Driver(*.MDB) ,然后按 “ 完成 ” 按钮 ( 5 ) 设置 “ 数据源名 ” ,并按 “ 选择 ” 按钮选择特定的数 据库。 ( 6 ) 单击 “ 确定 ” 按钮完成 ODBC DSN 的建立。 2 .编写 JDBC-ODBC 桥连接数据库的代码
使用 JDBC 桥直接连接数据库应用 关闭与数据库的连接
访问数据库 java.sql 包中与数据库操作有关的接口主要有以 下几个: ( 1 ) Connection ( 2 ) Statement ( 3 ) PreparedStatement ( 4 ) CallableStatement ( 5 ) ResultSet
使用 SQL 语句对数据库进行操作 1 .查询操作 2 .获取结果集的字段
方 法说 明 getBlob(int),getBlob(String) 将指定字段的值以 Blob 对象类型返回 getBoolean(int),getBoolean(String) 将指定字段的值以 Boolean 类型返回 getByte(int),getByte(String) 将指定字段的值以 Byte 类型返回 getBytes(int),getBytes(String) 将指定字段的值以 Byte[] 类型返回 getDate(int),getDate(String) 将指定字段的值以 Date 对象类型返回 getDouble(int),getDouble(String) 将指定字段的值以 Double 类型返回 getFloat(int),getFloat(String) 将指定字段的值以 Float 类型返回 getInt(int),getInt(String) 将指定字段的值以 Int 类型返回 getLong(int),getLong(String) 将指定字段的值以 Long 类型返回 getObject(int),getObject(String) 将指定字段的值以 Object 类型返回 getShort(int),getShort(String) 将指定字段的值以 Short 类型返回 getString(int),getString(String) 将指定字段的值以 String 对象类型返回 表 Result 接口获取字段的 get 方法
3 .记录的插入、删除和更新操作 4 .使用带参数的 SQL 语句 ( 1 ) set 方法组 ( 2 ) clearParameters() 方法 ( 3 ) executeQuery() 方法 ( 4 ) executeUpdate() 方法
使用 ResultSet 对象对数据库进行 操作 1 .结果集的游标操作 ( 1 ) 使用 get 或 update 方法组对当前记录 的字段进行操作。 ( 2 ) 使用 insertRow 、 deleteRow 和 updateRow 等方法对整条记录进行操作。 ( 3 ) 以当前记录为起点进行游标的相对移 动操作。
方 法使 用 说 明使 用 说 明 beforeFirst() 移动到结果集的开始位置(第一条记录前) first() 移动到第一条记录 previous() 上移一条记录 next() 下移一条记录 last() 移动到最后一条记录 afterLast() 移动到结果集的结束位置(最后一条记录后) absolute(int row) 移动到 row 指定的记录,绝对定位 relative(int row) 从当前记录开始,上移或下移 row 条记录 isBeforeFirst() 判断是否是结果集的开始位置 isFirst() 判断是否是结果集的第一条记录 isLast() 判断是否是结果集的最后一条记录 IsAfterLast() 判断是否是结果集的结束位置 表 ResultSet 的游标操作
2 .结果集的类型 Statement createStatement(int resultSetType,int resultSetConcurrency) Statement createStatement(int resultSetType,int resultSetConcurrency) ( 1 ) resultSetType 定义了结果集的类型 ( 2 ) resultSetConcurrency 决定结果集的更 新方式
3 .使用结果集对表进行操作 ( 1 )更新操作 ① update 方法组 ② updateRow() 方法 ③ cancelRowUpdates() 方法
( 2 )插入操作 ① 使用 moveToInsertRow() 方法将游标移 动到插入行。 ② 使用 update 方法组对插入行的字段进行 赋值。 ③ 使用 insertRow() 方法向数据库的表提交 插入操作。 ( 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[(?, ?,...)]} {[? = ]call storedProcedure_name[(?, ?,...)]}
创建 CallableStatement 对象使用 Connection 对象的 prepareCall 方法。下面的语 句创建了一个 CallableStatement 对象。 CallableStatement cst; CallableStatement cst; cst = conn.prepareCall("{call getTestData(?, ?)}"); cst = conn.prepareCall("{call getTestData(?, ?)}");
存储过程的参数有 3 种:输入参数、输出 参数和输入输出参数。每种参数的作用不同, 使用的方法也有所不同。 ( 1 )输入参数,用于在调用存储过程时向 存储过程传入数据。 ( 2 )输出参数,用于返回存储过程执行后 的结果。 ( 3 )输入输出参数,同时具有输入参数和 输出参数的功能。