2011-02-22 51 views
11

私はMyBatisの3.0.3を使用して、問題を持っています:データベース内の一部の列は、アンダースコアで名前を持っており、これらの列は、エンティティのプロパティにマップする必要があります(キャメルケースではもちろんであること)MyBatisの列マッピング

class User { 
    private String first_name; 
    ... 
} 

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

残念ながら、JPAで行われているように(@Column(name = "first_name"))、宣言的に解決する方法はありません。 私はそのような列のためにselect節でエイリアスを作ることができます(ファーストネームfirstNameなどと同じですが)。

アイデア?ありがとう。

+1

はMyBatisの@Resultsと@Result注釈を調べてください。 – DwB

答えて

19

DwBに感謝します。

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

PSをしかし、複数のクエリの場合、私は、エンティティのユーザーが返される各メソッドの結果/ @結果コード@定型する必要があります。それは助けました。私の場合、問題はないので、ごく少数の場所しか存在しませんが、一般的に私はもっと一般的な解決策を探しています。

+3

私はxmlの設定と注釈を混在させることができると思います。実際のSQLのコードに@Selectsを残してくださいが、の部分をxml構成ファイルに入れてください。各メソッドで@Resultsを指定する必要がないように、結果マップはオブジェクト/クラスレベル(ネームスペースに基づく)に適用する必要があります。 – AngerClown

+3

この質問は少し古くなっていますが、将来的には自動マッピングhttp://www.mybatis.org/core/sqlmap-xml.html#Auto-mappingを参照してください。 – lsoliveira

+0

mapUnderscoreToCamelCaseの設定を使用して、アンダースコアの名前をcamelcaseに変換することもできます。http://mybatis.github.io/mybatis-3/configuration.html – ozhan

5

UserMapper.xmlファイルにResultMapを定義し、これらの行を追加:Javaコードで

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

を、@ResultMap注釈を追加します。

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

あなたは自動的にこれらの基本コードを生成するためにMyBatis Generatorを使用することができます。

9

エドゥアルドMacarronは、次の問題でこの機能を示唆している:

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

をMyBatisの3のドキュメントによると、今で説明した設定により可能です:

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

基本的には、以下を設定する必要があります。

<setting name="mapUnderscoreToCamelCase" value="true"/> 
意味210

は、古典的なデータベースのカラム名から自動マッピングを有効にキャメルケースの古典的なJavaプロパティ名aColumnにA_COLUMN。

+0

2011年に回答があったときの回答は正解でした。しかし、誰かが将来見ると、この答えが正しいアプローチになるでしょう。 –

4

これほど多くの列がない場合は、この方法でResultMapを回避できます。春の注釈ベースの構成では、余分なスペースをconcanateをMyBatisの

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

あなたは文字列の配列を使用することができ、それを読みやすくするために、

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

はキャメルケースマッピングに下線をカスタマイズSqlSessionFactoryを通じて有効にすることができます次のようになります。

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