驼峰映射失效情况分很多种,我在这里只罗列出我遇到/了解到的情况,像未开启驼峰映射配置;SQL 中未使用别名(或别名不符合驼峰规则);MyBatis 版本过低或配置作用域错误(如只在局部 SqlSession 中配置);这些错误就不再这里赘述
使用了 resultMap 且未显式配置字段映射
当我们通过xml配置文件来编写sql语句时,如果查询出来的字段名与实体类中的属性名明显对应不上时我们通常需要借助resultMap来进行显式配置,我举以下示例(原始代码太大,我缩减了一下)
<resultMap id="queryEmpResultMap" type="com.example.pojo.Emp">
<id column="e_id" property="id"/>
<result column="e_job" property="job"/>
<result column="dept_name" property="deptName"/>
<!–result column="update_time" property="updateTime"–>
<collection property="exprList" ofType="com.example.pojo.EmpExpr">
<id column="p_id" property="id"/>
<result column="p_emp_id" property="empId"/>
<result column="p_job" property="job"/>
</collection>
</resultMap>
在上面这个例子中,我将update_time字段的显示映射注释掉,在返回类型的实体类中updateTime属性就无法正常映射,即便update_time是updateTime标准的下划线格式,并开启了驼峰映射,但是仍不会实现映射,因为我们在使用resultMap方式进行显式映射时,MyBatis就不会再帮我们自动进行驼峰映射,必须显式配置所有想要映射的字段
使用 @Select + @Results 时未处理映射
在注解中使用 @Results 时,尽量手动指定每个字段映射,否则即便驼峰映射打开仍可能映射不上(我个人没有遇到过这种情况,可能是我的 SQL 列名规范且版本支持)
@Select("select user_name from user")
@Results({
@Result(property = "userName", column = "user_name")
})
User getUser();
使用了 Map 作为返回类型
当 resultType="java.util.Map" 时,MyBatis 直接以 数据库列名作为 key 存入 Map。例如:select user_name from user → map.get("user_name"),不会变成 "userName"。因为 Map 的 key 是原始列名,不经过 JavaBean 属性映射流程,驼峰配置对此无效。
因此返回 Map 时,需手动处理 key 转换



