资源描述
11.1 关系数据库系统 11.2 JDBC Java程 序 设 计 实 用 教 程 ( 第 3版 ) 11.1.1 数据库系统 11.1.2 关系模型 11.1.3 客户-服务器结构的关系数据库系统 11.1.4 结构化查询语言SQL 11.1.5 Access数据库 11.1.6 MySQL数据库 Java程 序 设 计 实 用 教 程 (第 3版 ) n数据库(DB)n数据库管理系统(DBMS)n数据库系统(DBS) Java程 序 设 计 实 用 教 程 (第 3版 ) n数据描述中的术语实体、实体集、实体的属性n数据模型数据结构、数据操作和数据完整性约束 Java程 序 设 计 实 用 教 程 (第 3版 ) 关系:二维表,列、行。关系的性质主键与外键关系模式关系(列,列)学生(学号,姓名,性别,省份,地区,出生年月,民族,团员)课程(课程号,课程名,学分,学时)学生成绩(学号,课程号,成绩) Java程 序 设 计 实 用 教 程 (第 3版 ) 实体完整性规则参照完整性规则用户定义的完整性规则 Java程 序 设 计 实 用 教 程 (第 3版 ) 数据库的结构与功能分布 Java程 序 设 计 实 用 教 程 (第 3版 )窗 口 服 务 器 数 据 库 开 发 工 具客 户 机数 据 库 应 用 程 序 数 据 库 系 统( 服 务 端 )数 据 库 管 理 系 统( DBMS) 表 用 户 数 据 库 管 理 员 ( DBA) ODBC/专 用 接 口软 件 设 计 人 员 数 据 库( 客 户 端 )请 求发 送 SQL语 句 响 应返 回 数 据 结 果 集 3.数据库应用程序 Java程 序 设 计 实 用 教 程 (第 3版 ) 数 据 库 连 接 技 术 分 类 ODBC SQL数据库的体系结构 SQL的特点与组成表11-2 SQL语言的动词 Java程 序 设 计 实 用 教 程 (第 3版 ) SQL功 能 动 词 说 明数 据 定 义 CREATE、 DROP、ALTER 创 建 表 、 删 除 表 、 修 改 表数 据 操 纵 INSERT、 UPDATE、DELETE 插 入 、 更 新 、 删 除数 据 查 询 SELECT 查 询数 据 控 制 GRANT、 REVOKE 授 予 权 限 、 收 回 权 限 创建基本表CREATE TABLE 基本表 (列 数据类型 列级完整性约束 ,列 数据类型 列级完整性约束 ,表级完整性约束) Java程 序 设 计 实 用 教 程 (第 3版 ) 2.修改基本表ALTER TABLE 基本表 ADD 新列 数据类型 列级完整性约束 MODIFY 列 数据类型 DROP 完整性约束3.删除表DROP TABLE 表 Java程 序 设 计 实 用 教 程 (第 3版 ) 插入数据INSERT INTO 基本表 (列1, 列2) VALUES(值1, 值2)2.修改数据UPDATE 基本表 SET 列 = 表达式,列 = 表达式 WHERE 条件表达式3.删除数据DELETE FROM 表 WHERE 条件表达式 Java程 序 设 计 实 用 教 程 (第 3版 ) SELECT语句语法SELECT ALL | DISTINCT 列表达式 ,列表达式 FROM 表 WHERE 条件表达式 GROUP BY 列 HAVING 条件表达式 ORDER BY 列 ASC|DESC运算符=、= 、AND、OR 、LIKE 集函数 AVG( ALL | DISTINCT 列名) COUNT(*)、COUNT(列名) SUM(列名) 、MAX(列名)、MIN(列名) Java程 序 设 计 实 用 教 程 (第 3版 ) Access数据库的操作【例11.1】 创建Access数据库student及表。创建Access数据库文件,数据库文件名为student.mdb。 创建表 输入数据 配置ODBC数据源 Java程 序 设 计 实 用 教 程 (第 3版 ) 安装、配置、启动MySQL下载并安装MySQL数据库服务端配置MySQL数据库启动MySQL数据库服务 Java程 序 设 计 实 用 教 程 (第 3版 ) (1) 安装MySQL数据库客户端管理工具(2) 创建数据库(3) 创建表(4) 输入数据(5) 执行SQL语句【例11.2】 对MySQL数据库执行SQL语句创建stuinfo表。(6) 创建外键及查看关系模式(7) 将数据库、表结构及表中数据备份成SQL文件 Java程 序 设 计 实 用 教 程 (第 3版 ) Java程 序 设 计 实 用 教 程 (第 3版 ) 可视化MySql 管理工具启 动 MySql服 务 : net start mysql关 闭 MySql服 务 : net stop mysql 11.2.1 JDBC的作用和功能 11.2.2 指定JDBC驱动程序 11.2.3 连接数据库 11.2.4 执行SQL语句 11.2.5 处理数据查询的结果集 Java程 序 设 计 实 用 教 程 (第 3版 ) 1.什么是JDBCJDBC( Java DataBase Connectivity, Java数 据 库 连 接 )是 基 于 Java的 、 用 于 访 问 关 系 数 据 库 的 应 用 程 序 编 程 接口 。JDBC提 供 在 JAVA应 用 程 序 中 执 行 SQL语 句 以 访 问 和 操 纵 关 系数 据 库 的 方 法 。JDBC作 为 一 种 数 据 库 连 接 和 访 问 标 准 , 需 要 由 Java语 言 和数 据 库 开 发 商 共 同 遵 守 并 执 行 。 一 方 面 , Java语 言 增 加了 JDBCAPL其 中 包 括 多 个 用 于 访 问 数 据 库 的 接 口 。 另 一 方面 , 目 前 大 多 数 主 流 数 据 库 都 支 持 JDBC, 均 推 出 了 各 自的 JDBC驱 动 程 序 (driver) , 每 一 个 驱 动 程 序 都 实 现 了JDBC API中 声 明 的 接 口 。 Java程 序 设 计 实 用 教 程 (第 3版 ) 2. JDBC驱动程序类型 JDBC-ODBC桥驱动程序本地库Java实现驱动程序网络协议驱动程序数据库协议驱动程序 Java程 序 设 计 实 用 教 程 (第 3版 ) Java程 序 设 计 实 用 教 程 (第 3版 ) 3. JDBC API的基本功能、组成和工作原理 JDBC API是按照面向对象思想设计的,完全用Java语言编写。JDBC API基本功能包括: 指定JDBC驱动程序类型,并建立与指定数据库的连接。 执行SQL语句并处理结果。 获得所连接数据库的各种信息,包括驱动程序、数据库、表、列的属性等。 在JDBC数据库应用程序中,最主要的操作是执行SQL语旬,但在执行SQL语句之前, 需要先指定数据库并建立连接,在执行SQL语旬之后,还要对执行结果集进行处理。 Java程 序 设 计 实 用 教 程 (第 3版 ) 这 些 功 能 由 JDBC API提 供 的 接口 和 类 (在 java.sql包 中 )实 现 , 其中 最 主 要 的 4个 接 口 和 类 是 : DriverManager类 Connection接 口Statement接 口ResultSet接 口 Java程 序 设 计 实 用 教 程 (第 3版 ) import java.sql.*;Class.forName (sun.jdbc.odbc.JdbcOdbcDriver);Connection con=DriverManager.getConnection(jdbc:odbc:AccessDB,);Statement stmt = con.createStatement(); ResultSet r = stmt.executeQuery(select * from table1); 加 载 JDBC-ODBC驱 动 程 序 创 建 Connection对 象 , 连 接 数 据 库 创 建 Statement对 象 , 准 备 SQL操 作 执 行 查 询 , 并 建 立 ResultSet的 对 象 (查 询 结 果 集 ) 检 索 ResultSet对 象 获 得 查 询 结 果 并 显 示 :System.out.println(学 号 t姓 名 t年 龄 t性 别 t班 级 ); while(r.next() String r1=r.getString(xh); /可 换 成 r.getString(2) String r2=r.getString(xm); /可 换 成 r.getString(3) int r3=r.getInt(nl); /可 换 成 r.getInt(4) String r4=r.getString(xb); String r5=r.getString(bj); System.out.println(r1+t+r2+t+r3+t+r4+t+r5); 数 据 源 名 称 选择和安装JDBC驱动程序 mysql-connector-java-5.1.20-bin.jar MyEclipse添加MySQL JDBC驱动程序包 Project-Properties-Java Build Path-Add ExternalJARS或通过ClassPath进行添加 Java程 序 设 计 实 用 教 程 (第 3版 ) Java程 序 设 计 实 用 教 程 (第 3版 ) 在应用程序中指定JDBC驱动程序public static Class forName(String className) throws ClassNotFoundException 装 载 JDBC-ODBC驱 动 程 序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); 装 载 MySQL驱 动 程 序 Class.forName(“org.gjt.mm.mysql.Driver); Class.forName(com.mysql.jdbc.Driver); 装 载 MS SQLServer驱 动 程 序 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver); Java程 序 设 计 实 用 教 程 (第 3版 ) 1.DriverManager类创建与指定数据库连接public class DriverManager public static Connection getConnection(String url) throws SQLException public static Connection getConnection(String url, String user, String password) throws SQLException JDBC的URL格式:Jdbc:子协议:数据源 Java程 序 设 计 实 用 教 程 (第 3版 ) Connection cn= DriverManager.getConnection(url串 ); 其 中 url串 , 由 各 种 DBMS提 供 。 ( 下 述 )有 关 类 的 说 明 :1. Connection对 象 : 关 联 一 个 数 据 库 , 如 db1.mdb2. DriverManager类 提 供 的 静 态 方 法 getConnection, 它 能 创 建 Connection对 象 与 数 据 库 建 立 连 接 。3. url 是 连 接 字 符 串 , 各 种 DBMS有 自 己 专 用 的 url ,1.DriverManager类 创 建 与 指 定 数 据 库 连 接 class.forName(sun.jdbc.odbc.JdbcOdbcDriver); /加 载 jdbc-odbc驱 动 程 序String url =jdbc:odbc:YourDSN; /准 备 数 据 源 连 接 字 符 串 :String user= sa;String password =;Connection conn = DriverManager.getConnection(url,user,password); JDBC-ODBC桥 接 :Class.forName(“org.gjt.mm.mysql.Driver”); 或Class.forName(com.mysql.jdbc.Driver); String url =“jdbc:mysql:/localhost/testDB?user=sa MySql: Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); /然 后 要 设 置 连 接String url=jdbc:microsoft:sqlserver:/yourserver:port;DatabaseName=yourdatabase;Connection conn= DriverManager.getConnection(url,uername,password); SqlServer:Class.forName(oracle.jdbc.driver.OracleDriver);String url=jdbc:oracle:thin:localhost:1521:oraDB;Connection conn = DriverManager.getConnection(url,system,manager);Oracle;其 它 略 public interface Connection Statement createStatement() throws SQLException; /创建执行SQL的语句对象 Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException; /参数指定结果集属性 void close() throws SQLException; /关闭数据库连接 boolean isClosed() throws SQLException; /判断数据库连接是否已关闭 DatabaseMetaData getMetaData() throws SQLException; /获取所连接数据库的元数据 Java程 序 设 计 实 用 教 程 (第 3版 ) 创 建 Statement对 象使 用 Connection接 口 中 的 方 法 createStatement 例 如 :String url =“jdbc:mysql:/localhost/testDB?user=sa Statement stmt = con.createStatement(); Statement stmt = Connection .createStatement(); public interface DatabaseMetaData String getURL() throws SQLException; /返回连接数据库的URL String getUserName() throws SQLException; /返回数据库的用户名 String getDatabaseProductName() throws SQLException; /返回数据库名称 String getDatabaseProductVersion() throws SQLException; /返回数据库版本号 String getDriverName() throws SQLException; /返回驱动程序名称 String getDriverVersion() throws SQLException; /返回驱动程序版本号【例11.3】 连接指定数据库并获得数据库属性信息。 Java程 序 设 计 实 用 教 程 (第 3版 ) Statement接口及其方法声明如下: public interface Statement int executeUpdate(String sql) throws SQLException; /执行数据定义和数据更新SQL语句 ResultSet executeQuery(String sql) throws SQLException; /执行数据查询SQL语句 boolean execute(String sql) throws SQLException; /执行SQL语句 int getUpdateCount() throws SQLException; /获得数据更新所影响的行数 ResultSet getResultSet() throws SQLException; /获得数据查询结果集 void close() throws SQLException; /关闭语句 Java程 序 设 计 实 用 教 程 (第 3版 ) 执行数据定义和数据更新SQL语句Statement stmt = conn.createStatement(); String sql = INSERT INTO stuinfo (stu_id, stu_name) VALUES (98111041, 李伟);int result = stmt.executeUpdate(sql); /返回影响的行数1执行数据查询SQL语句String sql = SELECT * FROM stuinfo ; ResultSet rset = stmt.executeQuery(sql);执行SQL语句调用execute()方法执行SQL语句;调用getResultSet()方法获得数据查询结果集调用getUpdateCount()方法获得数据更新所影响的行数。【例11.4】 执行插入和删除数据的SQL语句。 Java程 序 设 计 实 用 教 程 (第 3版 ) ResultSet接口存储结果集int getRow() throws SQLException; /当前行位置boolean previous() throws SQLException; boolean next() throws SQLException; /向下一行void beforeFirst() throws SQLException; Java程 序 设 计 实 用 教 程 (第 3版 ) Object getObject(int columnIndex) throws SQLException;Object getObject(String columnName) throws SQLException;/以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。String getString(int columnIndex) throws SQLException;String getString(String columnName) throws SQLException;/以 Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值。例如, while(rset.next() System.out.println(rset.getString(1); Java程 序 设 计 实 用 教 程 (第 3版 ) ResultSet r = stmt.executeQuery(select * from table1);String Sqlcmd= select * from table1ResultSet r ;r= stmt.executeQuery(sqlcmd);或 者接 上 文 , 已 经 建 立 了 Statement 类 的 对 象 stmtP336 之 5 next()方 法 -移 动 记 录 指 针next方 法 来 移 动 指 针 , 每 调 用 一 次 next方 法 , 指 针 下 移 一 行 : public boolean next() 指 针 指 向 最 后 一 行 时 , 再 调 用 next方 法 , 返 回 值 为 false, 表 明结 果 集 已 处 理 完 毕 。 通 常 , 处 理 结 果 集 的 程 序 段 采 用 下 面 的 结 构 : getxxx 取 列 的 方 法 , 其 中 的 xxx 因 不 同 的 列 类 型 不 同例 如 : String r3=getString(“ xm” ); int r4=r.getInt(nl); while ( rs.next ( ) ) /处 理 每 一 结 果 行 处 理 结 果 集 的 程 序 片 段 : String r1=r.getString(xh); /学 号 , 可 换 成 r.getString(1) String r2=r.getString(xm); /姓 名 , 可 换 成 r.getString(2) int r3=r.getInt(nl); /年 龄 , 可 换 成 r.getInt(3) String r4=r.getString(xb); /性 别 , 可 换 成 r.getString(2) String r5=r.getString(bj); /班 级 , 可 换 成 r.getString(2) /jdbc-odbc, 数 据 源 db1.mdbimport java.sql.*;public class exDB0public static void main(String args) throws Exception Class.forName (sun.jdbc.odbc.JdbcOdbcDriver); Connection con=DriverManager.getConnection(jdbc:odbc:db1); Statement stmt = con.createStatement(); ResultSet r = stmt.executeQuery(select * from table1); System.out.println(学 号 t姓 名 t年 龄 t性 别 t班 级 ); while(r.next() String r1=r.getString(xh); String r2=r.getString(xm); int r3=r.getInt(nl); String r4=r.getString(xb); String r5=r.getString(bj); System.out.println(r1+t+r2+t+r3+t+r4+t+r5); r.close(); stmt.close(); con.close(); /关 闭 各 个 对 象 /程 序 结 束 try Class.forName(com.mysql.jdbc.Driver); con = DriverManager.getConnection( jdbc:mysql:/localhost/ShoppingBook10_1“,root, root); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); 注 : 在 实 际 应 用 中 要 进 行 异 常 处 理 , 例 如 : public static void main(String args) throws Exception public interface ResultSetMetaData int getColumnCount() throws SQLException; /返回列数 String getColumnName(int column) throws SQLException; /返回列名 String getColumnTypeName(int column) throws SQLException; /返回列数据类型名 int getColumnDisplaySize(int column) throws SQLException; /返回列所占的最大字符宽度ResultSetMetaData rsmd = resultset.getMetaData(); int columnCount = rsmd.getColumnCount(); /获得列数【例11.5】 使用JTable显示数据查询的结果集。 Java程 序 设 计 实 用 教 程 (第 3版 ) Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException;例如:Statement stmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); Java程 序 设 计 实 用 教 程 (第 3版 ) void updateRow() throws SQLException;void insertRow() throws SQLException;void deleteRow() throws SQLException; Java程 序 设 计 实 用 教 程 (第 3版 ) Java程 序 设 计 实 用 教 程 (第 3版 ) n 目 的 : 设 计 JDBC数 据 库 应 用 程 序 。 要 求 : 了 解 JDBC数 据 库 驱 动 程 序 类 型 , 熟悉 JDBC提 供 的 接 口 和 类 , 掌 握 指 定 驱 动 类型 、 连 接 数 据 库 、 执 行 SQL语 句 、 处 理 结 果集 等 操 作 方 法 , 进 一 步 理 解 Java接 口 机 制 的作 用 。 重 点 : 连 接 数 据 库 、 执 行 SQL语 句 、 处 理 结果 集 。 难 点 : 执 行 SQL语 句 、 处 理 结 果 集 。
展开阅读全文