要求用javabean封装的,能进行基本的查询等操作,并安全释放连接。谢谢了!!

解决方案 »

  1.   

    这是我写的类:/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2006</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    import java.sql.*;
    import javax.naming.*;
    import javax.sql.*;public class nsDatabase {
      private Connection con;
      private Statement stmt;
      private ResultSet rs;
      private int rn;
      private boolean rb;
      static Context ctx;
      static DataSource ds;
      private String sql = " select * from sysobjects ";
      public nsDatabase() {
        try {
          ctx = new InitialContext();
          ds = (DataSource) ctx.lookup("java:comp/env/jdbc/DBconn");
          con = ds.getConnection();      stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                     ResultSet.CONCUR_READ_ONLY);
          rs = stmt.executeQuery(sql);    }
        catch (Exception e) {
          e.printStackTrace();
        }  }  /* 函数功能:创建数据库Statement */
      public void init(Connection con) {
        try {
          stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                     ResultSet.CONCUR_READ_ONLY);
        }
        catch (Exception e) {
          System.out.println("init");
          System.out.println(e.getMessage());
        }
      }  /* 函数功能:关闭数据库连接 */
      public void close() {
        try {
          if (rs != null) {
            rs.close();
          }
        }
        catch (Exception e) {
        }
        try {
          if (stmt != null) {
            stmt.close();
          }
        }
        catch (Exception e) {
        }
        try {
          if (con != null) {
            con.close();
          }
        }
        catch (Exception e) {
          System.out.println("close");
          System.out.println(e.getMessage());
        }
      }  /* 函数功能:获取数据库连接 */
      public Connection getCon(String strDS) {
        try {
          ds = (DataSource) ctx.lookup(strDS);
            con = ds.getConnection();
        }
        catch (Exception e) {
          System.out.println("getCon");
          System.out.println(e.getMessage());
        }
        return con;
      }  /* 函数功能:获取数据结果集 */
      public ResultSet GetResultSet(String strSql) {
        try {
          rs = stmt.executeQuery(strSql);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        return rs;
      }  public int GetResultNum(String strSql) {
        try {
          rn = stmt.executeUpdate(strSql);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        return rn;
      }  public boolean GetResultBool(String strSql) {
        try {
          rb = stmt.execute(strSql);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        return rb;
      }} 在其它的类里面可以这样调用
    import java.sql.*;
    import nsDatabase ;
        nsDatabase db = new nsDatabase();
       String strSql = "select * from Table ";
         ResultSet ResultSet1 = db.GetResultSet(strSql);
        return ResultSet1;
      

  2.   

    你好,happy_day18(宇文梦飞) 
    首先谢谢你的热心,但是我发现你的代码里虽然写了释放数据库连接的函数close,可是并没有调用。那这样,这个连接不是还一直存在吗?其实我想要的关键是正确释放数据库连接,包括在查询后。
      

  3.   

    kevinliuu(@。@) 
    你平时的工作中,是如何封装的,能说说吗?
      

  4.   

    我给你举一个简单的例子
    class UserInfo
    {
    private String id;
    private String name;public void setId(String id)
    {
    this.id=id;
    }public void setName(String name)
    {
    this.name=name ;
    }public String getId()
    {
    return this.id;
    }public String getName()
    {
    return this.name;
    }
    }这个是一个UserInfo实体类,是和数据库中的user表对应的下面我只写查询方法
    public List getAllUser()
    {
    //这里省略了连接和创建PreparedStatement
    ResultSet rs = pst.executeQuery();List list = new ArrayList();
    UserInfo userInfo ;
    while(rs.next())
    {
    userInfo = new UserInfo();
    userInfo.setId(rs.getString("id");
    userInfo.setName(rs.getString("name");list.add(userInfo);
    }close(rs,pst,conn);
    return list;
    }这里假设有一个close()方法,是回收资源的,最后在finally块中关闭(省略了)明白了吗?当然,你可以使用Hibernate,它做的更加完善
      

  5.   

    package zhgl.hua;import java.sql.*;
    import java.util.Properties;
    import java.util.Date;
    import java.text.SimpleDateFormat;public class DBConnection {
      public Connection conn = null;
      public ResultSet rs = null;
      private Statement stmt= null;
      private PreparedStatement pStat = null;
      public void DBConnection() {
        try {
          getConnection();
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }
      }//&raquo;&ntilde;&Egrave;&iexcl;&Ecirc;&yacute;&frac34;&Yacute;&iquest;&acirc;&Aacute;&not;&frac12;&Oacute;&Agrave;à
      public static Connection getConnection() throws SQLException {
        try {
          Class.forName("oracle.jdbc.driver.OracleDriver");
        }
        catch (java.lang.ClassNotFoundException e) {
          System.err.println("&frac14;&Oacute;&Ocirc;&Oslash;&Ccedil;&yacute;&para;&macr;&AElig;÷&Oacute;&ETH;&acute;í&Icirc;ó:" + e.getMessage());
          System.out.print("&frac14;&Oacute;&Ocirc;&Oslash;&Ccedil;&yacute;&para;&macr;&AElig;÷&Oacute;&ETH;&acute;í&Icirc;ó:" + e.getMessage()); //&Ecirc;&auml;&sup3;&ouml;&micro;&frac12;&iquest;&Iacute;&raquo;§&para;&Euml;
        }
        Properties sysProps = new Properties();
        sysProps.put("user", "hua");
        sysProps.put("password", "hua");
        return DriverManager.getConnection(
            "jdbc:oracle:thin:@10.71.200.198:1521:test", sysProps);
      }  public int executeInsert(String sql) {
        int num = 0;
        try {
          conn = getConnection();
          stmt = conn.createStatement();
          num = stmt.executeUpdate(sql);
        }
        catch (SQLException ex) {
          System.err.println("&Ouml;&acute;&ETH;&ETH;&sup2;&aring;&Egrave;&euml;&Oacute;&ETH;&acute;í&Icirc;ó:" + ex.getMessage());
          System.out.print("&Ouml;&acute;&ETH;&ETH;&sup2;&aring;&Egrave;&euml;&Oacute;&ETH;&acute;í&Icirc;ó:" + ex.getMessage()); //&Ecirc;&auml;&sup3;&ouml;&micro;&frac12;&iquest;&Iacute;&raquo;§&para;&Euml;
        }    CloseDataBase();
        return num;
      }  // display data  public ResultSet executeQuery(String sql) {
        rs = null;
        try {
          conn = getConnection();
          pStat = conn.prepareStatement(sql);
          rs = pStat.executeQuery();
        }
        catch (SQLException ex) {
          System.err.println("&Ouml;&acute;&ETH;&ETH;&sup2;é&Ntilde;&macr;&Oacute;&ETH;&acute;í&Icirc;ó:" + ex.getMessage());
          System.out.print("&Ouml;&acute;&ETH;&ETH;&sup2;é&Ntilde;&macr;&Oacute;&ETH;&acute;í&Icirc;ó:" + ex.getMessage()); //&Ecirc;&auml;&sup3;&ouml;&micro;&frac12;&iquest;&Iacute;&raquo;§&para;&Euml;
        }
        return rs;
        //CloseDataBase();
      }  // delete data
      public int executeDelete(String sql) {
        int num = 0;
        try {
          conn = getConnection();
          stmt = conn.createStatement();
          num = stmt.executeUpdate(sql);
        }
        catch (SQLException ex) {
          System.err.println("&Ouml;&acute;&ETH;&ETH;&Eacute;&frac34;&sup3;&yacute;&Oacute;&ETH;&acute;í&Icirc;ó:" + ex.getMessage());
          System.out.print("&Ouml;&acute;&ETH;&ETH;&Eacute;&frac34;&sup3;&yacute;&Oacute;&ETH;&acute;í&Icirc;ó:" + ex.getMessage()); //&Ecirc;&auml;&sup3;&ouml;&micro;&frac12;&iquest;&Iacute;&raquo;§&para;&Euml;
        }
        finally {
          CloseDataBase();
        }
        return num;
      }  //&sup1;&Oslash;±&Otilde;&Ecirc;&yacute;&frac34;&Yacute;&iquest;&acirc;
      public void CloseDataBase() {
        try {
          if (conn != null) {
            conn.close();
          }
        }
        catch (Exception end) {
          System.err.println("&Ouml;&acute;&ETH;&ETH;&sup1;&Oslash;±&Otilde;Connection&para;&Ocirc;&Iuml;ó&Oacute;&ETH;&acute;í&Icirc;ó:" + end.getMessage());
          System.out.print("&Ouml;&acute;&ETH;&ETH;&sup1;&Oslash;±&Otilde;Connection&para;&Ocirc;&Iuml;ó&Oacute;&ETH;&acute;í&Icirc;ó:" + end.getMessage()); //&Ecirc;&auml;&sup3;&ouml;&micro;&frac12;&iquest;&Iacute;&raquo;§&para;&Euml;
        }
      }  //&sup1;&Oslash;±&Otilde;&Ecirc;&yacute;&frac34;&Yacute;&iquest;&acirc;
      public void close(ResultSet rs, PreparedStatement pst, Connection conn) {
        try {
          if (rs != null) {
            rs = null;
          }
          if (pst != null) {
            pst.clearParameters();
          }
          if (conn != null) {
            conn.close();
          }
        }
        catch (Exception end) {
          System.err.println("&Ouml;&acute;&ETH;&ETH;&sup1;&Oslash;±&Otilde;Connection&para;&Ocirc;&Iuml;ó&Oacute;&ETH;&acute;í&Icirc;ó:" + end.getMessage());
          System.out.print("&Ouml;&acute;&ETH;&ETH;&sup1;&Oslash;±&Otilde;Connection&para;&Ocirc;&Iuml;ó&Oacute;&ETH;&acute;í&Icirc;ó:" + end.getMessage()); //&Ecirc;&auml;&sup3;&ouml;&micro;&frac12;&iquest;&Iacute;&raquo;§&para;&Euml;
        }
      }
      //&raquo;&ntilde;&Egrave;&iexcl;&micro;±&Ccedil;°&Ecirc;±&frac14;&auml;×&Ouml;·&ucirc;&acute;&reg;&pound;&not;&Ograve;&Ocirc;yyyy-mm-dd&cedil;&ntilde;&Ecirc;&frac12;·&micro;&raquo;&Oslash;
      public static String getCurrDatetimeStr() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(new Date());
      }
    }
      

  6.   

    回复人:hailang2005()  2006-06-22 15:29:00 对于查询返回rs是不合理的能说说为什么不合理,有什么好的办法也说说可以吗?----------返回rs意味着此次查询,在你使用完rs之前是不能关闭打开该rs的conn的,因为关闭了conn,rs会被强行关闭,你也就取不到数据了也就是你使用rs的这段时间内,内存中不但需要维持一个rs对象(可能有很多条数据),同样要维持一个conn对象,一个preparedstatement对象,试想如果并发很多用户,对资源的消耗是很大的最关键的问题,在使用完rs之后,如果忘记完毕conn,那么很快,你的网站就会用尽连接...所以尽量做到查询完数据后关闭所有资源,向用户返回一个已经包装好的结果集就ok了
      

  7.   

    请教:那我的代码有什么办法改好吗?是不是把结果集给VECTOR再关闭?
      

  8.   

    关键是你怎么使用vector存储数据集的问题
      

  9.   

    看懂了点,你用的list 那我也没想错,就是我的查询是活动的,就像搜索一样。在页面可以有多种组合,那这样就是写的函数会很多啊!命苦啊!谢谢大哥 kevinliuu(@。@) 
      

  10.   

    多谢kevinliuu(@。@) 大哥,原来一直以为用JAVA连数据库并没有想象的那么复杂,在学习C++时,一直以为泛型编程是高手的专利(可能是我水平太菜),没想到,这里却用到了。再次感谢kevinliuu(@。@)
      

  11.   

    package com.huyou.servlet.testgonggao;import java.sql.* ;
    public class DataBaseBean { Connection con = null ;
    ResultSet rs = null ;
    Statement st = null ;

    public DataBaseBean() throws ClassNotFoundException, SQLException
    {
    String user = "" ;
    String password = "" ;
    Class.forName("驱动");
    con = DriverManager.getConnection("URL",user,password) ;
    }

    //以下是进行查询操作
    public ResultSet findAll(String sql) throws SQLException
    {
    st = con.createStatement();
    rs = st.executeQuery(sql);
    return rs ;
    }
    // 以下是进行 插入/更新 的操作
    public void insertOrUpdate(String sql) throws SQLException
    {
    st = con.createStatement() ;
    st.executeQuery(sql) ;
    this.destory() ;
    }
    // 以下是关闭Connection,Statement的方法
    public void destory() throws SQLException
    {
    con.close() ;
    st.close() ;
    }

    // 以下是关闭Connection,Statement,ResultSet的方法
    public void destroy(ResultSet rs) throws SQLException
    {
    this.rs = rs ;
    con.close() ;
    st.close() ;
    rs.close() ;
    }
    }
    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓操作ResultSet是必然的,你可以把ResultSet封装一个类里,也可以放到List,Set或者一个集合里,我认为在页面与数据库操作的中间,应该加一层操作ResultSet。这样可以提高页面与数据库层的效率。最好不要把ResultSet放到页面里。
    我想中间的那层不用我写了吧!