Отображение столбцов MyBatis

Я использую MyBatis 3.0.3 и имею проблему: некоторые столбцы в базе данных имеют имена с символами подчеркивания, и эти столбцы должны быть сопоставлены с объектными свойствами (которые, конечно же, находятся в camelCase)

class User {
  private String first_name;
  ...
}

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

К сожалению, я не вижу никакого способа разрешить это декларативно (как это делается в JPA - @Column (name = "first_name" )). Я мог бы создавать псевдонимы в select-clause для таких столбцов (sush как first_name как firstName и т.д.), Но это также выглядит хромым.

Любые идеи? Спасибо.

Ответ 1

Благодаря DwB. Это помогло:

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

ps. Но в случае нескольких запросов мне нужно скомпилировать @Results/@Код результата для каждого метода, в котором возвращается объект User. В моем случае будет очень мало мест, поэтому это не проблема, но в целом мне все равно хотелось бы найти более общее решение.

Ответ 2

Эдуардо Макаррон предложил эту функцию по следующей проблеме:

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"/>

Это означает:

Позволяет автоматически сопоставлять имена классических имен столбцов A_COLUMN с именами классических Java-свойств верблюда, классическими именами Java aColumn.

Ответ 3

Определите ResultMap в файле UserMapper.xml и добавьте следующие строки:

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

В вашем Java-коде добавьте @ResultMap аннотацию:

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

Вы можете использовать MyBatis Generator для автоматического создания этих базовых кодов.

Ответ 4

Если столбцов не так много, вы можете сделать это таким образом и избежать ResultMap.

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

чтобы сделать его более читаемым, вы можете использовать массив строк, которые MyBatis объединяет с дополнительным пространством

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

Ответ 5

В spring на основе аннотации подчеркивается, что отображение верблюжьего случая может быть включено через настраиваемый SqlSessionFactory, например:

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