下面是我封装的数据库。。大家帮我看看。有什么缺陷。最好详细点。谢谢各位帮我看看。。
package db;import java.io.*;
import java.sql.*;public class db {    public String DBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
    public String ConStr = "jdbc:odbc:shop";
    public String user = "sa";
    public String pw = "sa";
    Connection con = null;
    ResultSet rs = null;    public String getStr(String s) {
        String str = s;
        try {
            byte b[] = str.getBytes("ISO-8859-1");
            str = new String(b);
            return str;
        } catch (Exception e) {
            return null;
        }
    }    public String gb2iso(String qs) {
        try {
            if (qs == null) {
                return "NULL";
            } else {
                return new String(qs.getBytes("gb2312"), "iso-8859-1");
            }
        } catch (Exception e) {
            System.out.println("gb2iso error:" + e.getMessage());
        }
        return "NULL";
    }    public void setDBDriver(String DBDriver) {
        this.DBDriver = DBDriver;
    }    public String getDBDriver() {
        return DBDriver;
    }    public void setConStr(String ConStr) {
        this.ConStr = ConStr;
    }    public String getConStr() {
        return ConStr;
    }    public void setuser(String user) {
        this.user = user;
    }    public String getuser() {
        return user;
    }    public void setpw(String pw) {
        this.pw = pw;
    }    public ResultSet query(String sql) throws Exception {
        try {
            Class.forName(DBDriver).newInstance();
            con = DriverManager.getConnection(ConStr, user, pw);
            Statement st = con.createStatement();
            rs = st.executeQuery(sql);
            return rs;
        } catch (SQLException ex) {
            System.out.println("sql.executeQuery:" + ex.getMessage());
        }
        return null;
    }
public void Close()
    {
        try {
            con.close();
        } catch (SQLException ex) {
        }
    }
    public void update(String sql) throws Exception {
        try {
            Class.forName(DBDriver).newInstance();
            con = DriverManager.getConnection(ConStr, user, pw);
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            con.close();
            st.close();
        } catch (SQLException ex) {
            System.out.println("sql.executeUpdate:" + ex.getMessage());
        }
    }
}

解决方案 »

  1.   

    要说缺陷的话。1。Class.forName(DBDriver).newInstance(); 这个东西调用一次就可以了,每次都执行没啥意思。2.你那些close()应该写在finally{}里保证关闭数据链接,要不前头的出了异常,这个链接就没法释放了con和st的关闭错误也反了,先关闭st再关闭con其他的暂时没看出来。
      

  2.   

     在下初学:是不是可以把Class.forName(DBDriver).newInstance(); 
     con = DriverManager.getConnection(ConStr, user, pw); 
     Statement st = con.createStatement(); 
    这三句写到一个public Statement getStmt()中,
    然后在适当的地方调用。
    public Statement getStmt(){
        try{
            Class.forName(DBDriver).newInstance(); 
            con = DriverManager.getConnection(ConStr, user, pw); 
            Statement st = con.createStatement(); 
        }catch(Exception e){
            return null;
        }
        return st;
    }
            
      

  3.   

    我也是初学者。。我觉得可以把
    Class.forName(DBDriver).newInstance();  
     con = DriverManager.getConnection(ConStr, user, pw);  
    放构造函数中
         Statement st = con.createStatement();  
    这句只读一次行吗?不可以吧。。
    大家还有什么好意见。谢谢楼上的建议。
      

  4.   

    1.
    Class.forName(DBDriver).newInstance();   
     con = DriverManager.getConnection(ConStr, user, pw); 
    放静态块
    static {
    Class.forName(DBDriver).newInstance();   
     con = DriverManager.getConnection(ConStr, user, pw); }
    2.
    ResultSet 不能用全局的
    3.
    [你那些close()应该写在finally{}里保证关闭数据链接,要不前头的出了异常,这个链接就没法释放了 con和st的关闭错误也反了,先关闭st再关闭con]引用楼上的
    4.类名首字母大写。要遵守java规范阿,否则整合到java框架里可能会有问题。
    5.为什么db类里面会有字符转换方法?类的职责不明。应该新建一个类,把这部分分离出去。
    6.return "NULL"; ??????????????????????
    return null;return "";或者比较好
    7.return 语句尽量不要放在try里,这种写法不规范,因为如果finnally里也有会覆盖你try里的return
    8.变量首字母小写,遵守规范
    9.public String gb2iso(String qs) { 
            try { 
                if (qs == null) { 
                    return "NULL"; 
                } else { 
                    return new String(qs.getBytes("gb2312"), "iso-8859-1"); 
                } 
            } catch (Exception e) { 
                System.out.println("gb2iso error:" + e.getMessage()); 
            } 
            return "NULL"; 
        } 
    对于绝对走不到的return 要避免。
    10.貌似少了事务
    11.gb2iso命名不规范
      

  5.   

    query 应该写个回调,ResultSet也是需要关闭的啊.
      

  6.   

    在下新手
    楼主代码中的问题我也总犯啊
    这部分代码应该属于Dao层的可以不写事务控制的吧
    resultSet为什么不能是全局的呢 ?
      

  7.   

    resultSet为什么要搞的到处都是呢写个回调像spring提供的模版那样用起来多爽
      

  8.   

    谢谢你们的建议。小弟初学。能不能给改一下。我刚才看了你们的建议。然后自己改了一下。可总感觉不对。
    比如“[你那些close()应该写在finally{}里保证关闭数据链接,要不前头的出了异常,这个链接就没法释放了 ”
    我不知道查询的那个函数里。最后st   con怎么释放?我闹不明白。好像网站因为这个类出了好多错。各们帮帮我。。
    是不是我要是不关的话。很容易出错?
      

  9.   

    Statement st = con.createStatement();  
    Result rs = ......;
    try {
    // rs调用等
    } catch(Exception e) {
    // 异常处理等
    } finally {
        if (rs != null) {
           try {
               rs.close();
           } catch (SQLException ex) { 
                //Log处理等
                //System.out.println("sql.executeUpdate:" + ex.getMessage()); 
           }
        }
        // 注意,这里statement对象生成了resultset对象,所以关闭的顺序如下(从左到右)result->statement->connection(如果有的话),这是hibernate内部的实现方法,也是jdbc的经典写法。
        if (st != null) {
            try {
               st.close();
            } catch (SQLException ex) { 
                //Log处理等
                //System.out.println("sql.executeUpdate:" + ex.getMessage()); 
            }
        }
    }