java数据库编程_第1页
java数据库编程_第2页
java数据库编程_第3页
java数据库编程_第4页
java数据库编程_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java数据库编程 LinboHe 数据库技术 数据库是一门研究数据管理的技术 它开始于本世纪60年代 经过多年的发展 已形成理论体系 成为计算机软件的一个重要分支 数据库是信息管理的基础 任何计算机应用都需要处理大量数据 几乎都少不了数据库的需求 随着网络的应用 远程异地的网络数据库使用也变得越来越重要 为什么要使用数据库 尽管文件系统可以解决不少问题 有些问题是文件系统所无法解决的 如果给文件系统加上这些特性 那么文件系统也就成为了一个数据库 数据的冗余与数据不一致 重复数据多 而且对于分布式 有可能出现数据无法同步的问题 数据访问困难 数据孤立 因为数据存储没有采取同样的格式 使得使用统一的接口访问数据变得不可能 完整性问题 数据的正确性和相容性 原子性问题 就是事务处理 如何保证一个操作的完整性 并发访问 这也是事务处理的一部分 数据库需要应对同时异地对同一个数据操作的可能 安全性问题 主要是数据库访问权限问题 关系型数据库的基本概念 数据库 datebase 按特定方式存储在存储媒体中可共享的相关数据的集合 可以理解为数据的仓库 其组织方式可支持对数据的有效存取 现在的数据库往往由多个表 table 和表之间的关联关系组成的数据的集合 表是一个由若干行 若干列组成的二维的关系结构 其存在形式是一个计算机文件 如 ABC DBF 客户 MDB Total DBC 我们称之为数据库文件或库文件 实体用表来表示 实体之间的关系也用表来表示 表的列称为字段 数据库的概念分层 物理层 定义数据的存储格式 能够涉及这一层的人是数据库软件开发者 逻辑层 定义数据以及数据之间的关系 能够涉及这一层的人是数据库的设计者 视图层 定义最终展现在客户面前的数据的格式 涉及这一层的是数据库客户端的开发者 以及最终的用户 这三层从上到下层层透明 用户不关心数据库结构 数据库设计开发者不关心存储结构 数据模型 什么是数据模型 数据模型是客观事物及其联系的数据描述 数据模型应具有数据的描述和数据联系两方面功能 数据的描述就是指出 模型中包含那些记录类型 并对记录类型进行命名 指明各个记录类型由那些数据构成 并对数据项进行命名 每个数据项均需指明其数据类型和取值范围 数据间联系的描述就是指明 各个不同记录间所存在的联系和联系方式 实体模型 什么是实体模型呢 实体联系模型又称信息模型 是客观事物及其自然联系在人脑中所形成的概念 实体模型和数据模型的关系是什么 数据模型本质上是 信息模型 的数据化表示 从实体模型到数据模型要经历三个领域的演变过程 现实世界 信息世界 数据世界 实体与属性 这是信息世界中广泛使用的两个术语实体 现实世界任何可相互区别的事物 不论是实际存在的东西 还是概念性的东西 或是事物与事物之间的联系 一律统称为实体 属性 实体所具有的性质 统称为属性 实体是靠属性来描述的 实体集同一类型的实体集合称为实体集 域实体中的每个属性 都有一个取值范围 这叫作属性的 域 域可以是整数 实数 字符串等键 key 又称为关键字 它是指在实体属性中 可用于区别实体集中不同个体的那个属性或几个属性的组合 实体间的联系方式 实体之间的联系实际上反映了实体之间的语义关系 联系也是实体 因此它也可以有属性 实体间联系情况比较复杂 就其联系方式来说 我们可把它分为以下三种 1 一对一联系 简记为1 1 2 一对多联系 简记为1 n 3 多对多联系 简记为m n 一对一联系 若两个同型实体集中 一方的一个实体唯一与另一方的一个实体相对应 则称为1 1联系 如下图所示的婚姻关系 一对多联系 若两个不同型的实体集中 一方一个实体对应另一方多个实体 反之另一方一个实体最多只与本方一个实体相对应 称1 n联系 如下图所示 多对多关系 若两不同型实体集中 任何方一个实体都与对方一个或多个实体相对应 称m n联系 如下图学生与课程的关系 多对多模式 需要在A表和B表之间有一个关联表 这个关联表也是 多对多模式 的核心所在 根据关联表是否有独立的业务处理需求 可将其划分为两种细分情况 具备独立的业务处理需求 是一个业务实体对象 因此它具备一些特有的属性 本身不具备独立的业务处理需求 所以也就没有什么特殊的属性 E R图的画法 E R图中包括 实体 属性和联系三种基本图素 习惯上实体用 方框 表示 实体的属性用 椭圆框 表示 联系用 菱形框 表示 E R的设计原则 针对每一用户作出该用户信息的局部E R图 确定该用户视图的实体 属性和联系 能作为属性的就不要作为实体 这样有利于简化E R图 综合局部E R图 产生出总体E R图 在综合的过程中 同名实体只能出现一次 还要去掉不必要的联系 以便消除冗余 最后说明一点 一个系统的E R图不是唯一的 强调不同的侧面作出的E R图可能有很大的不同 例 设某企业信息系统有下列用户 人事科处理职工档案 供应科处理采购业务 总务科处理仓库业务 生产科处理产品业务 试根据上述要求设计出能反映所有用户信息视图的总体E R图 人事科视图 供应科视图 生产科视图 总务科视图 总体E R图 综合后的E R图中去掉了一些联系 又增添了一些新联系 这是允许的 导出关系模型 E R图仅是现实世界的纯粹反映 与数据库具体实现毫无关系 但它是构造数据模型的依据 下面给出从E R图出发导出关系模型的原则 原则一 对于E R图中每个实体 都应转换为一个关系 该关系应包括对应实体的全部属性 并应根据关系所表达的语义确定哪个属性作为 主键 键在关系模型中是实现联系的主要手段原则二 对于E R图中的联系 情况比较复杂 要根据实体联系方式的不同 采取不同的手段加以实现 数据库语言 数据库语言通常由两个部分组成 1 DDL 数据定义语言 2 DML 数据操纵语言 最常用的数据库语言就是SQL 数据库设计要点 主键与外键一般而言 一个实体不能既无主键又无外键 主键与外键的设计 在全局数据库的设计中 占有重要地位 主键是实体的高度抽象 主键与外键的配对 表示实体之间的连接 键可以是一无物理意义的数字串 由程序自动加1来实现 也可以是有物理意义的字段名或字段名的组合 不过前者比后者好 当PK是字段名的组合时 建议字段的个数不要太多 多了不但索引占用空间大 而且速度也慢 通俗地理解三个范式第一范式 1NF是对属性的原子性约束 要求属性具有原子性 不可再分解 第二范式 2NF是对记录的惟一性约束 要求记录有惟一标识 即实体的惟一性 第三范式 3NF是对字段冗余性的约束 即任何字段不能由其他字段派生出来 它要求字段没有冗余 没有冗余的数据库设计可以做到 但是 没有冗余的数据库未必是最好的数据库 有时为了提高运行效率 就必须降低范式标准 适当保留冗余数据 三少原则一个数据库中表的个数越少越好 只有表的个数少 才能说明系统的E R图少而精 去掉了重复的多余的实体 形成了对客观世界的高度抽象 一个表中组合主键的字段个数越少越好 因为主键的作用 一是建主键索引 二是做为子表的外键 所以组合主键的字段个数少了 不仅节省了运行时间 而且节省了索引存储空间 一个表中的字段个数越少越好 只有字段的个数少了 才能说明在系统中不存在数据重复 且很少有数据冗余 JavaJDBC JDBC JavaDataBaseConnectivity java数据库连接 是一种用于执行SQL语句的JavaAPI 可以为多种关系数据库提供统一访问 它由一组用Java语言编写的类和接口组成 JDBC提供了一种基准 据此可以构建更高级的工具和接口 使数据库开发人员能够编写数据库应用程序 同时 JDBC也是个商标名 ThetypeofJDBC Type1 JDBC ODBCbridge要求客户端必须安装ODBC驱动执行效率比较低 对于那些大数据量存取的应用是不适合的适用于快速的原型系统 没有提供JDBC驱动的数据库如Access DesktopDatabase Type2 JavatonativeAPI这种驱动比起JDBC ODBC桥执行效率略有提高 但是 它仍然需要在客户端加载数据库厂商提供的代码库 这样就不适合基于internet的应用 Type3 JavatoNet适合那种需要同时连接多个不同种类的数据库并且对并发连接要求高的应用 Type4 JavatoNativeDatabase最高的性能 通过自己的本地协议直接与数据库引擎通信 JDBC与数据库驱动程序 JDBC为多种关系数据库提供了统一访问方式 作为特定厂商数据库访问API的一种高级抽象 它主要包含一些通用的接口类 真正的数据库访问操作实现是由各自数据库厂商提供的 通常把厂商提供的特定于数据库的访问API称为数据库JDBC驱动程序 JDBC通过提供一个抽象的数据库接口 使得程序开发人员在编程时可以不用绑定在特定数据库厂商的API上 大大增加了应用程序的可移植性 在实际运行过程中程序代码通过JDBC访问数据库时 仍旧需要调用特定于数据库的访问API JDBC访问数据库层次结构 为了让JDBC与平台无关 JDBC提供所谓的 驱动程序管理器 drivermanager 它会动态维护所有 数据库查询 所需要的驱动程序对象使用Class forName 进行装载 向驱动管理器注册 创建数据库连接 分为以下几步 首先注册数据库驱动程序然后根据具体的JDBCURL地址 调用DriverManager对象的getConnection 来获取一个代表数据库连接的java sql connection对象 JDBCURL的格式如下 jdbc 子协议 数据库定位器 MySQL数据库 jdbc mysql 机器名 数据库名Oracle数据库 jdbc oracle thin 机器名 端口名 数据库名jdbc sqlserver localhost 1433 databaseName Graduate 给定具体的JDBCURL 获取数据库连接的方法是在DriverManager对象上调用getConnection 这种方法有两种形式 DriverManager getConnection url DriverManager getConnection url user password 其中第二种方式需要输入用户名和密码信息进行身份认证 连接数据库示例 JDBC对数据库执行SQL java sql Statement对象代表一条发送到数据库执行的SQL语句 有三种Statement对象 Statement对象用于执行不带参数的简单SQL语句 PreparedStatement对象用于执行带或不带参数的预编译SQL语句CallableStatement对象用于执行对数据库存储过程的调用 Statement Statement对象提供了三种执行SQL语句的方法 executeQuery 用于产生单个结果集的sql 如select语句 executeUpdate 用于执行insert delete update createtable droptable等 execute 用于执行返回多个结果集 多个更新计数或二者组合的语句 多数程序员不会需要该高级功能 PreparedStatement PreparedStatement实例包含已编译的SQL语句 这也是将其命名冠以 Prepared 的原因 包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数 IN参数的值在SQL语句创建时未被指定 相反的 该语句为每个IN参数保留一个问号 作为占位符 每个问号的值必须在该语句执行之前通过适当的setXXX 方法来提供 由于PreparedStatement对象已预编译过 所以其执行速度要快于Statement对象 因此多次执行的SQL语句经常创建为PreparedStatement对象 以提高效率 PreparedStatement接口也有自己的executeQuery executeUpdate和execute方法 Statement对象本身不包含SQL语句 因而必须给Statement execute方法提供SQL语句作为参数 PreparedStatement对象并不将SQL语句作为参数提供给这些方法 因为它们已经包含预编译SQL语句 CallableStatement 调用存储过程将常用的或很复杂的工作 预先用SQL语句写好并用一个指定的名称存储起来 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时 只需调用execute 即可自动完成命令 存储过程的优点 存储过程只在创造时进行编译 以后每次执行存储过程都不需再重新编译 而一般SQL语句每执行一次就编译一次 所以使用存储过程可提高数据库执行速度 当对数据库进行复杂操作时 如对多个表进行Update Insert Query Delete时 可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用 存储过程可以重复使用 可减少数据库开发人员的工作量安全性高 可设定只有本地用户才具有对指定存储过程的使用权 Statement接口的比较 关闭JDBC资源 首先关闭记录集 其次关闭Statement 最后关闭连接对象 例 if rs null try rs close catch SQLExceptione e printStackTrace if stm null try stm close catch SQLExceptione e printStackTrace if con null try con close catch SQLExceptione e printStackTrace 元数据与异常 元数据异常 元数据 元数据 描述数据的数据 开发IDE工具 中间件服务器开发人员需要重点掌握 对于普通的应用系统开发者 只需了解即可 DatabaseMetaData接口 用于提供关于数据库的整体综合信息 DatabaseMetaDatadmd conn getMetaData DatabaseMetaData 整个数据库的元数据数据库版本 名称数据库驱动程序的版本 名称数据库支持的操作 事务隔离级别 结果集支持的类型等 ResultSetMetaData 用于描述结果集本身的信息 表结构 包括有哪些字段 字段的类型等信息 即可用于获取关于ResultSet对象中列的类型和属性信息的对象 ResultSetMetaDatarsmd rs getMetaData 异常 SQLException 致命性的错误 如 表不存在等 主键重复等 intgetErrorCode MySQL 1062DB2 803Oracle 1 Vendorspecific依赖于具体的数据库厂商 返回数据库厂商特定的错误代码 SQLExceptiongetNextException 检索到此SQLException对象的异常链 如果不存在 则返回null StringgetSQLState 依赖于规范 返回SQL99或者XOPEN中规定的错误代码 出现SQLException的情况 网络连接失败SQL语句存在语法错误不支持的函数调用引用不存在的字段插入主键相同的行其他SQLWarning 非致命性的错误 提供关于数据库访问警告信息的异常 很多时候无需程序员处理 是SQLException类的子类 抛出SQLWarning之后数据库操作是否成功 与特定的数据库Driver相关 事务处理 WhatisTransactionJDBCAPI中使用事务处理步骤并发控制 WhatisTransaction 事务处理 一系列的动作作为一个不可分解的操作 ACID属性 AtomicConsistentIsolatedDurable1 原子性ALL NOTHING事务中包含的程序作为数据库的逻辑工作单位 它所做的对数据修改操作要么全部执行 要么完全不执行 2 一致性事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态 这种特性称为事务的一致性 假如数据库的状态满足所有的完整性约束 就说该数据库是一致的 3 分离性分离性指并发的事务是相互隔离的 即一个事务内部的操作及正在操作的数据必须封锁起来 不被其它企图进行修改的事务看到 4 持久性持久性意味着当系统或介质发生故障时 确保已提交事务的更新不能丢失即一旦一个事务提交 DBMS保证它对数据库中数据的改变应该是永久性的 耐得住任何系统故障 持久性通过数据库备份和恢复来保证 JDBCAPI中使用事务处理步骤 默认是自动提交 每发送一条SQL语句都是自动提交的 1 用false作为参数调用ConnectionsetAutoCommit方法 2 执行一或多个关于数据库的操作 3 调用commit方法完成改变 4 如果发生错误 恢复上次提交后的改变 调用rollback方法 5 用true作为参数调用setAutoCommit方法 恢复自动提交事务开关 ConnectionPool 存放Connection对象的容器 减少连接数据库的开销 程序请求连接时 在ConnectionPool中取连接 连接使用完后 放回ConnectionPool 不释放 ConnectionPool对连接进行管理 计数 监控连接状态 JNDI JNDI JavaNamingandDirectoryInterface 能够提供注册和访问远程服务的API 相应的API在javax naming包中 JNDIAPI为应用程序提供了一种统一的访问远程服务的方式 使用JNDIAPI 应用程序能够通过指定一个逻辑的名称来访问一个DataSource 当然可以是其他类型的远程对象 对象 DataSource WhatisDataSource 二种数据库连接的方式 Wh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论