使用连接池的方式连接数据库:使用DBUtil连接ORACLE数据库

==================
DBUtil.java:
==================
package blog.util;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
 
import blog.exception.DBException;
 
 
public class DBUtil {
     
    private static DataSource ds = null;
 
    /**
     * 从数据库连接池获得一个数据库连接
     * @return 数据库连接
     * @throws DBException
     */
    public static Connection getConnection() throws DBException {
         
        //用数据库连接池的方式实现,JNDI
        try {
            if(ds == null){        
                Context context = new InitialContext();
                ds = (DataSource) context.lookup("java:comp/env/jdbc/orcl");       
                               
            }
             
            return ds.getConnection();
        } catch (NamingException e) {          
            throw new DBException("数据库连接池查找失败", e);
        } catch (SQLException e) {         
            throw new DBException("获取数据库连接异常", e);
        }
       
    }
     
    public static PreparedStatement getPreparedStatement(Connection conn, String sql) throws DBException {
        PreparedStatement pstmt = null;
        try {
            if (conn != null) {
                pstmt = conn.prepareStatement(sql);
            }
        } catch (SQLException e) {
            throw new DBException("创建执行语句失败", e);
        }
        return pstmt;
    }
 
    /**
     * @Parameters:autoGeneratedKeys - a flag indicating whether auto-generated keys should be returned; one of Statement.RETURN_GENERATED_KEYS or Statement.NO_GENERATED_KEYS
     */
    public static PreparedStatement getPreparedStatement(Connection conn, String sql, int autoGenereatedKeys) throws DBException {
        PreparedStatement pstmt = null;
        try {
            if (conn != null) {
                pstmt = conn.prepareStatement(sql, autoGenereatedKeys);
            }
        } catch (SQLException e) {
            throw new DBException("创建执行语句失败", e);
        }
        return pstmt;
    }
 
    public static Statement getStatement(Connection conn) throws DBException {
        Statement stmt = null;
        try {
            if (conn != null) {
                stmt = conn.createStatement();
            }
        } catch (SQLException e) {
            throw new DBException("创建执行语句失败", e);
        }
        return stmt;
    }
 
    public static ResultSet getResultSet(Statement stmt, String sql) throws DBException {
        ResultSet rs = null;
        try {
            if (stmt != null) {
                rs = stmt.executeQuery(sql);
            }
        } catch (SQLException e) {
            throw new DBException("获得查询结果集失败:" + sql, e);
        }
        return rs;
    }
     
 
    public static void executeUpdate(Statement stmt, String sql) throws DBException {
        try {
            if (stmt != null) {
                stmt.executeUpdate(sql);
            }
        } catch (SQLException e) {
            throw new DBException("更新失败:" + sql, e);
        }
    }
     
    
    public static void executeUpdate(PreparedStatement pstmt) throws DBException {
        try {
            if (pstmt != null) {
                pstmt.executeUpdate();
            }
        } catch (SQLException e) {
            throw new DBException("更新失败", e);
        }
    }
     
 
    /**
     * 归还数据库连接
     * @param conn 数据库连接实例
     * @throws DBException
     */
    public static void close(Connection conn) throws DBException {
        try {
            if (conn != null) {
                conn.close(); //把数据库连接归还到数据库连接池,并不是真正的断开数据库的连接
            }
        } catch (SQLException e) {
            throw new DBException("关闭数据库连接异常", e);
        }
    }
 
    public static void close(Statement stmt) throws DBException {
        try {
            if (stmt != null) {
                stmt.close();
                stmt = null;
            }
        } catch (SQLException e) {
            throw new DBException("关闭数据库语句异常", e);
        }
    }
     
    public static void close(PreparedStatement pstmt) throws DBException {
        try {
            if (pstmt != null) {
                pstmt.close();
                pstmt = null;
            }
        } catch (SQLException e) {
            throw new DBException("关闭数据库语句异常", e);
        }
    }
     
 
    public static void close(ResultSet rs) throws DBException {
        try {
            if (rs != null) {
                rs.close();
                rs = null;
            }
        } catch (SQLException e) {
            throw new DBException("关闭数据库结果集异常", e);
        }
    }
}


==================
DBException .java:
==================
package blog.exception;
 
public class DBException extends Exception {
 
    public DBException() {
        super();
    }
 
    public DBException(String message, Throwable cause) {
        super(message, cause);
    }
 
    public DBException(String message) {
        super(message);
    }
 
    public DBException(Throwable cause) {
        super(cause);
    }
     
}

==================
META-INF下的Context.xml:
==================
<Context reloadable="true">
    <Resource name="jdbc/orcl" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="xzf" password="1234"
    driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@127.0.0.1:1521:orcl">
    </Resource>
</Context>

==================
web .xml:
==================
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
  <resource-ref>
  <res-ref-name>jdbc/orcl</res-ref-name>
  <!--orcl为数据库实例名-->
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
   
</web-app>


posted @ 2012-07-28 11:17  xzf007  阅读(616)  评论(0编辑  收藏  举报