DBUtil与C3P0设计通用查询代码:
public <T> T query(String sql , ResultSetHandler<T> handler, Object ...args ){
Connection conn = null;
PreparedStatement ps=null;
try {
conn = JDBCUtil.getConn();
ps = conn.prepareStatement(sql);
//获取到有几个问号,占位符
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount();
for (int i = 0; i < count; i++) {
//因为不知道是什么类型的数据,所以都使用setObject来对待。
ps.setObject(i+1, args[i]);
}
//执行查询工作, 然后得到结果集
ResultSet rs = ps.executeQuery();
//把结果集丢给调用者,让它去封装数据 ,返回封装数据
T t = (T) handler.handle(rs);
return t;
//问题一: 这里的数据获取,以及封装成上面对象返回。不知道。 因为调用的地方需要的数据不同。
/*while(rs.next()){
rs.getInt("id");
rs.getString("name");
。。。
}*/
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, ps);
}
return null;
}
测试:
@Test
public void testQuery(){
Account account = query("select * from account where id = ?" ,new A() , 3);
}
类A代码:
class A implements ResultSetHandler<Account>{
@Override
public Account handle(ResultSet rs) {
try {
Account account = new Account();
if(rs.next()){
String name = rs.getString("name");
int money = rs.getInt("money");
account.setName02(name);
account.setMoney(money);
}
return account;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
接口ResultSetHandler代码:ResultSetHandler.java
import java.sql.ResultSet;
public interface ResultSetHandler<T> {
/**
* 定义了数据封装的规则。 规范。
* @param <T>
* @param rs
*/
T handle(ResultSet rs);
}
连接数据库C3P0相关代码(JDBCUtil.java)见:https://blog.csdn.net/guanmao4322/article/details/89340669