2008-11-07 11 views
5

En mi aplicación de base de datos a veces tengo que ocuparme de cadenas null en la base de datos. En la mayoría de los casos, esto está bien, pero cuando se trata de mostrar datos en un formato, los componentes Swing, por ejemplo, usando JTextField, no pueden manejar cadenas nulas. (.setText(null) falla)Práctica recomendada para manejar cadenas nulas desde la base de datos (en Java)

(EDIT: Acabo de notar que JTextField realidad acepta una cadena null, pero la pregunta sigue siendo para todos los demás casos en los inesperados null valores pueden conducir a problemas.)

Los valores nulos tienen sin significado especial, pueden (deben) tratarse como cadenas vacías.

¿Cuál es la mejor práctica para resolver este problema? Desafortunadamente no puedo cambiar la base de datos.

  • Comprobación de todos los valores si es null antes de llamar setText()?
  • ¿Agregar un controlador try-catch a cada llamada setText()?
  • Presentamos un método estático que filtra todas las cadenas null?
  • ¿Reemplazar todos los valores null para vaciar cadenas inmediatamente después de leer desde la base de datos?
  • ... [sugerencias]

Respuesta

6

Si está utilizando cualquier herramienta ORM o de alguna manera que asignar los campos de base de datos a la haba de Java puede Allways tener:

 
public void setFoo(String str) { 
    this.foo = str != null ? str : ""; 
} 
+3

¡Tienes que tener cuidado al escribir los datos en la base de datos, ya que insertarás una cadena vacía en lugar del valor NULO! – Ruben

+0

I creo que es la mejor solución, pero cambiaré el getter. (Supongo que eso es lo que querías decir) –

+0

Creo que Marko es el setter ya que es utilizado por la mayoría de las herramientas ORM, por ejemplo hibernate, para poner los valores de la base de datos en las instancias. Cuando use el captador, debe tener cuidado con los efectos secundarios en la base de datos cuando use una herramienta ORM. – Ruben

0

Si es posible, añadir un valor por defecto - cadena vacía - para un campo en el PP.

+0

Sí, eso sería lo mejor, pero desafortunadamente no puedo hacer eso :( –

4

Desde una oportunidad ángulo de SQL:

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

Alguien acaba de marcar esta respuesta :(. Aunque acepto que la pregunta es sobre Java. Esta solución se puede usar para manejar TODOS los valores nulos inesperados de una base de datos, y como la pregunta dice "desafortunadamente no puedo cambiar la base de datos" implica que las respuestas no Java también son aceptables. –

0

Se podría extender o envuelva JTextField y sobrescriba el método setText() para reemplazar NULL con una Cadena vacía.

+0

Sí, pero en realidad "NULL" puede ser valor legal en DB;> – Marko

+0

De hecho, es por eso que ajustará setText() & getText(), para que pueda intercambiar null con " "para setText y viceversa para getText. – Ruben

0

Como Ruben dijo que extendería el JTextField para sobrescribir el método setText() y reemplazar NULL con la cadena vacía.

Sin embargo, también sobrescribiría el método getText() para sobrescribir una cadena vacía con NULL para que cuando esté guardando de nuevo en la base de datos no sobrescriba un valor nulo allí con la cadena vacía.

2

Utilice Beans Binding API para enlazar valores desde los objetos de su entidad a sus SWING Widgets. Beanins Binding manejará transparentemente valores nulos y no reemplazará el nulo con una cadena vacía.

2

Creo que todas sus respuestas son razonables, pero desde que etiquetó estas "mejores prácticas", me gustaría recordarle el patrón de diseño de objeto nulo. Donde quiera que parezca valer la pena el esfuerzo, para cualquier clase que necesite la protección, escriba un código de instanciación especial para un objeto "nulo" de esa clase. La idea es que este objeto "nulo" es real y puede comportarse de forma apropiada sin importar lo que le pidas. Su objeto "String" nulo podría proporcionarle lo que quiera como valor.

Este patrón también significa que puede deshacerse de muchas comprobaciones nulas, y el código es más robusto.Utiliza un poco de CPU enviando mensajes a nulos y haciendo que no hagan nada, por lo que es menos deseable cuando se espera que un gran porcentaje de objetos sea nulo.

Cuestiones relacionadas