这是另一个有争议的主题,但这次我只搜索简单而有记录的答案.场景: 我们假设以下方法:public static HashtableLong, Dog getSomeDogs(String colName, String colValue) {HashtableLong, Dog result = new Hash...
这是另一个有争议的主题,但这次我只搜索简单而有记录的答案.场景:
我们假设以下方法:
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,或者将生成一个异常,如下所示:
String str = null;
的System.out.println(str.toString());
3.如果在从ResultSet的当前行初始化dog对象时发生了一些不好的事情,例如:连接失败,不兼容的值已经传递给dog属性设置器等等,该怎么办?我现在可能在哈希表中有10个元素,或者没有(第一行).下一步操作是什么:a)返回空哈希表; b)返回结果哈希表,它在这个阶段的方式; c)抛出异常:这里的异常类型是什么?
4.我想你们都会同意这一点:没有什么不好的事情发生,审讯中没有行,将返回空值.但是,@ThorbjørnRavnAndersen说here我应该返回一个NullObject而不是null值.我不知道那是什么.
5.我注意到人们和一群人说应该将应用程序分成几层或某种层次.考虑到上面的例子,这里有哪些层,除了我能想到的这些层:
Layer1 :: Database层,执行操作:此方法.
Layer2 :: ??? :构建新Dog对象的一些层:我的Dog对象.
Layer3 ::? :我打算用狗的集合做一些事情的层:主要是GUI层,或用户界面的子层.
在应用程序流程之后,如果在第一层中发生异常,最好的想法是什么呢?我的想法:捕获异常,记录异常,返回一些值.这是最好的做法吗?
Manny感谢您的回答,我期待着看到其他人对这些问题的看法.
解决方法:
你问五个问题
1. What ways do u suggest on improving this technique of returning some dogs, with some attribute?
实际上有几个.
>你的方法是静态的 – 这并不可怕,但会导致你使用另一个静态的“executeQuery”,这对我来说有点像辛格尔顿……
>“狗”类违反了OO命名惯例 – 复数名词不能成为好的类名,除非该类的一个实例拥有一组东西 – 而且看起来Dogs实际上是“Dog”.
> HashTable几乎全部弃用. HashMap或ConcurrentHashMap提供更好的性能.
>我看不出有理由用多个追加创建查询的第一部分 – 它不错,但它的可读性低于它可能的,所以sql.append(“SELECT * FROM dogs_table WHERE”);如果您只是要对所选列(*)和表名(dogs_table)进行硬编码,那么这将是一个更明智的开端.
2. rs.next() will return false for a null ResultSet, or will generate an exception
这似乎不是一个问题,但是,只要没有任何行要处理,rs.next()就会返回false.
3. What if, while initializing a dog object from the current row of the ResultSet, something bad happens
如果“发生了一些不好的事情”,你接下来要做的就取决于你和你的设计.有宽容的方法(返回你可以的所有行)和不宽容(抛出异常).我倾向于倾向于“无情”的方法,因为使用“宽容”的方法,用户不会知道你没有返回所有存在的行 – 只是你在错误之前得到的所有行.但是可能存在宽容方法的情况.
4. I think u will all agree on this one : nothing bad happens, there are no rows on the interrogation, a null value will be return.
这不是一个明显正确答案的东西.首先,它不是所写方法中发生的事情.它将返回一个空的HashTable(这是“null对象”的意思).其次,在“未找到结果”的情况下,null并不总是答案.
我见过null,但我也看到了一个空结果变量.我声称它们都是正确的方法,但我更喜欢空的结果变量.但是,最好保持一致,所以选择一种返回“无结果”并坚持下去的方法.
5. I’ve noticed people and groups of people saying that one should split the application into layers, or levels of some kind.
这比其他人更难回答,而没有看到你的应用程序的其余部分.
本文标题为:Java和SQL:返回null或抛出异常?
基础教程推荐
- JavaWeb文件上传流程 2022-11-07
- JVM内存增强之逃逸分析 2023-05-19
- java中Javers 比较两个类的差异 2022-11-01
- Spring的同一个服务会加载多次的问题分析及解决方法 2023-06-16
- springboot+mybatis拦截器方法实现水平分表操作 2023-04-07
- Springboot与vue实例讲解实现前后端分离的人事管理系统 2022-12-03
- 出现log.info报红的解决方案 2023-01-18
- JPA之EntityManager踩坑及解决:更改PersistenceContext 2022-10-30
- 七段小代码解决Java程序常见的崩溃场景 2023-01-03
- Java设计模式中的外观模式详解 2023-03-11