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

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

求一个经典的数据库封装类!

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

求一个稳定的

我现在用的不是很稳定。

邮箱: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 connLocal = new ThreadLocal();

// 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里面参数的顺序,必须符合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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经典java数据库封装类,package com.bjsxt.shopping.util; import java.sql.*; public class DB { public static Connection getConn() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/shopping?user=root&password=root"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static PreparedStatement prepare(Connection conn, String sql) { PreparedStatement pstmt = null; try { if(conn != null) { pstmt = conn.prepareStatement(sql); } } catch (SQLException e) { e.printStackTrace(); } return pstmt; } public static PreparedStatement prepare(Connection conn, String sql, int autoGenereatedKeys) { PreparedStatement pstmt = null; try { if(conn != null) { pstmt = conn.prepareStatement(sql, autoGenereatedKeys); } } catch (SQLException e) { e.printStackTrace(); } return pstmt; } public static Statement getStatement(Connection conn) { Statement stmt = null; try { if(conn != null) { stmt = conn.createStatement(); } } catch (SQLException e) { e.printStackTrace(); } return stmt; } /* public static ResultSet getResultSet(Connection conn, String sql) { Statement stmt = getStatement(conn); ResultSet rs = getResultSet(stmt, sql); close(stmt); return rs; } */ public static ResultSet getResultSet(Statement stmt, String sql) { ResultSet rs = null; try { if(stmt != null) { rs = stmt.executeQuery(sql); } } catch (SQLException e) { e.printStackTrace(); } return rs; } public static void executeUpdate(Statement stmt, String sql) { try { if(stmt != null) { stmt.executeUpdate(sql); } } catch (SQLException e) { e.printStackTrace(); } } public static void close(Connection conn) { try { if(conn != null) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } } public static void close(Statement stmt) { try { if(stmt != null) { stmt.close(); stmt = null; } } catch (SQLException e) { e.printStackTrace(); } } public static void close(ResultSet rs) { try { if(rs != null) { rs.close(); rs = null; } } catch (SQLException e) { e.printStackTrace(); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值