求一个经典的数据库封装类!
在使用连接池的情况下,你们的数据库封装类都是怎么写的?
求一个稳定的
我现在用的不是很稳定。
邮箱: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)