JSP +Tomcat 数据库访问
作者:刘志远
在一般的 Web 项目开发中,对数据库的访问是必不可少的,本文主要介绍两种在使用 Tomcat 作为 Web 服务的 JSP 开发中访问数据库的方法,希望能对刚接触 JSP 开发的朋友有所帮助。 用过 .NET 平台的朋友应该知道,项目中需要访问数据库时,直接导入相应的数据库命名空间,写个数据库连接字符串(如数据库名、用户名、密码等)后,则可以很容易的获得数据库连接对象。其实 Java 中访问数据库也差不多是那样,但这对于刚接触 Java 开发环境的朋友来说可能还是比较棘手的:不知道数据库连接信息如何配置,到底要调用哪些对象,以及 JDBC 数据库驱动、 JDBC 数据源、连接池等 是些什么。本文尽量对这些基本问题做个明了的介绍。
微软
Windows
平台提供的统一数据库访问方式是
ODBC
(
Open DataSource Connectivity
),也就是一些
ODBC API(应用程序编程接口)
。访问数据库时,开发者在程序中只需调用
ODBC API
,
ODBC
驱动程序就会将请求转换为特定的数据库调用请求(这个过程比较复杂,但对开发者来说是隐藏的,不必了解这个转换过程是怎样的),就可方便的完成数据库访问操作。
类似
MS
的
ODBC
,
Sun
公司推出了
JDBC
(
Java Database Connectivity
),
JDBC
只是一些描述访问关系数据库的标准
Java
类库的
API
而已,并没有提供访问具体数据库的功能,但它的这些接口却为各数据库厂商提供访问自己数据库的驱动的一个标准,方便他们实现自己的
JDBC
驱动程序类。
JDBC
驱动程序类实现了
JDBC
中定义的各个接口,也就真正提供了访问数据库的功能。
而一般情况下,我们的开发环境
(
如
MyEclips)
并不像
.NET
开发环境那样自带了这些数据库驱动程序类库,所以在开发过程中,我们往往得自己到所使用的关系数据库厂商网站去下载对应的
JDBC
驱动类库
(
.jar
格式,
Oracle
的可直接在
oracle
安装目录的
jdbc
文件夹中的
lib
下找到),再添加到项目中,如放在
WEB-INF
下的
lib
文件夹中。
只
有在程序中包含了数据库的
JDBC
驱动类库才能实现数据库的访问,这一步是非常关键的。
下面笔者就对几种常见的数据库的访问设置及相关内容做个介绍。
首先,由于各数据库厂商提供的 JDBC 驱动类库是不一样的,你可能很自然就想到访问数据时必须写明数据库程序的 JDBC 驱动类名。再者,你的程序要访问的是哪个机器上的数据库,以及具体数据库的名称是什么(一般一个关系数据库软件中可以创建很多数据库),在 Java 中,我们把这几个信息称为数据库的 JDBC URL 。此外,用哪个用户(当然也要提供密码)访问该数据库我们也必须描述。通常,包含了 JDBC 驱动类库,再提供上面的信息就可以很容易的访问数据库了。
常见数据库的
JDBC
驱动类名如下:
数据库
|
数据库
JDBC
驱动类名
|
Oracle
|
oracle.jdbc.driver.OracleDriver
|
SQL Server 2000
|
com.microsoft.jdbc.sqlserver.SQLServerDriver
|
SQL Server 2005
|
com.microsoft.sqlserver.jdbc.SQLServerDriver
|
MySQL
|
com.mysql.jdbc.Driver
|
常见数据库
JDBC URL
的形式如下:
数据库
|
JDBC URL
|
Oracle
|
jdbc:oracle:thin:@localhost:1521:oracle9i
注
:
localhost
:机器名,也可以是
IP
;
oracle9i
:要访问的数据库名
|
SQL Server 2000/2005
|
jdbc:microsoft:sqlserver://localhost:1433;databasename=dbname
|
MySQL
|
jdbc:mysql://localhost:3306/databasename
|
做好上面的准备后,用几行代码就可以访问数据库了。访问数据库的方式又分两种:直接访问和通过数据源连接池访问。下面以访问
Oracle
数据库为例进行介绍,其他数据库都类似。
方法一 直接访问
访问代码如下:
String driverClass =
"oracle.jdbc.driver.OracleDriver"
;
String url =
"jdbc:oracle:thin:@localhost:1521:oracle9i"
;
String username =
"cotte"
;
String password =
"tiger"
;
Class.
forName
(driverClass);
Connection conn = DriverManager.
getConnection
(url, username, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery( "select * from jobs" );
从代码中可以看出,
JDBC
访问数据库是比较简单的,且步骤统一:先调用
Class
类的
forName()
方法指定数据库驱动类型,再调用
DriverManager
类的
getConnection()
方法获得数据库连接对象,接着调用
Connection
对象的
createStatement()
方法获得
Statement
类,通过调用
Statement
类的各种访问数据的方法就可以访问、操作数据库了。这里的
ResultSet
对象包含了从数据库中查询到数据。
方法二 使用 JDBC 数据源和连接池访问数据库
方法一使用的方法还是比较方便的,但用户每次访问数据库时都必须创建一个数据库连接对象,这个过程是要耗费服务器资源和消耗一定的时间的,且一个数据库服务器同时建立的连接数目也是有限的。用户少时不会有多大影响,但如果访问数据库的用户数量较大时这就会成为影响系统性能的一个瓶颈,为解决这个问题,聪明的程序员们想出了 “JDBC 数据源和连接池 ” 方法,从而较好的处理了这个问题,在大型网站开发中往往采用这种方法。
普通数据库访问中,客户程序得到的是物理连接对象,使用完后调用连接对象的
close()
方法关闭连接。而连接池技术则是在一个连接池中先创建多个数据库物理连接,通过数据源来调用连接池中的数据库连接。用户用完数据库连接完后并不会直接关闭连接对象的物理连接,而只是将其释放回连接池,供下个用户使用,这样就就节省了创建连接的时间。
Tomcat 提供了数据源和连接池的实现,我们直接使用就行了。在使用的时候还要明白这个原理: 由于是使用 Tomcat 提供的数据源实现来访问数据库(注意:数据源本身并不提供具体的数据库访问功能,只是作为连接对象的工厂,实际的数据访问操作仍然是由对应数据库的 JDBC 驱动来完成), 这里是 Tomcat 需要 JDBC 驱动,而不再是应用程序需要 JDBC 驱动,所以得先将对应数据库的 JDBC 驱动类库( .jar 格式)拷贝到 Tomcat 目录中的 lib 文件夹下,供 Tomcat 调用。
由于是 Tomcat 来访问数据库,所以在程序中不用写访问数据库的信息,但得先配置(或告知) Tomcat 这些信息。
一般可以在 Tomcat 目录下 \conf\context.xml 文件的 <Context> 元素内添加 <Resource> 元素来配置 JDBC 数据源信息,以 Orcale 为例,其他类似(注意一点的是, 在 Tomcat 下的配置信息对所有 Web 项目程序都有效 )。
< Resource name = "jdbc/oracleds" auth = "Container" type = "javax.sql.DataSource" maxIdle = "30" maxWait = "10000" maxActive = "10" username = "cotte" password = "tiger" driverClassName = "oracle.jdbc.OracleDriver" url = "jdbc:oracle:thin:@127.0.0.1:1521:oracle9i" />
这些属性的含义如下:
键名
|
含义
|
name
|
指定资源相对于
java:comp/env
上下文的
JNDI
名。(可按需修改)
|
auth
|
指定资源的管理者。(默认
Container
即可)
|
type
|
指定资源所属的
Java
类的完整限定名。(默认即可)
|
maxIdle
|
指定连接池中保留的空闲数据库连接的最大数目。(可按需修改)
|
maxWait
|
指定等待一个数据库连接成为可用状态的最大时间,单位毫秒。(可按需修改)
|
username
|
指定连接数据库的用户名。(按读者的具体情况修改)
|
password
|
指定连接数据库的密码。(也是按读者的具体情况修改)
|
driverClassName
|
指定
JDBC
驱动程序类名。(按读者使用的数据库程序修改,具体值可参加前面列的
“
常见数据库的
JDBC
驱动类名
”
)
|
url
|
指定连接数据库的
URL
。(也是按读者使用的情况修改,具体值可参加前面列的
“
常见数据库
JDBC URL
的形式
”
)
|
除了配置
Tomcat
的
context.xml
文件外,也可
在
web
项目的
META-INF
文件夹下新增文件
context.xml
,
其内容和上面的基本一样
,
如下。(因为
Web
程序部署发布时
Tomcat
会自动加载
WEB-INF
下的内容
,也就可以获得这些信息了,
所以和上面的是一样的效果。但要明白一点的是:
这样的配置就只对当前
Web
项目有效,其他项目不能使用这些信息
)
<?
xml
version
=
'1.0'
encoding
=
'utf-8'
?>
<
Context
reloadable
=
"true"
>
<
Resource
name
=
"jdbc/oracleds"
auth
=
"Container"
type
=
"javax.sql.DataSource"
maxIdle
=
"30"
maxWait
=
"10000"
maxActive
=
"10"
username
=
"lzy"
password
=
"lzy"
driverClassName
=
"oracle.jdbc.OracleDriver"
url
=
"jdbc:oracle:thin:@127.0.0.1:1521:oracle9i"
/>
</
Context
>
做好前面的准备后,下面就只需简单的几行访问代码就可以访问数据库了,代码如下:
javax.naming.Context ctx =
new
javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup(
"java:comp/env/jdbc/oracleds"
);
java.sql.Connection conn = ds.getConnection();
java.sql.Statement stmt=conn.createStatement();
java.sql.ResultSet rs = stmt.executeQuery( "select * from jobs" );
其过程与前面的差不多,只是用了
Context
对象的
lookup()
方法找到
DataSource
对象,再用
DataSource
对象的
getConnection()
方法就获得了数据库连接对象。