这是另一个有争议的主题,但这一次我只搜索简单和有文档记录的答案。场景:
让我们假设下面的方法:
 public static Hashtable<Long, Dog> getSomeDogs(String colName, String colValue) {
  Hashtable<Long, Dog> result = new Hashtable<Long, Dog>();
  StringBuffer sql = null;
  Dog dog = null;
  ResultSet rs = null;
      try {
          sql = new StringBuffer();
          sql.append("SELECT * FROM ").append("dogs_table");
          sql.append(" WHERE ").append(colName).append("='");
          sql.append(colValue).append("'");
          rs = executeQuery(sql.toString());
              while (rs.next()) {
                  dog= new Dog();
                  //...initialize the dog from the current resultSet row
              result.put(new Long(dog.getId()), dog);
              }
          }
     catch (Exception e) {
         createErrorMsg(e);
         result = null; //i wonder....
         }
     finally {
         closeResultSet(rs); //this method tests for null rs and other stuff when closing the rs.
     }
   return result;
 }问题:
对于空ResultSet,
String str = null;System.out.println(str.toString());
,
Layer1 ::执行操作的数据库层:此方法。
Layer2 ::?:构造新Dog对象的某个层: my Dog对象。
Layer3 ::?:我打算对狗的集合做一些事情的某一层: GUI层,主要是用户界面的子层。
根据应用程序流程,如果在第一层发生异常,最好的处理方法是什么?我的想法是:捕捉异常,记录异常,返回一些值。这是最佳实践吗?
曼尼,谢谢你的回答,我期待着看看其他人对这些事情的看法。
发布于 2009-10-09 19:53:16
不要通过连接字符串来构建SQL查询,就像您正在做的那样:
sql = new StringBuffer();
sql.append("SELECT * FROM ").append("dogs_table");
sql.append(" WHERE ").append(colName).append("='");
sql.append(colValue).append("'");这使得您的代码容易受到一种众所周知的安全攻击,即SQL injection。而不是这样做,而是使用PreparedStatement,并通过在其上调用适当的set...()方法来设置参数。注意,您只能使用它来设置列值,而不能像您正在做的那样,使用它来动态构造列名。示例:
PreparedStatement ps = connection.prepareStatement("SELECT * FROM dogs_table WHERE MYCOL=?");
ps.setString(1, colValue);
rs = ps.executeQuery();如果使用PreparedStatement,JDBC驱动程序将自动处理colValue中可能存在的某些字符的转义,因此SQL注入攻击不再有效。
https://stackoverflow.com/questions/1544952
复制相似问题