1、七 JSP数据库操作,7.1 数据库技术概论,什么是数据库?,通俗地说,数据库就是用于集中存放大量信息的一种软件,这种软件提供了非常强大的功能来管理数据,如信息的查询、修改、增加、删除等。 数据库是非常复杂的软件系统,其复杂程度甚至可比操作系统。将实现数据库功能的软件称为DBMS(Database Management System,数据库管理系统)。,3,数据库的组织结构,数据库表记录字段,4,数据库表间的关联关系,表之间的关联是现实生活中事物之间关联关系的模拟。,主键,外键,5,在实际的数据库设计中,经常使用“自增字段”来作为表的主键。,7.2 结构化查询语言SQL,什么是SQL,SQL(
2、Structured Query Language,结构化查询语言),使用它来从数据库中提取并操作各种数据。,7,SQL命令的分类,SQL命令可以分成以下三类: DML(Data Manipulation Language,数据操作语言):用于检索或修改数据。 DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,例如, 创建、修改或删除数据库对象。 DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。,8,常用的SQL命令,Select:选择数据 Insert:插入数据 Update:更新数据 Delete:
3、删除数据,9,例:使用SSME执行SQL命令,使用“新建查询”命令,在“查询”面板中书写SQL命令。,10,书写完SQL命令之后,可以先检查语法,然后再执行。,检查语法,执行SQL命令,Insert:插入数据,命令格式:insert into 表名(列名列表) values (值列表) 实例:,11,use Clients -指明数据库insert into OrderClient(ClientName,AddressStr,PostCode,Telephone,Email)Values(张三,某省某市某街道某某号, 100081,12345678,SomeO);,Update:更新数据,基本
4、格式update 表名 set 字段名=“字段新值”where 满足条件 实例,12,update OrderClientset AddressStr=无有国乌有省没有市虚空街Where ClientName=张三;,Delete:删除数据,格式:delete from 表名 where 满足条件 实例: delete from OrderClient where ClientName=张三;,13,Select:选择数据,这是最灵活的SQL命令,有许多用法,最基本的格式为:select 表名.列名 from 表名列表where 满足条件 上述基本格式还有许多变化,例如可以使用select命令
5、进行排序和分组等。,14,三种基本关系数据操作,选择:用于选中满足某种条件的数据select * from OrderClient where ClientName Like 张% 投影:只显示记录中的部分字段select ClientName,AddressStr from OrderClient 连接:从两个以上的表中提取记录,注意:三种操作可以自由组合,15,use HappyBookShop select Book.BookName,BookRemark.RemarkContent from Book,BookRemark where Book.BookID=BookRemark.Bo
6、okID And Book.BookName=编程之美:微软技术面试心得,视图,视图是一个虚拟表,可以与真实的表一样使用。其不同之处在于:它的数据是在使用时临时通过执行SQL命令获取的。 基本格式:create view 视图名称as seletct语句 实例:,16,Create view BookNameAndBookRemark as select Book.BookName,BookRemark.RemarkContentfrom Book,BookRemark where Book.BookID=BookRemark.BookID,使用视图,视图可以当成一个表一样用。 实例:,17,
7、use happybookshop select * from BookNameAndBookRemark,存储过程,存储过程类似于传统编程语言中的“函数”。它是一组SQL命令的集合。 基本格式:create procedure 存储过程名(参数列表)asbegin- -各种SQL语句end;,18,创建存储过程,示例:在Clients数据库中创建存储过程,19,create procedure FindCustomerInfo(FirstName VARCHAR(20)=NULL) as beginselect * from OrderClient where ClientName like
8、 %+FirstName +%; end;,执行存储过程,使用exec命令执行存储过程 实例:exec FindCustomerInfo 张,20,统计数据:使用聚集函数,所谓“聚集函数”,其实就是对一组记录进行统计的一些函数:,21,常用的聚集函数,22,聚集函数使用示例统计姓张的客户数量 select count(*) from orderClient where ClientName Like 张+%;,7.3 JDBC概述,23,JDBC是用于执行SQL语句的API类包,由一组用Java语言编写的类和接口组成。JDBC提供了一种标准的应用程序设计接口,通过它可以访问各类关系数据库。,7
9、.3 JDBC概述,25,JDBC的全称为Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。通过JDBC技术,开发人员可以用纯Java语言和标准的SQL语句编写完整的数据库应用程序,并且真正地实现了软件的跨平台性。在JDBC技术问世之前,各家数据库厂商执行各自的一套API,使得开发人员访问数据库非常困难,特别是在更换数据库时,需要修改大量代码,十分不方便。JDBC很快就成为了Java访问数据库的标准。,26,JDBC是一种底层API,在访问数据库时需要在业务逻辑中直接嵌入
10、SQL语句。由于SQL语句是面向关系的,依赖于关系模型,所以JDBC传承了简单直接的优点,特别是对于小型应用程序十分方便。需要注意的是,JDBC不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序,通常情况下使用JDBC完成以下操作: (1)同数据库建立连接; (2)向数据库发送SQL语句; (3)处理从数据库返回的结果。,27,7.4 JDBC的常用接口,28,7.4 JDBC中的常用接口,驱动程序接口Driver驱动程序管理器DriverManager数据库连接接口Connection执行SQL语句接口Statement执行动态SQL语句接口PreparedStatement执行
11、存储过程接口CallableStatement访问结果集接口ResultSet,30,每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类,简称Driver类,在加载Driver类时,应该创建自己的实例并向java.sql.DriverManager类注册该实例。通常情况下通过java.lang.Class类的静态方法forName(String className),加载要连接数据库的Driver类,该方法的入口参数为要加载Driver类的完整包名。成功加载后,会将Driver类的实例注册到DriverManager类中,如果加载失败,将抛出ClassNotFound
12、Exception异常,即未找到指定Driver类的异常。,7.4.1 驱动程序接口Driver,31,java.sql.DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,作用于用户和驱动程序之间,负责跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接。另外,DriverManager类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等工作。成功加载Driver类并在DriverManager类中注册后,DriverManager类即可用来建立数据库连接。,7.4.2 驱动程序管理器DriverManager,32,当调用DriverManager类的g
13、etConnection()方法请求建立数据库连接时,DriverManager类将试图定位一个适当的Driver类,并检查定位到的Driver类是否可以建立连接。如果可以,则建立连接并返回,如果不可以,则抛出SQLException异常。,getConnection()方法有以下3种不同的函数重载形式:,static Connection getConnection(String url) 和一个通过URL指定的数据库建立连接。,33,static Connection getConnection(String url,Properties info) 和一个通过URL指定的数据库建立连接,
14、info提供了一些属性,这些属性里包括了user和password等属性。,static Connection getConnection(String url,String user,String password) 传入参数用户名为user,密码为password,和一个通过URL指定的数据库建立连接。,URL的格式为:jdbc: subprotocol: subname,34,String url=“jdbc:mysql:/localhost/test?user=root,35,java.sql.Connection接口负责与特定数据库的连接,在连接的上下文中可以执行SQL语句并返回结果
15、,还可以通过getMetaData()方法获得由数据库提供的相关信息,例如数据表、存储过程和连接功能等信息。,7.4.3 数据库连接接口Connection,36,37,38,java.sql.Statement接口用来执行静态的SQL语句,并返回执行结果。例如,对于insert、update和delete语句,调用executeUpdate(String sql)方法,而select语句则调用executeQuery(String sql)方法,并返回一个永远不能为null的ResultSet实例。,7.4.4 执行SQL语句接口Statement,39,40,41,java.sql.Pre
16、paredStatement接口继承于Statement接口,是Statement接口的扩展,用来执行动态的sql语句,即包含参数的SQL语句。通过PreparedStatement实例执行的动态SQL语句,将被预编译并保存到PreparedStatement实例中,从而可以反复并且高效地执行该SQL语句。需要注意的是,在通过setXxx()方法为SQL语句中的参数赋值时,必须通过与输入参数的已定义SQL类型兼容的方法,也可以通过setObject()方法设置各种类型的输入参数。,7.4.5 执行动态SQL语句接口PreparedStatement,42,PreparedStatement的使
17、用方法如下:,PreparedStatement ps = connection.prepareStatement(“select * from table_name where id? and (name=? or name=?)“); ps.setInt(1, 1); ps.setString(2, “wgh“); ps.setObject(3, “sk“); ResultSet rs = ps.executeQuery();,43,44,java.sql.CallableStatement接口继承于PreparedStatement接口,是PreparedStatement接口的扩展,用
18、来执行SQL的存储过程。JDBC API定义了一套存储过程SQL转义语法,该语法允许对所有RDBMS通过标准方式调用存储过程。该语法定义了两种形式,分别是包含结果参数和不包含结果参数。如果使用结果参数,则必须将其注册为OUT型参数,参数是根据定义位置按顺序引用的,第一个参数的索引为1。,7.4.6 执行存储过程接口CallableStatement,45,为参数赋值的方法使用从PreparedStatement中继承来的setXxx()方法。在执行存储过程之前,必须注册所有OUT参数的类型;它们的值是在执行后通过getXxx()方法检索的。CallableStatement可以返回一个或多个R
19、esultSet实例。处理多个ResultSet对象的方法是从Statement中继承来的。,46,java.sql.ResultSet接口类似于一个数据表,通过该接口的实例可以获得检索结果集,以及对应数据表的相关信息,例如列名和类型等,ResultSet实例通过执行查询数据库的语句生成。,7.4.7 访问结果集接口ResultSet,47,ResultSet实例具有指向其当前数据行的指针。最初,指针指向第一行记录的前方,通过next()方法可以将指针移动到下一行,因为该方法在没有下一行时将返回false,所以可以通过while循环来迭代ResultSet结果集。在默认情况下ResultSet
20、对象不可以更新,只有一个可以向前移动的指针,因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。如果需要,可以生成可滚动和可更新的ResultSet对象。,48,ResultSet接口提供了从当前行检索不同类型列值的getXxx()方法,均有两个重载方法,可以通过列的索引编号或列的名称检索,通过列的索引编号较为高效,列的索引编号从1开始。对于不同的getXxx()方法,JDBC驱动程序尝试将基础数据转换为与getXxx()方法相应的Java类型,并返回适当的Java类型的值。,49,在JDBC 2.0 API(JDK 1.2)之后,为该接口添加了一组更新方法updateXxx(),均
21、有两个重载方法,可以通过列的索引编号或列的名称指定列,用来更新当前行的指定列,或者初始化要插入行的指定列,但是该方法并未将操作同步到数据库,需要执行updateRow()或insertRow()方法完成同步操作。,50,51,52,7.5 连接数据库,53,54,在对数据库进行操作时,首先需要连接数据库,在JSP中连接数据库大致可以分加载JDBC驱动程序、创建Connection对象的实例、执行SQL语句、获得查询结果和关闭连接等5个步骤。,7.5 连接数据库,加载JDBC驱动程序创建数据库连接执行SQL语句获得查询结果关闭连接,55,try Class.forName(“com.micros
22、oft.jdbc.sqlserver.SQLServerDriver“); catch (ClassNotFoundException e) System.out.println(“加载数据库驱动时抛出异常,内容如下:“);e.printStackTrace(); ,在连接数据库之前,首先要加载要连接数据库的驱动到JVM(Java虚拟机),通过java.lang.Class类的静态方法forName(String className)实现。例如加载SQL Server2000驱动程序的代码为:,7.5.1 加载JDBC驱动程序,56,成功加载后,会将加载的驱动类注册给DriverManager
23、类,如果加载失败,将抛出ClassNotFoundException异常,即未找到指定的驱动类,所以需要在加载数据库驱动类时捕捉可能抛出的异常。,技巧:通常将负责加载驱动的代码放在static块中,这样做的好处是只有static块所在的类第一次被加载时才加载数据库驱动,避免重复加载驱动程序,浪费计算机资源。,57,Connection conn = DriverManager.getConnection( “jdbc:microsoft:sqlserver:/127.0.0.1:1433;DatabaseName=db_database08“, “sa“, “);,java.sql.Drive
24、rManager(驱动程序管理器)类是JDBC的管理层,负责建立和管理数据库连接。通过DriverManager类的静态方法getConnection(String url, String user, String password)可以建立数据库连接,3个入口参数依次为要连接数据库的路径、用户名和密码,该方法的返回值类型为java.sql.Connection。典型代码如下:,7.5.2 创建数据库连接,58,建立数据库连接(Connection)的目的是与数据库进行通信,实现方式为执行SQL语句,但是通过Connection实例并不能执行SQL语句,还需要通过Connection实例创建S
25、tatement实例。Statement实例又分为以下3种类型。,Statement实例:该类型的实例只能用来执行静态的SQL语句;PreparedStatement实例:该类型的实例增加了执行动态SQL语句的功能;CallableStatement对象:该类型的实例增加了执行数据库存储过程的功能。,7.5.3 执行SQL语句,59,通过Statement接口的executeUpdate()或executeQuery()方法,可以执行SQL语句,同时将返回执行结果。如果执行的是executeUpdate()方法,将返回一个int型数值,代表影响数据库记录的条数,即插入、修改或删除记录的条数;如
26、果执行的是executeQuery()方法,将返回一个ResultSet型的结果集,其中不仅包含所有满足查询条件的记录,还包含相应数据表的相关信息,例如,列的名称、类型和列的数量等。,7.5.4 获得查询结果,resultSet.close(); statement.close(); connection.close();,在建立Connection,Statement和ResultSet实例时,均需占用一定的数据库和JDBC资源,所以每次访问数据库结束后,应该及时销毁这些实例,释放它们占用的所有资源。方法是通过各个实例的close()方法,并且在关闭时建议按照以下的顺序:,7.5.5 关闭连
27、接,61,采用上面的顺序关闭的原因在于Connection是一个接口,close()方法的实现方式可能多种多样。如果是通过DriverManager类的getConnection()方法得到的Connection实例,在调用close()方法关闭Connection实例时会同时关闭Statement实例和ResultSet实例。,62,但是通常情况下需要采用数据库连接池,在调用通过连接池得到的Connection实例的close()方法时,Connection实例可能并没有被释放,而是被放回到了连接池中,又被其他连接调用,在这种情况下如果不手动关闭Statement实例和ResultSet实例
28、,它们在Connection中可能会越来越多,虽然JVM的垃圾回收机制会定时清理缓存,但是如果清理得不及时,当数据库连接达到一定数量时,将严重影响数据库和计算机的运行速度,甚至导致软件或系统瘫痪。,7.6 典型JSP数据库连接,63,64,7.6 典型JSP数据库连接,SQL Server 2000数据库的连接Access数据库的连接MySQL数据库的连接,7.6.1 SQL Server 2000数据库的连接,String driverClass=“com.microsoft.jdbc.sqlserver.SQLServerDriver“;,SQL Server 2000数据库的驱动为:,6
29、5,连接SQL Server 2000数据库需要用到的包有msbase.jar,mssqlserver.jar和msutil.jar。连接SQL Server 2000数据库的URL为:,String url = “jdbc:microsoft:sqlserver:/127.0.0.1:1433;DatabaseName=db_database08“;,66,7.6.2 Access数据库的连接,String driverClass=“sun.jdbc.odbc.JdbcOdbcDriver“;,Access数据库的驱动为:,连接Access数据库需要通过JDBC-ODBC方式,不需要引入任何
30、包。连接Access数据库的URL为:,String url = “jdbc:odbc:driver=Microsoft Access Driver (*.mdb);DBQ=E:/db_database08.mdb“;,67,由于在上面的URL中采用的是系统默认的连接Access数据库的驱动Microsoft Access Driver(*.mdb),所以不需要手动配置ODBC驱动;“E:/db_database08.mdb”为Access数据库的绝对存放路径,在实际程序中,可以通过request对象的相关方法获取数据库文件的存放路径。,68,7.6.3 MySQL数据库的连接,String
31、driverClass=“com.mysql.jdbc.Driver“;,MySQL数据库的驱动为:,连接MySQL数据库需要用到的包为mysql-connector-java-3.0.16-ga-bin.jar。连接MySQL数据库的URL为:,String url=“jdbc:mysql:/127.0.0.1:3306/db_database08“;,7.7 数据库操作技术,69,70,在开发Web应用程序时,经常需要对数据库进行操作,最常用的数据库操作技术,包括向数据库查询、添加、修改或删除数据库中的数据,这些操作即可以通过静态的SQL语句实现,也可以通过动态的SQL语句实现,还可以通过
32、存储过程实现,具体采用的实现方式要根据实际情况而定。,7.7 数据库操作技术,查询操作添加操作修改操作删除操作,71,JDBC中提供了两种实现数据查询的方法,一种是通过Statement对象执行静态的SQL语句实现;另一种是通过PreparedStatement对象执行动态的SQL语句实现。由于PreparedStatement类是Statement类的扩展,一个PreparedStatement对象包含一个预编译的SQL语句,该SQL语句可能包含一个或多个参数,这样应用程序可以动态地为其赋值,所以PreparedStatement对象执行的速度比Statement对象快。因此在执行较多的SQ
33、L语句时,建议使用PreparedStatement对象。,7.7.1 查询操作,72,tryStatement sql=con.createStatement();ResultSet rs=sql.executeQuery(“SELECT * FROM 表名”); catch(SQLException e )System.out.println(e); ,tryPrepareStatement sql=con.prepareStatement(“SELECT * FROM 表名”);ResultSet rs=sql.executeQuery(); catch(SQLException e )
34、System.out.println(e); ,73,通过Statement对象和PreparedStatement对象实现数据添加操作的方法同实现查询操作的方法基本相同,所不同的就是执行的SQL语句及执行方法不同,实现数据添加操作时采用的是executeUpdate()方法,而实现数据查询时使用的是executeQuery()方法。实现数据添加操作使用的SQL语句为INSERT语句,其语法格式如下:,Insert INTO table_name(column_list) values(data_values),JDBC中也提供了两种实现数据添加操作的方法,一种是通过Statement对象执行
35、静态的SQL语句实现;另一种是通过PreparedStatement对象执行动态的SQL语句实现。,7.7.2 添加操作,74,75,Statement stmt=conn.createStatement(); int rtn= stmt.executeUpdate(“insert into tb_user (name,pwd) values(hope,111)“);,应用Statement对象向数据表tb_user中添加数据的关键代码如下:,利用PreparedStatement对象向数据表tb_user中添加数据的关键代码如下:,PreparedStatement pStmt = conn
36、.prepareStatement(“insert into tb_user (name,pwd) values(?,?)“); pStmt.setString(1,“dream“); pStmt.setString(2,“111“); int rtn= pStmt.executeUpdate();,76,JDBC中也提供了两种实现数据修改操作的方法,一种是通过Statement对象执行静态的SQL语句实现;另一种是通过PreparedStatement对象执行动态的SQL语句实现。通过Statement对象和PreparedStatement对象实现数据修改操作的方法同实现添加操作的方法基本
37、相同,所不同的就是执行的SQL语句不同。,7.7.3 修改操作,77,实现数据修改操作使用的SQL语句为UPDATE语句,其语法格式如下:,UPDATE table_name SET =.,= WHERE,78,79,Statement stmt=conn.createStatement(); int rtn= stmt.executeUpdate(“update tb_user set name=hope,pwd=222 where name=dream“);,应用Statement对象修改数据表tb_user中name字段值为“dream”的记录,关键代码如下:,利用PreparedSta
38、tement对象修改数据表tb_user中name字段值为“hope”的记录,关键代码如下:,80,说明:在实际应用中,经常是先将要修改的数据查询出来并显示到相应的表单中,然后将表单提交到相应处理页,在处理页中获取要修改的数据,并执行修改操作,完成数据修改。,PreparedStatement pStmt = conn.prepareStatement(“update tb_user set name=?,pwd=? where name=?“);pStmt.setString(1,“dream“);pStmt.setString(2,“111“);pStmt.setString(3,“hop
39、e“);int rtn= pStmt.executeUpdate();,81,实现数据删除操作也可以通过两种方法实现,一种是通过Statement对象执行静态的SQL语句实现;另一种是通过PreparedStatement对象执行动态的SQL语句实现。通过Statement对象和PreparedStatement对象实现数据删除操作的方法同实现添加操作的方法基本相同,所不同的就是执行的SQL语句不同。实现数据删除操作使用的SQL语句为DELETE语句,其语法格式如下:,DELETE FROM WHERE,7.7.4 删除操作,82,Statement stmt=conn.createState
40、ment(); int rtn= stmt.executeUpdate(“delete tb_user where name=hope“);,应用Statement对象从数据表tb_user中删除name字段值为“hope”的数据,关键代码如下:,利用PreparedStatement对象从数据表tb_user中删除name字段值为“dream”的数据,关键代码为:,PreparedStatement pStmt = conn.prepareStatement(“delete from tb_user where name=?“); pStmt.setString(1,“dream“); in
41、t rtn= pStmt.executeUpdate();,7.8 连接池技术,83,84,7.8 连接池技术,连接池简介在Tomcat中配置连接池使用连接池技术访问数据库,7.8.1 连接池简介,所谓连接池,就是预先建立好一定数量的数据库连接,模拟存放在一个连接池中,由连接池负责对这些数据库连接进行管理。,85,这样,就免去了每次在访问数据库之前建立数据库连接的开销。连接池还解决了数据库连接数量限制的问题。由于数据库能够承受的连接数量是有限的,当达到一定程度时,数据库的性能就会下降,甚至崩溃,而池化管理机制,通过有效地使用和调度这些连接池中的连接,则解决了这个问题。,数据库连接池的具体实施办
42、法是:,预先创建一定数量的连接,存放在连接池中;当程序请求一个连接时,连接池是为该请求分配一个空闲连接,而不是去重新建立一个连接;当程序使用完连接后,该连接将重新回到连接池中,而不是直接将连接释放;当连接池中的空闲连接数量低于下限时,连接池将根据管理机制追加创建一定数量的连接;当空闲连接数量高于上限时,连接池将释放一定数量的连接。,87,在每次用完Connection后,要及时调用Connection对象的close()或dispose()方法显式关闭连接,以便连接可以及时返回到连接池中,非显式关闭的连接可能不会添加或返回到池中。,连接池具有下列优点:,创建一个新的数据库连接所耗费的时间主要取
43、决于网络的速度以及应用程序和数据库服务器的(网络)距离,而且这个过程通常是一个很耗时的过程,而采用数据库连接池后,数据库连接请求则可以直接通过连接池满足,而不需要为该请求重新连接、认证到数据库服务器,从而节省了时间;,提高了数据库连接的重复使用率;解决了数据库对连接数量的限制。,连接池中可能存在多个与数据库保持连接但未被使用的连接,在一定程度上浪费了资源;要求开发人员和使用者准确估算系统需要提供的最大数据库连接的数量。,连接池具有下列缺点:,为了使用连接池技术访问数据库,首先要建立数据源配置,下面介绍MySQL数据源的基本配置。,(1) 启动Tomcat,打开浏览器。在地址栏中输入:http:
44、/127.0.0.1:8080/admin/。即打开Tomcat系统管理功能(Tomcat Administration Tool)登录界面。 (2) 输入用户名”admin“和口令”123456”,单击“Login”按钮。进入Tomcat系统管理功能界面。,7.8.2 在Tomcat中配置连接池,90,(3) 单击“Data Sources”链接,显示DataSources管理界面。 (4) 选择”Create New DataSources“选项,可以新建一个数据源,显示MySQL数据源配置界面。 (5) 在JNDI Name属性里输入”jdbc/mysql“,Data Source UR
45、L属性里输入”jdbc:mysql:/localhost:3306/test“,JDBC Driver Class属性里输入”com.mysql.jdbc.Driver“,User Name属性里输入用户名”root“,Password属性里输入密码”123456”,Max.ActiveConnections属性里输入,91,最大活动连接数40,Max.Idle Connections属性里输入最大空闲连接数40,Max Wait for Connection属性里输入最大等待时间5000。 (6) 单击”Save“按钮保存,再单击”Data Sources“管理界面中的”Commit Cha
46、nges“按钮提交所有改变,完成数据源jdbc/mysql的配置工作。 (7) 打开Tomcat的Server.xml配置文件,可以看到其中段已自动加入以下的数据源配置代码。,92,93,94,JDBC2.0提供了javax.sql.DataSource接口,负责与数据库建立连接,在应用时不需要编写连接数据库代码,可以直接从数据源中获得数据库连接。在DataSource中预先建立了多个数据库连接,这些数据库连接保存在数据库连接池中,当程序访问数据库时,只需从连接池中取出空闲的连接,访问结束后,再将连接归还给连接池。DataSource对象由容器(例如Tomcat)提供,不能通过创建实例的方法来获得DataSource对象,需要利用Java的JNDI(Java命名和目录接口)来获得DataSource对象的引用。,7.8.3 使用连接池技术访问数据库,JNDI是一个应用程序设计的API,为开发人员提供了查询和访问各种命名和目录服务的通用的、统一的接口,类似JDBC,都是构建在抽象层上的。JNDI提供了一种统一的方式,可以用在网络上查找和访问JDBC服务中,通过指定一个资源名称,可以返回数据库连接建立所必须的信息。,97,本 章 小 结,了解JDBC技术;掌握JDBC中常用接口的应用、连接及访问数据库的方法典型数据库的连接方法;掌握数据库操作技术以及连接池技术的应用。,