Mybatis中实体字段名与表中列名不一致

  • 问题描述
  • 解决方案
  • 1. 在SQL查询语句中添加别名
  • 2. 自定义结果映射
  • 3. 开启驼峰命名规则
  • 4. 特殊情况


问题描述

假设实体User中有字段名为userName,而表中列名为user_name

正常情况下,执行数据库查询,查询到的userName为null,因为名称不一致,值无法映射

解决方案

1. 在SQL查询语句中添加别名

在SQL语句中,手动为查询的列添加别名,使其与实体中字段名相同
示例:

<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.itheima.domain.User">
    select id as userId,user_name as userName,birthday as userBirthday,
    sex as userSex,address as userAddress from user
</select>

此时,再次执行数据库查询,userName就会有值了
但是,SQL语句如果很多的情况下,为每一个SQL添加别名就会很麻烦

2. 自定义结果映射

resultMap标签可以建立查询的列名和实体类的属性名不一致的映射关系,从而实现封装

select标签中使用resultMap属性指定引用即可

示例:

  1. 创建自定义映射
<!-- 建立 User 实体和数据库表的对应关系
type 属性:指定实体类的全限定类名
id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
-->
<resultMap type="com.itheima.domain.User" id="userMap">
    <id column="id" property="userId"/>
    <result column="user_name" property="userName"/>
    <result column="sex" property="userSex"/>
    <result column="address" property="userAddress"/>
    <result column="birthday" property="userBirthday"/>
</resultMap>
  1. 使用自定义映射
<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
	select * from user
</select>

使用自定义映射的好处是可以复用

3. 开启驼峰命名规则

当表的列名使用下划线编写,实体字段名使用驼峰命名,并且两者匹配时,可以通过开启驼峰命名规则解决名称不一致问题
例如:
列名:user_name,字段名:userName,这种情况开启驼峰命名规则是有作用的
但是像 列名:u_name,字段名:userName,这种情况是没有作用的

开启驼峰命名规则

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

4. 特殊情况

MysqlWindows操作系统中时不区分大小写的
所以,如果列名:username,字段名:userName 这种情况是可以匹配映射的,可以查询到值