2011-02-22 19 views
11

Sto usando MyBatis 3.0.3 e ho problema: alcune colonne nel database hanno nomi con sottolineature e queste colonne devono essere mappati alle proprietà di entità (che sono, naturalmente, in camelCase)colonne MyBatis mappatura

class User { 
    private String first_name; 
    ... 
} 

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

Sfortunatamente non riesco a vedere alcun modo per risolverlo in modo dichiarativo (come avviene in JPA - @Column (name = "first_name")). Potrei creare alias nella clausola select per tali colonne (sush come first_name come firstName e così via), ma anche questo sembra zoppo.

Qualche idea? Grazie.

+1

Guardare negli myBatis @results e annotazioni @result. – DwB

risposta

19

Grazie a DwB. Che hanno contribuito:

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

ps Ma in caso di più query ho bisogno di boilerplate @ Risultati/@ codice risultato per ogni metodo in cui viene restituito entità utente. Nel mio caso ci saranno pochissimi posti quindi non è un problema, ma in generale mi piacerebbe comunque trovare una soluzione più generale.

+3

Penso che tu possa mischiare config e annotazioni xml. Lasciare @Selects nel codice per l'SQL effettivo ma inserire la parte in un file di configurazione xml. La mappa dei risultati deve essere applicata a livello di oggetto/classe (in base allo spazio dei nomi) in modo da non dover specificare @Results su ciascun metodo. – AngerClown

+3

Questa domanda è ora un po 'vecchia ma, per riferimento futuro, forse dare un'occhiata alla mappatura automatica: http://www.mybatis.org/core/sqlmap-xml.html#Auto-mapping. – lsoliveira

+0

È anche possibile utilizzare l'impostazione mapUnderscoreToCamelCase per convertire la denominazione di underscore in camelcase, ref: http://mybatis.github.io/mybatis-3/configuration.html – ozhan

5

Definire una ResultMap nel file UserMapper.xml, e aggiungere queste righe:

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

Nel codice Java, aggiungere @ResultMap annotazione:

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

È possibile utilizzare MyBatis Generator per generare questi codici di base automaticamente .

9

Eduardo Macarron ha suggerito questa funzione sul seguente problema:

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

Secondo la documentazione di MyBatis 3, ora è possibile attraverso un'impostazione descritta in:

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

Fondamentalmente è necessario configurare:

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

Il che significa:

Abilita mappatura automatica di nomi di colonna di database classico A_COLUMN a caso cammello classici nomi di proprietà Java aColumn.

+0

La risposta accettata era corretta quando è stata data una risposta nel 2011. Ma per il bene di chiunque lo veda in futuro, questa risposta sarebbe l'approccio giusto. –

4

Se non ci sono molte colonne, è possibile farlo in questo modo ed evitare ResultMap.

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

per renderlo più leggibile è possibile utilizzare array di stringhe, che MyBatis concanate con spazio extra

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

In primavera annotazioni a base di sottolineatura di configurazione per cammello caso mappatura può essere abilitata attraverso uno SqlSessionFactory personalizzabile In questo modo:

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