这是另一个有争议的主题,但这次我只搜索简单且记录在案的答案。场景:
让我们假设以下方法:
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.你建议用什么方法来改进这种返回一些具有某些属性的狗的技术?
2。 rs.next() 将为 null ResultSet 返回 false,或者将生成异常,如下所示:
字符串 str = null; System.out.println(str.toString());
3。如果在从 ResultSet 的当前行初始化一个 dog 对象时,发生了一些不好的事情,比如:连接失败,不兼容的值已传递给 dog 属性 setter ,等等?到目前为止,哈希表中可能有 10 个元素,或者没有(第一行)。下一步将是什么:a) 返回 null 哈希表; b) 返回结果哈希表,就是这个阶段的样子; c) 抛出异常:这里的异常类型是什么?
4.我想你们都会同意这一点:没有什么不好的事情发生,审讯没有行,将返回一个空值。然而,@Thorbjørn Ravn Andersen 说 here我应该返回 NullObject 而不是空值。我想知道那是什么。
5.我注意到人们和一群人说应该将应用程序拆分为多个层或某种级别。考虑到上面的例子,这里有哪些层,除了这些我能想到的:
Layer1::执行操作的数据库层:此方法。
第 2 层::??? : 构造新 Dog 对象的某个层:我的 Dog 对象。
第 3 层::? : 我打算对狗的集合做某事的某个层:主要是 GUI 层,或用户界面的子层。
按照应用程序流程,如果在第一层发生异常,最好的想法是如何处理?我的想法:捕获异常,记录异常,返回一些值。这是最佳做法吗?
曼尼感谢您的回答,我期待看到其他人对这些问题的看法。
最佳答案
我会避免以下情况
sql.append("SELECT * FROM ").append("dogs_table");
sql.append(" WHERE ").append(colName).append("='");
sql.append(colValue).append("'");
而是使用 PreparedStatement及其关联的参数设置方法(setString())等。这将防止 colValue 的值有引号和 SQL 注入(inject)攻击(或更一般地, colValue 形成一些 SQL 语法)。
如果集合只是空的,我永远不会返回 null。这似乎非常违反直觉,从客户的角度来看完全出乎意料。
我不建议在错误情况下返回 null,因为您的客户必须明确检查这一点(并且可能会忘记)。如果需要,我会返回一个空集合(这可能类似于您对空对象的评论),或者更有可能抛出异常(取决于情况和严重程度)。异常很有用,因为它会携带一些与遇到的错误相关的信息。 Null 什么也没告诉你。
如果在构建Dog 对象时遇到问题怎么办?我认为这取决于您希望您的应用程序有多健壮和有弹性。返回 Dog 的子集是否有问题,或者它会完全是灾难性的并且您需要报告这个吗?这是一个应用程序要求(过去我必须满足这两种情况 - 尽力而为或全有或全无)。
一些观察。我会用HashMap而不是旧的 Hashtable(同步所有访问,更重要的是,不是一个合适的 Collection - 如果你有一个 Collection 你可以传递它任何其他方法期望 any Collection) 和 StringBuilder出于类似的原因,在 StringBuffer 之上。不是主要问题,但值得了解。
关于Java 和 SQL : return null or throw exception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1544952/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.