MyBatis列映射

and*_*rii 12 java mybatis

我正在使用MyBatis 3.0.3并且有问题:数据库中的某些列具有带下划线的名称,这些列应该映射到实体属性(当然是在camelCase中)

class User {
  private String first_name;
  ...
}

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

不幸的是我看不出任何解决方法(就像在JPA中完成的那样 - @Column(name ="first_name")).我可以在select-clause中为这些列创建别名(sush作为firstName作为firstName等),但这看起来也很蹩脚.

有任何想法吗?谢谢.

and*_*rii 22

感谢DwB.这有助于:

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

ps但是在多个查询的情况下,我需要对每个返回实体User的方法进行样板@ Results/@结果代码.在我的情况下,将会有很少的地方,所以这不是一个问题,但总的来说,我仍然希望找到更一般的解决方案.

  • 这个问题现在有点陈旧了,但为了将来参考,可以看看自动映射:http://www.mybatis.org/core/sqlmap-xml.html#Auto-mapping. (4认同)
  • 我认为你可以混合使用xml配置和注释.将@Selected保留在实际SQL的代码中,但将<resultMap>部分放在xml配置文件中.结果映射应该应用于对象/类级别(基于命名空间),因此您不必在每个方法上指定@Results. (3认同)

Ern*_*oso 12

Eduardo 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"/>
Run Code Online (Sandbox Code Playgroud)

意思是:

启用从经典数据库列名A_COLUMN到驼峰式经典Java属性名称aColumn的自动映射.


小智 5

ResultMap在UserMapper.xml文件中定义一个,并添加以下行:

<resultMap id="BaseResultMap" type="package.for.User">
  <result column="user_name" jdbcType="VARCHAR" property="userName" />
  <!--  other columns -->
</resultMap>
Run Code Online (Sandbox Code Playgroud)

在Java代码中,添加@ResultMap注释:

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

您可以使用MyBatis Generator自动生成这些基本代码.


Luk*_*ino 5

如果没有太多列,您可以这样做并避免使用 ResultMap。

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

为了使其更具可读性,您可以使用字符串数组,MyBatis 将其与额外的空格连接起来

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


Fre*_*yaZ 5

在配置文件中使用 MyBatis 的自动映射(例如 application.properties 或 application.yml),如下所示:

mybatis.configuration.map-underscore-to-camel-case=true
Run Code Online (Sandbox Code Playgroud)

参考:http://www.mybatis.org/mybatis-3/sqlmap-xml.html#Auto-mapping

中文参考: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Auto-mapping