JSP +Tomcat数据库访问
转自:http://www.cnblogs.com/liuzhiyuan/archive/2009/12/05/1617493.html
在一般的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()方法就获得了数据库连接对象。