2011-02-22 17 views
11

estoy usando MyBatis 3.0.3 y tengo un problema: algunas columnas en la base de datos tienen nombres con guiones y estas columnas se asignan a las propiedades de la entidad (que son, por supuesto, en camelCase)columnas de MyBatis mapeo

class User { 
    private String first_name; 
    ... 
} 

public interface UserDao { 
    @Select("SELECT * FROM users") 
    List<User> findAllUsers(); 
} 

Lamentablemente, no veo ninguna forma de resolver eso de manera declarativa (como se hace en JPA - @Column (name = "first_name")). Podría hacer alias en select-clause para tales columnas (sush como first_name como firstName y etc.), pero eso también parece cojo.

¿Alguna idea? Gracias.

+1

mira en el mybatis @Results y anotaciones @result. – DwB

Respuesta

19

Gracias a DwB. Eso ayudó:

@Select("SELECT * FROM users") 
    @Results({ 
     @Result(property = "firstName", column = "first_name"), 
     @Result(property = "lastName", column = "last_name") 
    }) 
    List<User> findUsers(); 

ps Pero en el caso de varias consultas necesito repetitivo @ Código de resultado Resultados/@ para cada método en el que se devuelve entidad Usuario. En mi caso, habrá muy pocos lugares, así que no hay problema, pero en general todavía me gustaría encontrar una solución más general.

+3

Creo que puedes mezclar xml config y anotaciones. Deje @Selects en el código para el SQL real pero ponga la parte en un archivo de configuración xml. El mapa resultante debe ser aplicado al nivel de objeto/clase (basado en el espacio de nombre) para que no tenga que especificar @Results en cada método. – AngerClown

+3

Esta pregunta ahora es un poco antigua, pero, para referencia futura, tal vez eche un vistazo a la asignación automática: http://www.mybatis.org/core/sqlmap-xml.html#Auto-mapping. – lsoliveira

+0

También puede usar la configuración de mapUnderscoreToCamelCase para convertir los nombres de subrayado en camelcase, ref: http://mybatis.github.io/mybatis-3/configuration.html – ozhan

5

definir un ResultMap en el archivo UserMapper.xml, y añadir estas líneas:

<resultMap id="BaseResultMap" type="package.for.User"> 
    <result column="user_name" jdbcType="VARCHAR" property="userName" /> 
    <!-- other columns --> 
</resultMap> 

En su código Java, añadir @ResultMap anotación:

public interface UserDao { 
    @Select("SELECT * FROM users") 
    @ResultMap("BaseResultMap") 
    List<User> findAllUsers(); 
} 

Usted puede utilizar MyBatis Generator para generar estos códigos de base de forma automática .

9

Eduardo Macarron ha sugerido esta función en el problema siguiente:

https://code.google.com/p/mybatis/issues/detail?id=43

De acuerdo con la documentación de MyBatis 3, ahora es posible a través de un entorno descrito en:

http://mybatis.github.io/mybatis-3/configuration.html#settings

Básicamente debe configurar:

<setting name="mapUnderscoreToCamelCase" value="true"/> 

Lo que significa:

Permite la asignación automática de nombres de columna de base de datos clásica A_COLUMN a camel case clásicos nombres de propiedades de Java aColumn.

+0

La respuesta aceptada fue correcta cuando se respondió en 2011. Pero por el bien de cualquiera que lo vea en el futuro, esta respuesta sería el enfoque correcto. –

4

Si no hay tantas columnas, puede hacerlo de esta manera y evitar ResultMap.

@Select("SELECT first_name as firstName, last_name as lastName FROM users") 
List<User> findUsers(); 

para que sea más legible que puede utilizar matriz de cadenas, que mybatis concanate con espacio adicional

@Select({ 
    "SELECT", 
    " first_name as firstName,", 
    " last_name as lastName", 
    "FROM users"}) 
List<User> findUsers(); 
1

En la primavera subrayado configuración basada en la anotación a camello mapeo caso puede ser activado a través de un SqlSessionFactory personalizable , de esta manera:

@Bean 
@Primary 
public SqlSessionFactory sqlSessionFactory() throws Exception { 
    SqlSessionFactory factory = sessionFactoryBuilder().build(); 
    factory.getConfiguration().setMapUnderscoreToCamelCase(true); 
    // other configurations 
    return factory; 
}