mybatis字段自动驼峰转换和大小写敏感
在 MyBatis 中,默认情况下,SELECT
语句查询出来的数据库字段名(通常是下划线分隔的,如 user_name
)不会自动转换成 Java 对象属性名的驼峰形式(如 userName
)。同时,字段名到属性名的映射默认是大小写敏感的。
以下是详细说明和解决方案:
默认行为(不自动驼峰转换,大小写敏感):
如果你的数据库字段名是
first_name
,而你的 Java 对象属性名是firstName
,MyBatis 默认无法将它们匹配起来。如果你的数据库字段名是
UserName
(首字母大写),而 Java 属性名是userName
(首字母小写),MyBatis 默认也无法匹配,因为大小写不同。
开启自动驼峰命名转换:
MyBatis 提供了一个强大的全局配置选项来启用下划线命名到驼峰命名的自动映射:
mapUnderscoreToCamelCase
。你需要在 MyBatis 的核心配置文件中(通常是
mybatis-config.xml
)设置这个选项为true
:<configuration><settings><!-- 启用下划线转驼峰 --><setting name="mapUnderscoreToCamelCase" value="true"/><!-- 其他配置... --></settings><!-- 其他配置... --> </configuration>
作用:开启后,MyBatis 会自动尝试将数据库查询结果中下划线分隔的小写字母命名的列名(如
user_name
,order_id
)映射到 Java 对象驼峰命名的属性名(如userName
,orderId
)。大小写敏感性:
对于开启了
mapUnderscoreToCamelCase
的字段(即原字段包含下划线),MyBatis 在转换和匹配时不区分大小写。它会忽略数据库列名和 Java 属性名在大小写上的差异,专注于下划线到驼峰的转换逻辑。例如:数据库列
USER_NAME
或user_name
或uSeR_nAmE
都会被尝试映射到userName
。
对于不包含下划线的字段名,或者未开启
mapUnderscoreToCamelCase
时,MyBatis 的映射默认是大小写敏感的。数据库列名UserName
和 Java 属性userName
会被视为不同的名称。
其他映射方式:
<resultMap>
:这是最精确、最灵活的映射方式。你可以显式地在 XML Mapper 文件中定义<resultMap>
,使用<result>
子元素指定数据库列名 (column
) 和 Java 属性名 (property
) 的对应关系。这种方式完全由你控制,不受mapUnderscoreToCamelCase
设置影响,且可以处理任何复杂的映射关系(包括类型转换器)。<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="userName" column="user_name"/> <!-- 显式指定映射,即使开启驼峰 --><result property="emailAddress" column="email"/> <!-- 列名和属性名不同 --> </resultMap> <select id="selectUser" resultMap="userResultMap">SELECT id, user_name, email FROM users WHERE id = #{id} </select>
SQL 别名 (
AS
):在编写SELECT
语句时,可以直接为列指定别名,使其与 Java 属性名完全一致(包括大小写)。SELECTuser_id AS userId,user_name AS userName,created_at AS createdAt FROM users WHERE user_id = #{id}
这种方式简单直接,但需要在每个查询中写别名,如果属性名变更,需要修改所有相关 SQL。
注解 (
@Results
,@Result
):如果你使用注解方式配置 Mapper,可以使用@Results
和@Result
注解达到类似<resultMap>
的效果。@Results({@Result(property = "userId", column = "user_id"),@Result(property = "userName", column = "user_name"),@Result(property = "createdAt", column = "created_at") }) @Select("SELECT user_id, user_name, created_at FROM users WHERE user_id = #{id}") User selectUserById(int id);
总结与建议:
默认不驼峰,大小写敏感:MyBatis 默认不会自动转换驼峰,且列名到属性名的匹配是大小写敏感的。
推荐开启全局驼峰转换:在
mybatis-config.xml
中设置<setting name="mapUnderscoreToCamelCase" value="true"/>
。这是处理数据库下划线命名和 Java 驼峰属性名之间映射的最常用、最便捷方式。开启后,对于带下划线的列名,映射时不区分大小写。复杂场景用
<resultMap>
或注解:对于不符合驼峰规则的映射、需要特殊处理的列、或者需要最高精度的控制时,使用<resultMap>
或@Results
/@Result
注解进行显式映射。SQL 别名作为补充:在特定查询中需要临时改变映射关系时,可以使用 SQL 别名。
验证:开启 mapUnderscoreToCamelCase
后,检查你的查询是否能正确地将类似 user_name
的数据库列值填充到 userName
这个 Java 属性中。如果数据库列名本身是驼峰形式(如 userName
)或者大小写混合(如 UserName
),而 Java 属性是 username
,则可能需要使用 <resultMap>
或别名来显式映射,因为 mapUnderscoreToCamelCase
主要处理的是下划线到驼峰的转换。