面试题——当实体类中的属性名和表中的字段名不一样,如何将查询的结果封装到指定 pojo?

news2024/11/24 14:35:27

在使用MyBatis的时候,应该注意实体类的属性名尽量和表的字段名尽量相同,如果不同将会导致MyBatis无法完成数据的封装,但是在软件开发过程中,数据库的创建和软件环境的搭建不可能是同一个人,实体类属性名和数据库的字段名不同那就在所难免。

MyBatis只能自动维护库表”列名“与”属性名“相同时的一一对应关系,二者不同时,无法自动ORM。

  • Java的变量命名规范是:驼峰命名法
  • 数据库的列名命名规范是:下划线区分单词命名法

这样Java实体类和数据库列名不一致就成了一种常态,只有数据库中的字段和实体类的属性名字对得上的字段,才能被查出来。

解决方案一:命名一致

我们可以把POJO中的实体类命名和数据库表中字段的命名调整一致,但是数据库表字段的命名方式并不是驼峰式命名方式,不符合Java中对于类属性的命名规则,因此不推荐使用。

解决方案二:给表中字段取别名

我们可以通过在表对应的mapper.xml配置文件中通过<sql>标签给字段取别名的方式,使得重新命名的表字段别名与实体类中的属性名保持一致,再通过<include>标签引入sql代码块,这样也可以达到数据正常封装的效果。

通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类 的属性名一致。​​​​​​​ 

优点:

  • 1.便于理解
  • 2.如果要查询的字段有重名的情况,使用别名可以区分开来

缺点: 

  • 1.如果列数过多会导致语句难以阅读
  • 2.如果查询语句的定义多个,会导致重复代码增多,多次定义显示列增加了工作量
<mapper namespace="com.cos.mybatis.ManagerDao">
    <select id="selectManagerByIdAndPwd" resultType="com.qf.mybatis.part2.orm.Manager">
        SELECT mgr_id AS id , mgr_name AS username , mgr_pwd AS password
        FROM t_managers
        WHERE mgr_id = #{id} AND mgr_pwd = #{pwd}
    </select>
</mapper>

起别名的三种方法: 

  • 1.使用as关键字
  • 2.省略as关键字,使用空格
  • 3.如果你要取的别名是个mysql的关键字,或者取的别名中包含特殊符号,比如像空格,像#井号;#井号在mysgl中是注释符号#(解决办法是把别名用引号引起来,引号可以是双引号,也可以是单引号,建议使用双引号)

解决方案三:通过resultMap来调整字段名与属性名映射一致

我们可以通过<resultMap>标签来将数据库表中字段映射到对应的实体类属性上,完成数据库查询数据的封装,如果实体类的属性中存在自定义类属性,那么也可以通过resultMap进行数据的层层映射,封装到对应自定义类中的基本类型数据中。

  • 通过< resultMap id="" type="" >映射,匹配列名与属性名。

    resultMap 用于指定某个自定义的封装规则,MyBatis会根据这个自定义的封装规则进行数据封装(单条记录)

  • 优点:这个自定义的封装规则可以被重复使用,省去多次定义别名的问题
  • 缺点:需要额外定义一套封装规则的resultMap
<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用 id 属性来映射主键字段–>
<id property=”id” column=”order_id”>
<!–用 result 属性来映射非主键字段,property 为实体类属性名,column
为数据表中的属性–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>

resultMap   id: 唯一标识

type: 映射类型可以是别名的形式

result:映射一般的字段

id:映射主键 不一样的才会采用映射

column:数据库字段名      property:实体字段名

解决方案四:使用Mybatis特殊设置

在Mybatis配置文件<settings>标签内设置mapUnderscoreToCamelCase属性的值为true,那么数据库就会将表字段的分割式命名(例如:p_id)自动映射到实体类的驼峰式命名(例如:pId)上,且不区分驼峰式命名的大小写。

注意:此方法仅适用于字段名的下划线转化为驼峰后恰好与类的属性名一致的情况

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

解决方案五

1、使用注解@TableName (value = ...)
当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名(不加这个注解默认将实体类的小写形式在db中寻找)

@TableName(value = "user")
public class AnnotationUser4Bean {
@TableId(value = "user id",type = IdType.AUTO)
private String userId;
@TableField("name")
private String name;
@TableField("sex")
private string sex;
@TableField("age")
private Integer age;

2、使用@TableField注解

该注解用于标识非主键的字段。将数据库列与 JavaBean 中的属性进行映射

