Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理数据库中空字符串的最佳实践(Java)_Java_Database_Swing - Fatal编程技术网

处理数据库中空字符串的最佳实践(Java)

处理数据库中空字符串的最佳实践(Java),java,database,swing,Java,Database,Swing,在我的数据库应用程序中,我有时必须处理数据库中的null字符串。在大多数情况下,这是很好的,但是当以某种形式显示数据时,Swing组件(例如使用JTextField)无法处理空字符串。(.setText(null)失败) (EDIT:我刚刚注意到JTextField实际上接受null字符串,但问题仍然存在于所有其他情况下,意外的null值可能导致问题。) 空值没有特殊意义,它们可以(必须)视为空字符串 处理这个问题的最佳做法是什么?不幸的是,我无法更改数据库 在调用setText()之前检查每

在我的数据库应用程序中,我有时必须处理数据库中的
null
字符串。在大多数情况下,这是很好的,但是当以某种形式显示数据时,Swing组件(例如使用
JTextField
)无法处理空字符串。(
.setText(null)
失败)

EDIT:我刚刚注意到
JTextField
实际上接受
null
字符串,但问题仍然存在于所有其他情况下,意外的
null
值可能导致问题。)

空值没有特殊意义,它们可以(必须)视为空字符串

处理这个问题的最佳做法是什么?不幸的是,我无法更改数据库

  • 在调用
    setText()
    之前检查每个值是否为
    null
  • 向每个
    setText()
    调用添加try-catch处理程序
  • 引入一个过滤所有
    null
    字符串的静态方法
  • 从数据库读取后,立即将所有
    null
    值替换为空字符串
  • 。。。[你的建议]

如果可以,为DB中的字段添加一个默认值-空字符串。

如果您使用任何ORM工具或以某种方式将DB字段映射到Java bean,您可以始终拥有:

public void setFoo(String str) { this.foo = str != null ? str : ""; } 公共void setFoo(字符串str){ this.foo=str!=null?str:; } 从SQL的角度尝试:

select ISNULL(column_name,'') from ...

您可以扩展或包装JTextField并覆盖setText()方法以用空字符串替换NULL。

正如鲁本所说,我将扩展JTextField以覆盖setText()方法并用空字符串替换NULL


但是,我也会覆盖getText()方法,用NULL覆盖空字符串,这样当您保存回数据库时,就不会用空字符串覆盖其中的NULL值。

使用bean绑定API将实体对象的值绑定到SWING小部件。Beanins绑定将透明地处理空值,并且不会用空字符串替换空值。

我认为您所有的答案都是合理的,但是由于您将此标记为“最佳实践”,因此我想提醒您空对象设计模式。无论什么样的类需要保护,只要值得付出努力,就为该类的“null”对象编写特殊的实例化代码。这个“空”对象是真实的,无论您要求它做什么,它都可以正常工作。空“String”对象可以提供任何您想要的值


这种模式还意味着您可以摆脱大量的空检查,并且代码更加健壮。将消息发送到null并让它们什么也不做确实会占用一点CPU,因此,当预期大部分对象为null时,这就不太理想了。

是的,这将是最好的,但不幸的是,我无法做到这一点:(将数据写回数据库时一定要小心,因为您将插入一个空字符串而不是空值!我认为这是最好的解决方案,但我将更改getter。(我猜这就是您一直以来的意思)我认为Marko是setter,因为大多数ORM工具(例如hibernate)都使用它来将数据库中的值放入实例中。使用getter时,在使用ORM工具时,您仍然需要小心数据库中的副作用。FWIW,我会将不等式转换为等式测试。这只是另一个最佳实践(或观点,取决于您的看法)。public void setFoo(String str){this.foo=str==null?”:str;}在Oracle上,我不认为这是一个问题。这可能取决于设置,但我们的10g实现将空字符串解释为null。其他DBMS和其他配置可能会有所不同。是的,但实际上是“null”可以是DB中的合法值;>事实上,这就是为什么要包装setText()&getText(),以便可以将null与“”交换为setText,将null与“”交换为getText。有人刚刚记下了这个答案:(.虽然我接受这个问题是关于Java的。这个解决方案可以用来处理数据库中所有意外的空值。正如问题所说的“很遗憾,我不能更改数据库”,这意味着非Java的答案也是可以接受的。