心得:
类似于像Hiberante之类的进行数据库的封装。我不想再直接使用ResultSet了。
以前的做法是:我在JAVABEAN中直接返回了一个ResultSet出来。然后我在JSP页面中再使用SQL中的这个结果集输出结果对象。
这样的一个不好的地方:JSP本来是View层的东西没有必要跟JAVA。SQL之类的东西打交道的。所以出现了所谓的数据库封装技术。
我在我的JAVABEAN或直接在DAO层将数据库的ResultSet输出进行封装到一个LIST中去!
然后我的JSP页面是可以直接使用LIST来存储数据。进行分离!
我的代码如下:
/**FullName: executeQuery
* Description: 执行SELECT操作,数据库层进行ResultSet的封装
* @param SELECT语句
* @return List
* @author zjltianya
* @create Date : 2009-09-18
* */
@SuppressWarnings("unchecked")
public List executeQuery(String sql) {
List rsall = new ArrayList();
Map rsTree;
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
conn = this.getConnection();
if (dbVersion == "MySQL"){
stmt = conn.createStatement();
}else{
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
}
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
while(rs.next()) {
rsTree = new HashMap(numberOfColumns);
for(int r=1;r rsTree.put(rsmd.getColumnName(r),rs.getObject(r));
}
rsall.add(rsTree);
}
} catch (Exception ex) {
ex.printStackTrace();
}finally{
try{
if(rs!=null)rs.close();
if(stmt!=null)stmt.close();
if(conn!=null)
conn = this.closeConnection(conn);
}catch(Exception e){
e.printStackTrace();
}
}
return rsall;
}
本来的做法是返回一个ResultSet出来的!
现在我将其封装到了JAVA的数据结构中开避内存出来!
调用方式如下:
List list = db.executeQuery("select url_add from url_conf");
for ( int i = 0; i < list.size(); i++ )
{
java.util.Map map = (java.util.Map)list.get(i);
for (java.util.Iterator it = map.keySet().iterator(); it.hasNext();)
{
String column_name = it.next().toString(); // 取值时注意null判断
//System.out.print(column_name);
System.out.print(column_name + " = " + map.get(column_name) == null ? "" : map.get(column_name).toString());
}
}
先接收回来一个LIST对象然后再进行遍历这个LIST对象得到数据了!
以下是一位网友写的原话我转载过来总结学习:
但是很多网友在封装时,却喜欢返回结果集(ResultSet对象),那么这个封装就没有意义了。
1. 又是直接操作核心数据库类,跟封装前几乎没什么变化。
2. 结果集总是依赖于它使用的连接(Connection)对象。因此当连接对象在方法内被关闭后,你返回的ResultSet就没有用了。确实如此。如果想返回ResultSet的话就不能关闭连接)
如果真的要获得查询数据库的结果集,就把结果集对象内的所有数据,转储到以Map为元素的List对象内。
当然,这种方式,不能适应大数据量的查询,不过如果真的碰到大数据量的查询,那用什么封装都不好,还是得直接数据库操作. :)))
第二句话说得有道理。为什么大的网站像阿里巴巴这样的网站使用J2EE效果不是很理想呢。原因我想也是这样的
也有一个原因是JAVA本身的执行效率不是很高 如果要做数据库查询还是用C++写数据库底层这样效率应该会比较高的!
而且一般的网站大的访问量的时候不建议使用数据库封装操作!这样的效率不是很高
阅读(1411) | 评论(0) | 转发(0) |