MyBatis数据库字段和实体对象属性名不一致的解决方案

数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案。

1. 开启驼峰转换

如果数据库中的字段名与对象只是简单的不一致的话,比如名字是一样的,只是分隔方式不一样,在数据库中使用了下划线分隔,而在对象中使用了驼峰分隔,如果都是这样子的话倒不是特别麻烦,只需要在mybatis的配置文件中开启驼峰转换即可。

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

2. 在SQL查询语句中使用别名来适配

还有一种情况就是绝大部分情况下都是可以适配得上的,但是只有几列适配不上,这个时候定义单独的ResultMap感觉有点不值当(事实上,从可维护性上来考虑定义ResultMap绝对是首选),所以我们就在查询数据的时候在SQL语句中使用别名来使数据库列名能够适配得上对象的属性名。

比如在数据库中用户名列叫做username,在对象中用户名叫做name,由于种种原因我们不能去修改这两个名字了但是还要让它们能够对应得起来,下面是一种可能的解决方案:

<select id="loadById" parameterType="string" resultType="user">
	SELECT id, username AS name, passwd FROM t_user WHERE id=#{id}
</select>

甚至在指定别名的时候还可以在别名中包含点符号来导航,比如使用role.name来指定注入到user对象的role属性的name属性中,下面是一个简单的例子:

<select id="load" parameterType="long" resultType="org.cc11001100.mybatis.domain.User">
    SELECT
        t1.id, username, passwd,
        t3.id AS ‘role.id‘,
        t3.name AS ‘role.name‘
    FROM
        t_user AS t1
        JOIN t_user_role AS t2 ON t1.id=t2.user_id
        JOIN t_role AS t3 ON t3.id=t2.role_id
    WHERE
      t1.id=#{id};
</select>

3. 自定义ResultMap

最后,实在是不一致得比较离谱,基本上大部分的数据库字段和对象的名字都是不对应的,这种情况下定义一个ResultMap来解决这个问题绝对是上策。

<select id="loadById" parameterType="string" resultMap="userResultMap">
	SELECT * FROM t_user WHERE id=#{id}
</select>

然后在resultMap标签中配置不同字段的映射:

<resultMap id="userMap" type="org.cc11001100.mybatis.domain.User" autoMapping="true">
    <id column="id" property="id"/>
    <result column="username" property="name"/>
</resultMap>

resultMap标签有个属性叫做autoMapping,当指定为true的时候表示没有手动使用id或者result标签指定映射的属性就自动映射,这样将这个属性置为true,就可以只指定表字段名称与对象属性名不匹配的字段,大大减少了工作量。

.

时间: 2024-08-29 12:17:24

MyBatis数据库字段和实体对象属性名不一致的解决方案的相关文章

在数据库字段(实体类属性名)带下划线时get和set方法无效

错误描述: 使用springboot和mybatis,查询数据并封装到java类中,因为java实体类的属性名带有下划线(" _ "),导致get和set方法无效,数据无法封装到实体类中,出现null. 结局办法: 数据库字段保持不变的情况下,改变属性名命名方式,用@Column("")注解将属性名和字段对应. 原文地址:https://www.cnblogs.com/FanWenSong/p/12103320.html

KO ------- 表中字段名和实体类属性名不一致

-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就会为空 (一)问题复现 1.先创建数据库 mybatis_db, 再创建表 t_user,并插入若干数据 注意:user_id 为主键,且为自动增长 2.创建实体类 User.java: package com.siwuxie095.entity; // 实体类 public class User

RequestBody中对应的实体中属性名不一致的解决办法

当一个类被多个接口引用,或者有很多地方都用到了其get,set方法时, 如果临时要改字段名就会非常麻烦,因为很多地方已经建立了映射关系 如果执意要传和类属性不一样的属性名的话,那么有一个注解来帮我们解决这样的麻烦 下面就是一个典型的情况,我user类属性是id,对应数据库字段也是id,但是非要给我传userId, 我不想修改属性和所有有关联的地方,所以使用了此注解 import com.fasterxml.jackson.annotation.JsonProperty; @JsonPropert

Mybatis——实体类属性名和数据库字段名不同时的解决办法

在使用Mybatis来持久化数据库时,有时候会碰到数据库中表中的字段与java实体类中属性名不一致的情况,在这种情况下Mybatis是不能完成字段的自动映射的.而通常情况下,数据库及实体类是不应该被改的的.所以要在不改变数据库以及实体类的情况下解决这个问题,下面是解决该问题的三种方式: java实体类: public class User { private Long id; private String userName; private String passWord; /** * ...

MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突

一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23); INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33); INSER

MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('aaaa'

MyBatis——解决字段名与实体类属性名不相同的冲突

原文:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSER

Mybatis解决字段名与实体类属性名不相同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('aaaa'

MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的,如果直接在xml映射文件中使用sql进行映射,会造成返回值为空的情况,下面阐述解决方案: 测试所用表和数据 create table orders( order_id int primary key auto_increment, order_no varchar(20), order_price float ); insert into orders(order_no, order_price) values('aaa