  1. 主要用来解决实体类的字段名与数据库中的字段名不匹配的问题(数据库user_addr,字段useraddr未驼峰)
  2. 实体类中的属性字段在表中不存在的问题

3、在 Mapper 接口中使用注解方式配置映射关系,使用 @Results@Result 注解配置映射关系。

首先说明一下

@Results各个属性的含义,id为当前结果集声明唯一标识,value值为结果集映射关系;

@Results 注解可用于定义多个列和Java对象属性之间的映射关系。

比如,我们在查询用户表时,需要将 id、 username 和 password 的值映射到 User 对象的userId、 userName 和 password 属性上,可以在 @Select 注解内使用 @Results 注解完成;

@Results注解需要指定 column 和 property 属性,分别代表数据库列名和Java对象属性名; 

@Results({
        @Result(property = "name", column = "user_name"),
        @Result(property = "age", column = "user_age")
})
@Select("SELECT user_name, user_age FROM user WHERE id = #{id}")
User getUserById(@Param("id") int id);

@Result 注解用于定义单个列和Java对象属性之间的映射关系。一般情况下,它会被用在Results 注解内,也可以单独使用。@Result 注解也需要指定 column 和 property 属性

@Result(column = "id", property = "userId")
public User findById(Long id);

@Result代表一个字段的映射关系,column指定数据库字段的名称,propery指定实体类属性的名称,jdbcType数据库字段类型,@Result里的id值为true表明主键,默认false;

参考

注解@TableName、@TableField_数据库不转驼峰注解_GuochaoHN的博客-CSDN博客

【Mybatis】数据封装时数据库表字段和POJO中实体类属性命名不一致的几种解决方案_mybatis po 属性大小写不一样_Edward朱or猪的博客-CSDN博客

Mybatis框架之解决列名(表中的字段名称)和实体类中的属性名不一致_Nice康的博客-CSDN博客 Mybatis:解决属性名和字段名不一致的问题_Ariverh的博客-CSDN博客

Mybatis 的常见面试题_mybatis 列名循环_eaphy的博客-CSDN博客

Mybatis面试题(总结最全面的面试题!!!) - 知乎MyBatis(优点&缺点)&MyBatis使用详解! - 知乎 

Mybatis中属性名和字段名可不一致(使用resultType)_resulttype 属性名_吉士粉狗的博客-CSDN博客

MyBatis学习笔记:表字段名与实体类属性名不一致的解决方法_HelloWorld_EE的博客-CSDN博客https://www.cnblogs.com/qxhIndex/p/14137586.html

https://www.cnblogs.com/ubiquitousShare/p/12505815.html

Spring Boot——MyBatis配置带下划线命名的字段自动转换驼峰命名解决方案_@select 单个接口关闭下划线驼峰_Starzkg的博客-CSDN博客 SSM面试题5:MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ?_ssm 表名和实体类 不一样_丨风语者丨的博客-CSDN博客Mybatis注解方式下处理实体类与数据库表列名不一致_mybatis表名与类名不一致注解_guohongyanghy的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

真正理解红黑树,真正的(Linux内核里大量用到的数据结构

作为一种数据结构&#xff0c;红黑树可谓不算朴素&#xff0c;因为各种宣传让它过于神秘&#xff0c;网上搜罗了一大堆的关于红黑树的文章&#xff0c;不外乎千篇一律&#xff0c;介绍概念&#xff0c;分析性能&#xff0c;贴上代码&#xff0c;然后给上罪恶的一句话&#xff0…

芯片制造详解.从沙子到晶圆.学习笔记(一)

刚入行半导体行业&#xff0c;很多知识需要系统的学习&#xff0c;想从入门通俗易懂的知识开始学起&#xff0c;于是在导师的帮助下&#xff0c;找到了这门课程&#xff0c;那就从这门课程开始打开我的半导体之旅吧。 我只是对视频内容的提炼&#xff0c;和自己的学习心得&…

hack the box—Lame

扫描 还是老方法nmapfscan得到开放的端口和服务 nmap -sV -sC -sT -v -T4 10.10.10.3 看到开了445&#xff0c;先来波ms17-010&#xff0c;发现失败。 这里还开个21&#xff0c;并且可以知道版本号&#xff0c;直接搜索ftp漏洞 msf正好有对应的模块 设置好参数后进行攻击&…

从iOS App启动速度看如何为基础性能保驾护航 | 京东物流技术团队

1 前言 启动是App给用户的第一印象&#xff0c;一款App的启动速度&#xff0c;不单单是用户体验的事情&#xff0c;往往还决定了它能否获取更多的用户。所以到了一定阶段App的启动优化是必须要做的事情。App启动基本分为以下两种 1.1 冷启动 App 点击启动前&#xff0c;它的…

uniapp---app端人脸识别组件(宽屏版1280*800组件,需手动截屏拍人脸识别,踩坑,成长)

一、首先记录下踩到的坑 我这边做的是一个挂在门口的门牌机&#xff0c;可以用于扫脸签到&#xff0c;扫码签到&#xff0c;扫脸实现用的是live-pusher组件&#xff08;代码很长&#xff0c;放在最下面&#xff0c;不能直接用&#xff0c;需要根据实际情况修改&#xff09;去做…

处理多维特征的输入

数据的每一列称为&#xff1a;特征/字段 x的数据变为8列&#xff0c;维数8 step one:构建数据集 x_data;y_data&#xff1a;创建两个Tensor step two:定义模型 step three:构造损失和优化器 step four:训练 else 激活函数&#xff1a; 代码更改部分&#xff1a; 转->大佬笔…

基于AutoEncoder自编码器的人脸识别matlab仿真

目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 人脸识别是计算机视觉领域的重要研究方向&#xff0c;其目标是从图像或视频中准确地识别和识别人脸。传统的人脸识别方法通常基于特征提取和分类器&#…

Java虚拟机——后端编译与优化

编译器无论在何时、何种状态下将Class文件转换成与本地基础设施相关的二进制机器码&#xff0c;它都可以视为整个编译过程的后端。即时编译一直是绝对主流的编译形式&#xff0c;不过提前编译也逐渐被主流JDK支持。 1 即时编译器 目前两款主流的Java虚拟机&#xff08;HotSpo…

【MATLAB绘图】

MATLAB绘图函数&#xff1a;Plot函数详解 介绍 MATLAB是一种常用的科学计算和数据可视化工具&#xff0c;它提供了强大的绘图函数&#xff0c;使用户能够创建各种类型的图表和图形。 基本语法 plot函数的基本语法如下&#xff1a; plot(x, y)其中&#xff0c;x和y是长度相…

HDFS的文件块大小(重点)

HDFS 中的文件在物理上是分块存储 &#xff08;Block &#xff09; &#xff0c; 块的大小可以通过配置参数( dfs.blocksize&#xff09;来规定&#xff0c;默认大小在Hadoop2.x/3.x版本中是128M&#xff0c;1.x版本中是64M。 如果一个文件文件小于128M&#xff0c;该文件会占…

Git 命令行教程:如何在 GitLab 中恢复已删除的分支

在软件开发过程中&#xff0c;版本控制是一个至关重要的环节。Git 是最流行的分布式版本控制系统之一&#xff0c;它能够帮助团队高效地管理代码。然而&#xff0c;有时候会发生意外&#xff0c;例如代码误合、错误的删除等情况&#xff0c;导致重要的开发分支本地和远程不慎被…

vue2踩坑之项目:v-if/else branches must use unique keys.

error: v-if/else branches must use unique keys. if 与 else 的 key 不能相同&#xff0c;在else标签里的key逐步加1 // if 与 else 的 key 不能相同 <div v-for"(item, index) in menuList" :key"item.id"><div v-if"item.name" :k…

js 操作符 in 的使用

1、判断对象中是否有某个属性&#xff0c;返回true/false let person {name: "小明", age: 18, year: 1998}; if ("age" in person){ //属性名必须是字符串形式&#xff0c;因为age不是一个变量console.log("person对象中含有age属性") } els…

(六)如何使用FLUX语言的文档

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 6 章 如何使用FLUX语言的文档 6.1 如何查看函数文档 1、这是FLUX语言的文档 https://docs.influxdata.com…

(七)FLUX查询InfluxDB

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 7 章 FLUX查询InfluxDB 7.1 前言 1、本节内容较为重要 7.2 FLUX查询InfluxDB的语法 1、使用FLUX语言查询…

AbstractMethodError: com.xx.serviceImpl.xxx method is abstract

今日一语&#xff1a; 其实我们没有必要和其他人进行比较&#xff0c;我们要比较的是昨天的自己 只有这样才能得到救赎和解脱&#xff0c;否则就是泥潭中跳跃&#xff0c;山谷中呐喊 在翻阅其他博主的博客时&#xff0c;似乎大多分享的是因为数据源驱动或者中间件的版本太高或者…

SpringCloud - 狂神学习笔记

1. 常见面试题 1.1 什么是微服务&#xff1f; 1.2 微服务之间是如何独立通讯的&#xff1f; 1.3 SpringCloud 和 Dubbo有那些区别&#xff1f; 1.4 SpringBoot 和 SpringCloud&#xff0c;请谈谈你对他们的理解 1.5 什么是服务熔断&#xff1f;什么是服务降级&#xff1f;…

微调模型来完成热狗识别的图像分类任务

我们来实践一个具体的例子&#xff1a;热狗识别。将基于一个小数据集对在ImageNet数据集上训练好的ResNet模型进行微调。该小数据集含有数千张热狗或者其他事物的图像。我们将使用微调得到的模型来识别一张图像中是否包含热狗。 首先&#xff0c;导入实验所需的工具包。 impo…

“铸网-2023” | 持续保障江西省实网应急演练

​​日前&#xff0c;由江西省工业和信息化厅主办&#xff0c;江西省网络安全研究院承办&#xff0c;南京赛宁信息技术有限公司协办并提供全程技术支撑的“铸网-2023”江西省工业领域网络安全实网应急演练在江西南昌圆满收官。 一、应急演练43天 赛宁持续助推工业企业应急能力…

论文精度系列之详解图神经网络

论文地址:A Gentle Introduction to Graph Neural Networks 翻译:图表就在我们身边;现实世界的对象通常根据它们与其他事物的连接来定义。一组对象以及它们之间的连接自然地表示为图形。十多年来&#xff0c;研究人员已经开发了对图数据进行操作的神经网络&#xff08;称为图神…