第5章数据库操作本章主要内容:数据库概述JDBC的结构JDBC的驱动程序数据库的连接与操作第5章数据库操作•5.1数据库概述•5.2JDBC技术•5.3连接数据库•5.4操作数据库5.1数据库概述–5.1.1关系模型–5.1.2结构化查询语言SQL5.1.1关系模型•数据库管理系统是管理数据库的系统,它按一定的数据模型组织数据。数据库管理系统采用的数据模型主要有:关系模型、层次模型和网状模型。•关系模型是目前应用最广的数据模型。关系模型中数据的逻辑结构是一张二维表,它由行和列组成。例如学生信息登记表。•关系模型以二维表格(关系表)的形式组织数据库中的数据。通常把关系表的结构称为关系模式。关系模型的基本概念如下所述。•(1)关系•(2)元组•(3)属性•(4)主码•(5)域•(6)分量•(7)关系模式•(8)格式5.1.1关系模型5.1.2结构化查询语言SQL•结构化查询语言SQL是用于操作关系数据库的标准语言,具有数据定义、查询、更新和控制等多种功能,它使用方便、功能丰富、简洁易学。•SQL语言由3部分组成:•(1)数据定义语言(DDL)•(2)数据操纵语言(DML)•(3)数据控制语言(DCL)•SQL语言中最常用的命令:•1.创建数据库CREATEDATABASE•CREATEDATABASE数据库名称•2.创建表CREATETABLE•CREATETABLE表名称(列名数据类型,…)•3.插入数据语句INSERT•INSERTINTO表名[(字段名表)]VALUES(值表)•4.删除数据语句DELETE•DELETEFROM表名[WHERE条件]5.1.2结构化查询语言SQL•5.更新数据语句UPDATE•UPDATE表名SET字段名1=值[,字段名2=值…]•[WHERE条件]•6.数据查询SELECT•SELECT[DISTINCT][别名.]字段名或表达式[AS列标题]•FROM表或视图别名•[WHERE条件]•[GROUPBY分组表达式]•[ORDERBY排序表达式[ASC|DESC]]•SELECT子句虽然复杂,但在实际应用中,几乎不可能同时遇到这么多选项,一般常用的形式是:•SELECT[别名.]字段名或表达式•FROM表或视图别名•[WHERE条件]5.1.2结构化查询语言SQL5.2JDBC技术–5.2.1JDBC介绍–5.2.2JDBC体系结构–5.2.3JDBC驱动程序–5.2.4JDBC接口5.2.1JDBC介绍•JDBC是一种可用于执行SQL语句的JavaAPI(应用程序设计接口),它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。•通过使用JDBC,可以很方便地将SQL语句传送给几乎任何一种数据库,也就是说,开发人员可以不必写一个程序访问Oracle,再写一个程序访问SQLServer。•简单的说,JDBC能实现以下3个功能:•(1)同一个数据库建立连接。•(2)向数据库发送SQL语句。•(3)处理数据库返回的结果。5.2.1JDBC介绍5.2.2JDBC体系结构•JDBC的出现使Java程序对各种数据库的访问能力大大增强。JDBC的体系结构如图所示。•由图中可以看出,JDBC的体系结构有四个组件,分别为应用程序、JDBCAPI、JDBC驱动程序管理器和为各种数据库定制的JDBC驱动程序,提供与不同数据库的透明连接。其中JDBCAPI的作用就是屏蔽不同的数据库间JDBC驱动程序之间的差别,使得程序设计人员有一个标准的、纯Java的数据库程序设计接口,为在Java中访问任意类型的数据库提供技术支持。JDBC驱动程序管理器为应用程序装载数据库驱动程序。JDBC驱动程序与具体的数据库相关,用于建立与数据源的连接,向数据库提交SQL请求。5.2.2JDBC体系结构5.2.3JDBC驱动程序•JDBC驱动程序按其实现方式的不同可以分为四种类型,不同类型的驱动程序有着不一样的使用方法,所以在连接数据库之前,必须选择一种适当的驱动程序。•1.JDBC-ODBC桥•在JDBC刚刚产生时,JDBC-ODBC桥是很有用的。通过JDBC-ODBC桥,开发者可以使用JDBC来访问一个ODBC数据源。JDBC-ODBC桥驱动程序为Java应用程序提供了一种把JDBC调用映射为ODBC调用的方法。5.2.3JDBC驱动程序•2.Java到本地API•该类型的驱动程序把客户机API上的JDBC调用转换为其他数据库管理系统的调用。这也是一种桥驱动程序,它使用Java实现与数据库厂商专有的API的混合形式来提供数据访问。JDBC驱动将标准的JDBC调用转变为对数据库API的本地调用。•该驱动程序的工作原理如图5-3所示。5.2.3JDBC驱动程序•3.JDBC网络纯Java驱动程序•这种类型的驱动程序将JDBC转换为与数据库管理系统无关的网络协议,之后这种协议又被某个服务器转换为一种数据库管理系统协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。•该驱动程序的工作原理如图所示。5.2.3JDBC驱动程序•4.Java到本地数据库协议•该类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这种方式使用一个中间数据库访问服务器,通过这个服务器,可以把Java客户端连接到多个数据库服务器上。该类型的驱动程序最大的好处是省去了在客户端安装任何驱动程序的麻烦,只要在服务器端安装好数据访问中间服务器,中间服务器会负责所有存取数据库时的必要的转换。•该驱动程序的工作原理如图所示。5.2.3JDBC驱动程序•对于以上四类驱动程序的选择,需要考虑构建应用程序的实际需要。一般建议不使用桥驱动程序,即第1、2类驱动程序,它们主要是作为纯Java驱动程序还没有上市之前的过渡方案来使用,效率相对较低,程序的可移植性差。而第3、4类驱动程序是从JDBC访问数据库的首选方法,它们不但使程序的可移植性提高,达到跨平台的目的,还省去了在客户端安装驱动程序的麻烦。5.2.4JDBC接口JDBC的接口分为两个层次,一个是面向程序开发人员的JDBCAPI,另一个是底层的JDBCDriverAPI。•1.面向程序开发人员的JDBCAPI•JDBCAPI被描述成为一组抽象的Java接口,使得应用程序可以对某个数据库打开连接,执行SQL语句并处理结果。•JDBCAPI主要包括以下接口。•1)java.sql.DriverManager•2)java.sql.Connection•3)java.sql.Statement•4)java.sql.ResultSet•2.JDBCDriverAPI•JDBCDriverAPI是面向驱动程序开发商的编程接口。对于大多数数据驱动程序来说,仅实现JDBCAPI提供的抽象类就可以了。也就是说,每个驱动程序都必须提供对于java.sql.Connection、java.sql.Statement、java.sql.PreparedStatement和java.sql.ResultSet等主要接口的实现方法。如果目标DBMS提供有OUT参数的内嵌过程,那么还必须提供java.sql.CallableStatement接口。当java.sql.DriverManager需要为一个特定的数据库URL加载驱动程序时,每个驱动程序就需要提供一个能实现java.sql.Driver接口的类。5.2.4JDBC接口5.3连接数据库–5.3.1JDBC连接SQLServer数据库–5.3.2JDBC-ODBC连接Access数据库5.3.1JDBC连接SQLServer数据库•在JSP中,用户可以使用JDBC-ODBC桥驱动程序连接SQLServer数据库,也可以使用JDBC的驱动程序MicrosoftSQLServer2000DriverforJDBC来直接连接。这里以第二种方法为例介绍JSP与SQLServer数据库的连接。•1.下载并安装JDBC驱动程序•2.加载驱动程序•3.创建指定数据库的URL•4.建立与数据库的连接•5.访问数据库•6.关闭数据库连接,释放资源5.3.2JDBC-ODBC连接Access数据库•由于目前JDBC还不能实现对所有数据库的直接访问,因为不是所有的数据库提供商都提供JDBC驱动程序,例如Access,所以JSP访问Access就只能通过JDBC-ODBC桥,使用ODBC驱动程序实现对数据库的访问。•1.加载驱动程序•在JDBC连接到ODBC数据库之前,必须加载JDBC-ODBC桥的驱动程序,代码如下。•Class.forName(sun.jdbc.odbc.JdbcOdbcDriver)该语句使用了Class类(java.lang包)中的方法forName载入该驱动程序的类“sun.jdbc.odbc.JdbcOdbcDriver”,从而创建了该驱动程序的一个实例。5.3.2JDBC-ODBC连接Access数据库•2.创建数据库连接•加载JDBC-ODBC桥的驱动程序后,就可以连接数据库了。首先创建一个Connection(java.lang包)类的一个实例“conn”,并使用DriverManager方法的getConnection来测试使用“url”指定的数据库连接。创建数据库连接的代码如下。•Stringurl=jdbc:odbc:dataname;Stringuser=;Stringpassword=;conn=DriverManager.getConnection(url,uesr,password);5.3.2JDBC-ODBC连接Access数据库•3.访问数据库•使用Connection类对象的createStatement方法从指定的数据库连接得到一个Statement的实例“stmt”,然后使用这个实例的executeQuery()方法来执行SQL语句,并将查询结果保存到ResultSet对象“rs”中。其代码如下:•stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSetrs=stmt.executeQuery(Stringsql);5.3.2JDBC-ODBC连接Access数据库•4.关闭数据库连接,释放资源•对数据库的访问结束后,及时地关闭ResultSet对象、Statement对象和Connection对象,从而释放所占的资源,实现代码与连接SQLServer一样。5.4操作数据库–5.4.1数据查询–5.4.2数据更新–5.4.3数据删除5.4.1数据查询•在实际应用中,经常需要从数据库中查询某些特定的数据信息,如学号为1002的学生信息、地点在北京的仓库信息等。要实现指定数据信息的查询,需要给出一个参数,然后再利用SQL语句就可以将数据信息从数据库中查询出来。5.4.2数据更新•数据更新操作包括修改数据、添加数据、删除数据。在数据库的维护过程中经常需要修改数据表中的记录信息,如在学生管理系统中要修改学生的姓名、年龄等。通常是通过以下两个步骤来实现数据的更新。•1)创建语句对象•Statementstmt=conn.createStatement(inttype,intconcurrency);•2)执行更新•Stringsql=sqlStatement;•intnumber=stmt.executeUpdate(sql;5.4.3数据删除•在数据库的维护过程中,经常要删除一些已经没用的记录。•【例】删除学生表stu_info中的记录。•本例包括三个JSP页面,程序运行时首先在del_1.jsp页面中选择要删除的学号,程序将选择的id参数提交到del_2.jsp页面,此页面根据传过来的id参数取出该学生的详细信息记录,确定确