Crear clases de manejadores a partir de clases de implementación y su colocación en archivos separados

Puede personalizar de forma independiente las clases de manejador que el entorno de trabajo crea en las clases de implementación que genera para las interfaces de método anotado.

Acerca de esta tarea

Por ejemplo, suponga que desea personalizar la manera en que pureQuery procesa los resultados que un método anotado devuelve para una consulta. En lugar de escribir su propia clase RowHandler desde el principio, puede modificar una clase RowHandler que ya exista en la clase de implementación que el entorno de trabajo ha generado para la interfaz que declara ese método.

Aunque puede modificar la clase de manejador directamente en la clase de implementación, en algunas situaciones es más conveniente editar sólo la clase de manejador.

Con el asistente para Crear Clases de manejador para interfaz, puede separar las clases de manejador de las clases de implementación en las que el entorno de trabajo las ha generado. El entorno de trabajo crea esas clases de manejador en archivos nuevos. El entorno de trabajo también añade anotaciones @Handler a las interfaces.

Procedimiento

Para crear clases de un manejador a partir de una clase de implementación y colocarlas en un archivo separado:

  1. En el Explorador de paquetes, pulse el botón derecho del ratón en el archivo de origen donde está definida la interfaz, y seleccione Desarrollo de acceso a datos > Crear Clases de manejador. Se abrirá Crear Clases de manejador para interfaz.
  2. Utilice los controles del asistente para especificar las clases de manejador que desea crear y dónde desea colocarlas en el proyecto Java™.
  3. Pulse Finalizar. Las clases de manejador aparecen en el proyecto. En la siguiente compilación del proyecto, el entorno de trabajo volverá a generar la clase de implementación y no incluirá las clases de manejador, a menos que haya eliminado la etiqueta @generated de la clase de implementación. La eliminación de esta etiqueta hace que el entorno de trabajo no vuelva a generar la clase de implementación.

Ejemplo

Por ejemplo, suponga que una interfaz contiene este método anotado:
	@Select(sql = "SELECT PRODUCT_NUMBER, BASE_PRODUCT_NUMBER, INTRODUCTION_DATE,"
	               + "  DISCONTINUED_DATE, PRODUCT_TYPE_CODE, PRODUCT_COLOR_CODE, PRODUCT_SIZE_CODE,"
	               + "  PRODUCT_BRAND_CODE, PRODUCTION_COST, GROSS_MARGIN, PRODUCT_IMAGE"
	               + "  FROM GOSALES.PRODUCT")
	Iterator<Product> getProducts();

La clase de implementación para la interfaz contiene una etiqueta @generated y la siguiente clase de manejador para este método:

  public static class GetProductsRowHandler extends BaseRowHandler<Product>
   {
     public Product handle (java.sql.ResultSet rs, Product returnObject) throws java.sql.SQLException
     {
       returnObject = new Product ();
       returnObject.setProduct_number(getInt (rs, 1));
       returnObject.setBase_product_number(getInt (rs, 2));
       returnObject.setIntroduction_date(getTimestamp (rs, 3));
       returnObject.setDiscontinued_date(getTimestamp (rs, 4));
       returnObject.setProduct_type_code(getInt (rs, 5));
       returnObject.setProduct_color_code(getInt (rs, 6));
       returnObject.setProduct_size_code(getInt (rs, 7));
       returnObject.setProduct_brand_code(getInt (rs, 8));
       returnObject.setProduction_cost(getBigDecimal (rs, 9));
       returnObject.setGross_margin(getDouble (rs, 10));
       returnObject.setProduct_image(getString (rs, 11));

       return returnObject;
     }
   }

Después de utilizar el asistente para Crear Clases de manejador para interfaz, el entorno de trabajo crea el archivo GetProductsRowHandler.java para que contenga la clase de manejador. El entorno de trabajo también vuelve a generar la clase de implementación sin la clase de manejador. Puede editar la clase de manejador directamente, sin tener que abrir la clase de implementación para la edición.

En la interfaz, el método contiene ahora una anotación @Handler.

	@Handler(rowHandler=aforementioned.GetProductsRowHandler.class)
	@Select(sql = "SELECT PRODUCT_NUMBER, BASE_PRODUCT_NUMBER, INTRODUCTION_DATE,"
	               + "  DISCONTINUED_DATE, PRODUCT_TYPE_CODE, PRODUCT_COLOR_CODE, PRODUCT_SIZE_CODE,"
	               + "  PRODUCT_BRAND_CODE, PRODUCTION_COST, GROSS_MARGIN, PRODUCT_IMAGE"
	               + "  FROM GOSALES.PRODUCT")
	Iterator<Product> getProducts();

Comentarios