Propiedades de mapeo de MyBatis a columnas de bases de datos al insertar y actualizar (usando anotaciones)

StackOverflow https://stackoverflow.com/questions/5369884

  •  27-10-2019
  •  | 
  •  

Pregunta

Estoy empezando a aprender mybatis y me pregunto, cuando estoy creando consultas de inserción o actualización, ¿hay alguna forma de hacer que los nombres de propiedades un poco más amigables con la refactorización? Explicaré con más detalle:

Tengo constantes en todas mis clases de dominio que se pueden usar para hacer referencia a los nombres de las propiedades. En mi opinión, reduce los errores tipográficos y hace que la refactorización sea un poco más fácil.

public static final String FIRST_NAME = "firstName";
private String firstName = "";

Cuando creo una declaración de selección mybatis usando anotaciones, puedo hacer algo como esto:

@Select("SELECT ID, FIRST_NAME, LAST_NAME FROM CUSTOMERS WHERE ID = #{id}")
@Results({
    @Result(property = CustomerDetail.ID, column = "ID"),
    @Result(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
    @Result(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
CustomerDetail selectById(final int id);

Si refactoro mi objeto de dominio (CustomerDetail) y cambio los nombres de las propiedades, termina siendo bastante simple.

Sin embargo, cuando creo una declaración de inserción myBatis usando anotaciones, tengo que hacer algo como esto:

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME) VALUES (#{id}, #{firstName}, #{lastName})")
void insertCustomerDetail(final CustomerDetail customerDetail);

En este caso, si refactoro mi objeto de dominio (CustomerDetail) y cambio los nombres de las propiedades, es mucho más propenso a errores. ¿Hay alguna manera de usar mis constantes sin recurrir a un montón de concatenación de cuerdas? ¿Es algo que me preocupa?

Como novato total, esperaba que las anotaciones @insert y @update imiten la estructura de la anotación @select. Por ejemplo (tenga en cuenta que las siguientes anotaciones mybatis no son válidas):

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME)")
@Params({
    @Param(property = CustomerDetail.ID, column = "ID"),
    @Param(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
    @Param(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
void insertCustomerDetail(final CustomerDetail customerDetail);

¿Me he perdido alguna opción que tenga el mismo efecto que mi muestra anterior? Alternativamente, ¿es posible que pruebe unitaria mapeos mybatis para asegurarse de que nadie esté utilizando nombres de propiedades que no existan en mis objetos de dominio? Las pruebas pueden ser una mejor solución, ya que también se aplicaría a las asignaciones basadas en XML. ¿Pensamientos?

¿Fue útil?

Solución

¿Es algo que me preocupa?

No me parece. Entiendo su preocupación, y veo cómo tal característica podría ser beneficiosa para usted, especialmente temprano en el desarrollo cuando PoJo tiende a cambiar con tanta frecuencia.

No creo que sus campos de objetos se refactoren lo suficiente como para justificar la inversión necesaria para proporcionar esta funcionalidad.

Te sugiero que leas sobre la etiqueta @param en el Guía del usuario de MyBatis. No es exactamente lo que estás buscando aquí, pero es una forma de desacoplar los nombres de campo de los objetos a las variables de mapa SQL MyBatis SQL. En mi mente, adoptaría su enfoque sobre pasar en Feild individuales con un @param.

En lo que respecta a las pruebas unitarias de sus mapas SQL, estoy bastante seguro de que si usa una expresión de OGNL que no tiene un método GET correspondiente en el objeto, obtendrá excepciones. es decir, si usa #{somefield}, y el objeto en el que pase no tiene un método getSomefield (), entonces obtiene una excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top