Отображение столбцов 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;
}
Ответ 6
используйте MyBatis Auto-mapping в вашем файле конфигурации (например, application.properties или application.yml),
здесь вроде:
mybatis.configuration.map-underscore-to-camel-case=true
Ссылка: http://www.mybatis.org/mybatis-3/sqlmap-xml.html#Auto-mapping
Китайский справочник:
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Auto-mapping