MyBatis——解决属性名和数据库字段名不一致

提问与解答:

提问:当我们使用注解开发时有时会遇到数据库字段名与实体类属性名不一致的问题。xml方式开发可以通过结果集映射的方式解决,那注解方式开发要怎么解决呢?

解答:利用 @Results()注解!

Results注解中有两个常用的参数,一个是id,另一个是value。

  • id:这个参数的主要作用在于唯一标记这个Results注解,如果接口中的其他抽象方法也需要通过result注解来解决属性名和数据库字段名不一致问题,那么重新写一个Results注解就太麻烦了,这时我们就可以通过@ResultMap()注解中传入Results注解的参数id来引用Results注解中的内容。

  • value:这个参数用于建立实体类与数据库表的映射关系,其中可以填写多个@Result注解,用来将实体类的属性名和数据库字段名一一对应。⚠需要注意如果是主键字段,@Result注解中需要设置id=true。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface UserMapper {
@Select("select * from user")
@Results(id="aaa",value={
@Result(id=true,column = "id",property = "userId"),
@Result(column = "name",property = "userName"),
@Result(column = "age",property = "userAge")
})
List<User> getUsers();


@Select("select count(id) from user")
@ResultMap(value={"aaa"})
int findTotalUser();
}

补充:xml中的解决方式

方式一:利用 as 关键字

1
2
3
4
5
6
7
8
9
10
<select id="selectAll" resultType="com.geyu.mybatis.pojo.Car">
select
id,
car_num as carNum,
brand,
guide_price as guidePrice,
produce_time as produceTime,
car_type as carType
from t_car
</select>

方式二:使用resultMap进行结果映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--
1.专门定义一个结果映射,在这个结果映射当中指定数据库表的字段名和Java类的属性名的对应关系。
2. type属性:用来指定POJO类的类名。
3. id属性:指定resultMap的唯一标识。这个id将来要在select标签中使用。
-->
<resultMap id="carResultMap" type="Car">
<!--如果数据库表中有主键,一般都是有主键,要不然不符合数据库设计第一范式。-->
<!--如果有主键,建议这里配置一个id标签,注意:这不是必须的。但是官方的解释是什么呢?这样的配置可以让mybatis提高效率。-->
<id property="id" column="id"/>
<!--<result property="id" column="id"/>-->
<!--property后面填写POJO类的属性名-->
<!--column后面填写数据库表的字段名-->
<result property="carNum" column="car_num"/>
<!--如果column和property是一样的,这个可以省略。-->
<!--<result property="brand" column="brand"/>-->
<result property="guidePrice" column="guide_price"/>
<result property="produceTime" column="produce_time"/>
<result property="carType" column="car_type"/>
</resultMap>

<!--select标签的resultMap属性,用来指定使用哪个结果映射。resultMap后面的值是resultMap的id-->
<select id="selectAllByResultMap" resultMap="carResultMap">
select * from t_car
</select>

方式三:开启驼峰命名自动映射

使用这种方式的前提是:属性名遵循Java的命名规范,数据库表的列名遵循SQL的命名规范。

  • Java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名方式。
  • SQL命名规范:全部小写,单词之间采用下划线分割。
    比如以下的对应关系:

实体类中的属性名——-数据库表的列名

  • carNum————–car_num
  • carType————–car_type
  • produceTime——-produce_time

如何启用该功能,在mybatis-config.xml文件中进行如下配置:

1
2
3
4
<!--放在properties标签后面-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

再在Mapper.xml中配置如下:

1
2
3
<select id="selectAllByMapUnderscoreToCamelCase" resultType="Car">
select * from t_car
</select>
文章作者: GeYu
文章链接: https://nuistgy.github.io/2022/09/06/mybatis——解决属性名和数据库字段名不一致问题(注解方式)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yu's Blog