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

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

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

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

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

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

如果您使用任何ORM工具或以某种方式将数据库字段映射到Java bean,您可以总是:

 public void setFoo(String str){
   this.foo = str!= null?  str:“”;
 }

从SQL角度尝试:

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

使用Beans Binding API将实体对象中的值绑定到SWING Widgets。 Beanins Binding将透明地处理空值,并且不会用空字符串替换null。

我认为你的所有答案都是合理的,但是既然你标记了这个“最佳实践”,我想提醒你的是空对象设计模式。 无论哪个类似乎值得努力,无论什么类需要保护,都要为该类的“null”对象编写特殊的实例化代码。 这个想法是这个“空”对象是真实的,无论你要求它做什么,它都可以表现得恰到好处。 您的null“String”对象可以提供您想要的任何值。

这种模式也意味着您可以摆脱大量的空检查,并且代码更加健壮。 它确实耗尽了一些CPU将消息发送到空值并使它们什么也不做,所以当大部分对象预期为空时,它就不太可取了。

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

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

正如Ruben所说,我会扩展JTextField来覆盖setText()方法并用空字符串替换NULL。

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