2011-02-22 129 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-clause(sush first_name作为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配置和注释。将@Select保留为实际SQL的代码,但将部分放在xml配置文件中。结果图应该应用于对象/类级别(基于名称空间),因此您不必在每种方法上指定@Results。 – AngerClown

+3

这个问题现在有点老了,但为了将来的参考,也许看看自动映射:http://www.mybatis.org/core/sqlmap-xml.html#Auto-mapping。 – lsoliveira

+0

您也可以使用mapUnderscoreToCamelCase设置将下划线命名转换为camelcase,ref:http://mybatis.github.io/mybatis-3/configuration.html – ozhan

5

定义在UserMapper.xml文件ResultMap,并添加这些行:

<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自动生成这些基本代码。

9

爱德华Macarron曾建议对以下问题的此功能:

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

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

根据的MyBatis 3的文件,现在通过中描述的设置是可能的基本上你必须配置:

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

这意味着:

支持从经典的数据库字段名自动映射到A_COLUMN骆驼情况下经典的Java属性名称将aColumn。

+0

在2011年回答时,接受的答案是正确的。但为了方便的任何人在未来观看它,这个答案将是正确的方法。 –

4

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

@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

的MyBatis concanate在弹簧基于注释的配置下划线骆驼映射可以通过定制的SqlSessionFactory启用,这样的:在您的配置文件(某事像application.properties或应用

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