==================
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:
==================
==================
web .xml:
==================
jdbc/orcl
javax.sql.DataSource
Container