在我的数据库应用程序中,我有时必须处理数据库中的null
字符串。在大多数情况下这很好,但是当它以一种形式显示数据时,Swing组件 - 例如使用JTextField
- 无法处理空字符串。 (.setText(null)
失败)
(编辑:我刚注意到JTextField
实际上接受了null
字符串,但问题仍然存在于意外的null
值可导致的所有其他情况问题。)
空值没有特殊含义,它们可以(必须)被视为空字符串。
处理此问题的最佳做法是什么? 不幸的是我无法更改数据库。
null
之前检查每个值是否为setText()
?setText()
电话添加try-catch处理程序?null
字符串的静态方法?null
值替换为空字符串?答案 0 :(得分:6)
如果您正在使用任何ORM工具或以某种方式将数据库字段映射到Java bean,您可以总是:
public void setFoo(String str) { this.foo = str != null ? str : ""; }
答案 1 :(得分:4)
从SQL角度尝试:
select ISNULL(column_name,'') from ...
答案 2 :(得分:2)
使用Beans Binding API将实体对象中的值绑定到SWING Widgets。 Beanins Binding将透明地处理空值,并且不会用空字符串替换null。
答案 3 :(得分:2)
我认为你的所有答案都是合理的,但是既然你标记了这个“最佳实践”,我想提醒你的是空对象设计模式。无论哪个类似乎值得努力,无论什么类需要保护,都要为该类的“null”对象编写特殊的实例化代码。这个想法是这个“空”对象是真实的,无论你要求它做什么,它都可以表现得恰到好处。您的null“String”对象可以提供您想要的任何值。
此模式还意味着您可以摆脱大量的空检查,并且代码更加健壮。它确实耗尽了一些CPU将消息发送到空值并让它们什么也不做,所以当大部分对象预期为空时,它就不太可取了。
答案 4 :(得分:0)
如果可以,请为DB中的字段添加默认值 - 空字符串。
答案 5 :(得分:0)
您可以扩展或包装JTextField并覆盖setText()方法以使用空String替换NULL。
答案 6 :(得分:0)
正如Ruben所说,我会扩展JTextField来覆盖setText()方法并用空字符串替换NULL。
但是我也会覆盖getText()方法以用NULL覆盖空字符串,这样当你保存回数据库时,你不会用空字符串覆盖那里的空值。