J2EE连接数据库集合

来源:互联网 发布:韩国网络爆红拥有65g 编辑:程序博客网 时间:2024/04/26 00:33

http://blog.chinaunix.net/u/20879/showart_220318.html

一、直连接数据库

1 Java 连接 Oralce
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl";  
Connection conn= DriverManager.getConnection(url,user,password);
2 Java 连接 MySQL
Class.forName("org.gjt.mm.mysql.Driver ").newInstance();
String URL = "jdbc:mysql://localhost/test";
Connection conn= DriverManager.getConnection(url,user,password);
3 Java 连接SQLServer
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver ").newInstance();
String URL =” jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
Connection conn= DriverManager.getConnection(url,user,password);
4 Java 连接DB2
Class.forName(“com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String URL =”jdbc:db2://localhost:5000/sample";
Connection conn= DriverManager.getConnection(url,user,password);
5 Java 连接 Infomix
Class.forName("com.informix.jdbc.IfxDriver ").newInstance();
String URL =jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver
Connection conn= DriverManager.getConnection(url,user,password);
6 Java 连接 SyBase
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
7 Java连接 PostgreSQL
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/soft"
Connection conn= DriverManager.getConnection(url,user,password);

二、 tomcat连接数据库(JNDI连接)

1、先在自己应用程序WEB-INF目录下的web.xml添加以下语句:
 <resource-ref>
    <descrtiption>引用资源说明</descrtiption>
    <res-ref-name>引用资源的JNDI名</res-ref-name>
    <res-type>引用资源的类名</res-type>
    <res-auth>管理者(Container)</res-auth><!--Container-容器管理 Application-Web应用管理-->
</resource-ref>
      然后在tomcat目录/conf/server.xml文件里相应的<Context>元素,添加如下子元素:
<Resource name="引用资源的JNDI名" auth="Container" type="javax.sql.DataSource"
 driverClassName="com.pointbase.jdbc.jdbcUniversalDriver(自己的jdbc驱动)"
 url="jdbc:pointbase:server://localhost/acme(数据库连接url)"
 username="root(用户名)" password="root(密码)" maxActive="20(连接池dbcp的相关配置)" maxIdle="10" maxWait="10000"/>
2、例子:以下是我的假设的项目ACMEWeb:
     在相应程序的web.xml里添加
<web-app ....>
     .....
    <resource-ref>
      <res-ref-name>jdbc/AcmeDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
    </resource-ref>
</web-app>
     然后再server.xml里修改:
  <Context path="/ACMEWeb" reloadable="true" docBase="E:/eclipseproject/ACMEWeb" workDir="E:/eclipseproject/ACMEWeb/work">
         <Resource name="jdbc/AcmeDB" auth="Container" type="javax.sql.DataSource" driverClassName="com.pointbase.jdbc.jdbcUniversalDriver" url="jdbc:pointbase:server://localhost/acme" username="root" password="root" maxActive="20" maxIdle="10" maxWait="10000"/>
</Context>
     建议你把上面的内容编写成为一个xml文件,拷到conf/Catalina/<主机名>/文件夹下
------------
<Resource   auth="Container(管理者)"   name="jdbc/DBDeveloper(引用资源的JNDI名)"   type="javax.sql.DataSource(引用资源的类名)"/>  
  <ResourceParams   name="jdbc/DBDeveloper(引用资源的JNDI名)">  
  <parameter>  
  <name>maxActive</name>  
  <value>20</value>  
  </parameter>  
  <parameter>  
  <name>maxIdle</name>  
  <value>10</value>  
  </parameter>  
  <parameter>  
  <name>maxWait</name>  
  <value>-1</value>  
  </parameter>  
       
  <!--   SQL   Server   2000   -->  
  <parameter><name>username</name><value>sa</value></parameter>  
  <parameter><name>password</name><value>enter</value></parameter>  
  <parameter>  
  <name>driverClassName</name>  
  <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value></parameter>  
  <parameter>  
  <name>url</name>  
  <value>jdbc:microsoft:sqlserver://infor:1433;DatabaseName=infordb</value>  
  </parameter>      
       
  <!--   Oracle8i   -->  
  <!--  
  <parameter>  
  <name>factory</name>  
  <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>  
  </parameter>  
  <parameter>  
  <name>driverClassName</name>          
  <value>oracle.jdbc.driver.OracleDriver</value>  
  </parameter>  
  <parameter>  
  <name>url</name>  
  <value>jdbc:oracle:thin:@192.168.0.170:1521:infordb</value>  
  </parameter>  
  <parameter>  
  <name>username</name>  
  <value>system</value>  
  </parameter>  
  <parameter>  
  <name>password</name>  
  <value>manager</value>  
  </parameter>  
  -->  
   
  <!--   DB2   -->  
  <!--  
  <parameter>  
  <name>driverClassName</name>  
  <value>COM.ibm.db2.jdbc.net.DB2Driver</value>  
  </parameter>  
  <parameter>  
  <name>url</name>  
  <value>jdbc:db2://infor/infordb</value>  
  </parameter>  
  <parameter>  
  <name>username</name>  
  <value>db2admin</value>  
  </parameter>  
  <parameter>  
  <name>password</name>  
  <value>db2admin</value>  
  </parameter>  
  -->  
       
  </ResourceParams>
 
--------------------------------------------------------------------------
JNDI是J2EE中一个很重要的标准,通常我们是在EJB编程中用到,
Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面谈一下在Tomcat4.0中配置和使用JNDI的方法
(以通过JNDI连接数据库为例)
假设使用的数据库是mysql,实验例子在TOMCAT_HOME/webapps/DBTest目录中
A.将mysql的JDBC连接库mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中 
B.配置TOMCAT_HOME/conf/serer.xml文件在<Service>段中加入一个Context: 
<Context path="/DBTest" docBase="DBTest"
debug="5" reloadable="true" crossContext="true">
</Context>
这是DBTest的根路径,这是为了在DBTest中使用做准备.
C.在上面加入的<Context>段加入 
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/TestDB"> 
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!-- 最大连接数
-->
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<!-- 最大空闲连接 --> 
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<!-- 最大等待连接 --> 
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<!-- MySQL 连接用户信息 --> 
<parameter>
<name>username</name>
<value>test</value>
</parameter>
<parameter>
<name>password</name>
<value>test</value>
</parameter>
<!-- MySQl驱动 --> 
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<!-- MySQL连接地址 --> 
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/test</value>
</parameter>
</ResourceParams>
我们可以将按照Sample加入,主要修改的是driverClassName,url,和用户帐号;需要强调的是"jdbc/TestDB"就是JDNI要查找的Name. 
D. 在JSP或servlet中使用JNDI查找服务 
下面是在JSP文件中关于JNDI使用的代码(文件名记为UserHandleDB.jsp)
需要注意的是JNDI NAME要在前面加上"java:comp/env/"
<%@ page language="java"%> 
<%@ page import="java.util.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<% 
String jndi_name="java:comp/env/jdbc/TestDB";
String select_user_sql="select userid,name,birthday, email from emp";
String colnames[][]={{"User ID","Name","Birth day","EMail"},
{"userid","name","birthday","email"}};
Vector userSet=new Vector();
Vector columnSet=new Vector();
for(int i=0;i<colnames[0].length;i++){ 
columnSet.add(colnames[0][i]);
}
userSet.add(columnSet);
Context ctx = new InitialContext(); 
if(ctx == null )
throw new Exception("No Context");
DataSource ds = (DataSource)ctx.lookup(jndi_name); 
Connection conn = ds.getConnection(); 
try { 
PreparedStatement psPreparedStatement=conn.prepareStatement(select_user_sql);
ResultSet resultSet = psPreparedStatement.executeQuery();
while(resultSet.next()){
columnSet=new Vector();
for(int i=0;i<colnames[1].length;i++){
columnSet.add(resultSet.getString(colnames[1][i]));
}
userSet.add(columnSet);
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
conn.close();
%>

E. 引用UserHandleDB.jsp(记为ViewTable.jsp)
<html>
<head>
<title>Test Database </title>
<body >
<%@ include file="UserHandleDB.jsp" %>
<table border="1" >
<%
for(int i=0;i<userSet.size();i++){
Vector colSet=(Vector)userSet.get(i);
out.print("<tr>");
for(int j=0;j<colSet.size();j++){
String col=(String)colSet.get(j);
out.print("<td>"+col+"</td>");
}
out.print("</tr>");
}
%>
</table>
</body>
</html>
F. 在web.xml中加入 
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
这里的jdbc/TestDb要和C中Resource段的name匹配
G. 观察结果 
首先确定数据库已经启动,接着启动Tomcat,如果Tomcat启动异常,可能的原因是数据库的JDBC库没有加载
最后打开浏览器,访问 http://localhost:8080/DBTest/ViewTable.jsp就可以看到结果

三,使用框架自带连接数据库

  下面是一段Struts-config.xml配置文件中的数据源配置(使用GenericDataSource数据源实现),你可以更改相应的设置以适合你自己的系统。


<!-- configuration for GenericDataSource wrapper -->
<data-sources>
         <data-source>
           <set-property
                 property="autoCommit"
                 value="false"/>
           <set-property
                 property="description"
                 value="Example Data Source Configuration"/>
           <set-property
                 property="driverClass"
                 value="org.postgresql.Driver"/>
           <set-property
                 property="maxCount"
                 value="4"/>
           <set-property
                 property="minCount"
                 value="2"/>
           <set-property
                 property="password"
                 value="mypassword"/>
           <set-property
                 property="url"
                 value="jdbc:postgresql://localhost/mydatabase"/>
           <set-property
                 property="user"
                 value="myusername"/>
         </data-source>
</data-sources>

使用BasicDataSource数据源实现的配置方案如下:

<data-sources>
        <!-- configuration for commons BasicDataSource -->
        <data-source type="org.apache.commons.dbcp.BasicDataSource">
                <set-property
                  property="driverClassName"
                  value="org.postgresql.Driver" />
                <set-property
                  property="url"
                  value="jdbc:postgresql://localhost/mydatabase" />
                <set-property
                  property="username"
                  value="me" />
                <set-property
                  property="password"
                  value="test" />
                <set-property
                  property="maxActive"
                  value="10" />
                <set-property
                  property="maxWait"
                  value="5000" />
                <set-property
                  property="defaultAutoCommit"
                  value="false" />
                <set-property
                  property="defaultReadOnly"
                  value="false" />
                <set-property
                  property="validationQuery"
                  value="SELECT COUNT(*) FROM market" />
        </data-source>
</data-sources>

  注意,你可以在你的应用系统中定义不止一个数据源,你可以根据需要定义多个数据源,并为它们分别起一个逻辑名(logical name)。这样做可以给你的应用系统提供更好的安全性和可测量性(scalability),你还可以定义一个专用于测试的数据源。

  配置好DataSource以后,你就可以在你的应用系统中使用这些数据源了。下面这段代码演示了怎样在Action类的execute方法中通过这些数据源来生成数据库连接。

public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response)
        throws Exception
{
        DataSource dataSource;
        Connection cnn;

        try
        {
                dataSource = getDataSource(request);
                cnn = dataSource.getConnection();
                // 数据连接已经建立了,你可以做你想做的事情了
        }
        catch (SQLException e)
        {
                getServlet().log("处理数据库连接", e);
        }
        finally
        {
                // 在finally块里包含这些代码
                // 用以保证连接最后会被关闭
                try
                {
                        cnn.close();
                }
                catch (SQLException e)
                {
                        getServlet().log("关闭数据库连接", e);
                }
        }
}

  注意:如果你使用公共的BasicDataSource,你提供给pingQuery属性的查询语句(如果你设置了话)必须至少要能返回一行记录。

例子:SELECT COUNT(*) FROM VALIDTABLE

你可以把VALIDTABLE替换成你的数据库中包含的任何有效的表。
[使用多个数据源]


如果你需要在模块(Module)中使用多于一个的数据源,你可以在配置文件的<data-source>元素里包含一个key属性。

<data-source>
        <data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">
                …属性配置略, 同上…
        </data-source>
        <data-source key="B" type="org.apache.commons.dbcp.BasicDataSource">
                …属性配置略, 同上…
        </data-source>
</data-source>

你代码里,你可以通过这些key获得不同的数据源。代码如下:


try
{
        dataSourceA = getDataSource(request, "A");
        dataSourceB = getDataSource(request, "B");