当前位置: 代码迷 >> Java Web开发 >> 经典的数据库封装类!在使用连接池的情况下,你们的数据库封装类都是如何写的
  详细解决方案

经典的数据库封装类!在使用连接池的情况下,你们的数据库封装类都是如何写的

热度:8545   发布时间:2016-04-10 22:45:35.0
求一个经典的数据库封装类!在使用连接池的情况下,你们的数据库封装类都是怎么写的?
求一个经典的数据库封装类!

在使用连接池的情况下,你们的数据库封装类都是怎么写的?


求一个稳定的

我现在用的不是很稳定。

邮箱:yuyangwxj@163.com

谢谢了!
------解决方案--------------------
package util;

//mysqltest.java
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import com.chinaMobile.model.Customer;

public final class Mysqltest {
protected static Mysqltest inst = null;
private static final String _url = "proxool.xml-pdjc"; // proxool SourceName
// nickName
// 第0处修改去掉一些的成员变量
// Connection conn = null;
// Statement stmt = null;
// PreparedStatement pstmt = null;
// ResultSet rs = null;
private ThreadLocal<Connection> connLocal = new ThreadLocal<Connection>();

// mysqltest
/**
 * 第①处修改 public变成private 不允许外部new mysqltest();单例模式必须的
 */
private Mysqltest() {
// inst.getConnection();
}

/**
 * 第②处修改,外部调用必须要通过这个得到对象,要不然不能new 怎么出来对象呢
 * 
 */

public Mysqltest getMysqltest() {
if (null == inst) {
inst = new Mysqltest();
}
return inst;

}

/**
 * 第③处修改加上ThreadLocal管理conn,
 * 并且conn不能自动提交,因为这里是最原子的地方,所以我们要在上层方法中来做事务,所以conn.setAutoCommit(false);
 * 如果可以加上异常捕获在抛出一个自定义的runtime异常,这样可以在上层对异常进行处理了 参考
 * public class DatabaseException extends RuntimeException {
 * 
 * private Exception nestedException;
 * 
 * public Exception getNestedException() { return nestedException; }
 * 
 * public DatabaseException(Exception e, String msg) { super(msg);
 * nestedException = e; }
 * 
 * }
 * 
 * @return
 * @throws SQLException
 */
// getConn
public Connection getConnection() throws DatabaseException {
Connection conn = connLocal.get();
if (conn == null) {
try {
if (conn == null 
------解决方案--------------------
 conn.isClosed()) {
conn = DriverManager.getConnection(_url);
conn.setAutoCommit(false);//这里的事务不能自动提交
// 放到ThreadLocal里面的对象,可见性仅限于当前线程
connLocal.set(conn);
System.out.println("获得数据库 #" + conn.hashCode());
}
} catch (SQLException e) {
e.printStackTrace();
throw new DatabaseException(e, "不能获得数据库连接");
}
}

return conn;
}

// pstmt conn
/**
 * 第④处 如果sql有参数怎么办,所以修改一下,加上 Object[] params
 * 这里可以不错异常处理,因为我们还不关心这里是否出现了异常,不过管了也不错但是管了就必须抛出自定义的异常,要不然上层程序怎么知道出现异常了呢
 * 关于异常什么时候抛出什么时候捕获,捕获后怎么办请参看百度,谷歌的高效java开发
 * 
 * @param sql
 * @return
 */
public PreparedStatement getPstmt(String sql, Object[] params) {
PreparedStatement pstmt = null;
try {
pstmt = getConnection().prepareStatement(sql);
if (params.length > 0)// 有参数
{
for (int i = 0; i < params.length; i++) {
// params里面参数的顺序,必须符合sql里面的顺序
pstmt.setObject(i + 1, params[i]);
}
}
System.out.println("执行SQL:" + sql);
} catch (SQLException ex) {
System.err.println("sql_data.pstmt:" + ex.getMessage());
}

return pstmt;
}

/**
 * 第⑤处就是我们比较关心的了,发现没有你的getPstmt方法似乎没有用到吧,所以问题就在这里了getConnection().
 * prepareStatement(sql),去掉改成getPstmt 然后因为我们参数有了所以改一下
 *   因为我们去掉了成员变量而pstmt和rs要随用随关闭,如果用这个方法就做不到了,所以我们可以不用这个方法
 * @param sql
 * @return
 */
// pstmt query
public ResultSet pstmtQuery(String sql, Object... params) {
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = getPstmt(sql, params);
rs = pstmt.executeQuery();
//因为要返回rs显然这里关闭不科学,以后的方法我们都是PreparedStatement stmt = getPstmt(sql, params); ResultSet rs = stmt.executeQuery();
            // 都用这个方法代替
// pstmt.close();
//         rs.close();
} catch (SQLException ex) {
System.err.println("sql_data.executeQuery:" + ex.getMessage());
}

return rs;
}

/**
 * 第⑥处修改 因为预编译sql不这个高效所以这个可以去掉了 executeQuery(String sql)
 * 
 * @param sql
 * @return
 */
// query
// public ResultSet executeQuery(String sql)
  相关解决方案