Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29956370
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2009-09-22 09:42:41

心得:
  类似于像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) |
给主人留下些什么吧!~~