首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java和SQL :返回null还是抛出异常?

Java和SQL :返回null还是抛出异常?
EN

Stack Overflow用户
提问于 2009-10-09 16:57:34
回答 5查看 6.7K关注 0票数 4

这是另一个有争议的主题,但这一次我只搜索简单和有文档记录的答案。场景:

让我们假设下面的方法:

代码语言:javascript
运行
复制
 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;
 }

问题:

  1. 你有什么建议来改进这种带一些属性的狗的归还技术?

对于空ResultSet,

  1. rs.next()将返回false,或者将生成一个异常,如下面的异常:

String str = null;System.out.println(str.toString());

  1. 如果在从ResultSet的当前行初始化dog对象时,发生了一些不好的事情,比如:连接失败,不兼容的值被传递给dog属性设置器,等等?到目前为止,我可能在哈希表中有10个元素,或者没有元素(第一行)。下一步操作是什么: a)返回null哈希表;b)返回结果哈希表,它在此阶段的方式;c)抛出异常:这里的异常类型是什么?

  1. ,我想你们都同意这一点:没有什么不好的事情发生,在询问中没有行,会返回一个空值。然而,@Thorbjørn Ravn Andersen说here应该返回一个NullObject而不是空值。我想知道那是什么。

  1. 我注意到一些人和一群人说,应该把应用程序分成几个层,或者某种级别。考虑到上面的例子,这里有哪些层,除了我能想到的这些层:

Layer1 ::执行操作的数据库层:此方法。

Layer2 ::?:构造新Dog对象的某个层: my Dog对象。

Layer3 ::?:我打算对狗的集合做一些事情的某一层: GUI层,主要是用户界面的子层。

根据应用程序流程,如果在第一层发生异常,最好的处理方法是什么?我的想法是:捕捉异常,记录异常,返回一些值。这是最佳实践吗?

曼尼,谢谢你的回答,我期待着看看其他人对这些事情的看法。

EN

Stack Overflow用户

发布于 2009-10-09 19:53:16

不要通过连接字符串来构建SQL查询,就像您正在做的那样:

代码语言:javascript
运行
复制
sql = new StringBuffer();
sql.append("SELECT * FROM ").append("dogs_table");
sql.append(" WHERE ").append(colName).append("='");
sql.append(colValue).append("'");

这使得您的代码容易受到一种众所周知的安全攻击,即SQL injection。而不是这样做,而是使用PreparedStatement,并通过在其上调用适当的set...()方法来设置参数。注意,您只能使用它来设置列值,而不能像您正在做的那样,使用它来动态构造列名。示例:

代码语言:javascript
运行
复制
PreparedStatement ps = connection.prepareStatement("SELECT * FROM dogs_table WHERE MYCOL=?");
ps.setString(1, colValue);

rs = ps.executeQuery();

如果使用PreparedStatement,JDBC驱动程序将自动处理colValue中可能存在的某些字符的转义,因此SQL注入攻击不再有效。

票数 3
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1544952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档