二,MyBatis -Plus 关于映射 Java Bean 对象的注意事项和细节(详细说明)

二,MyBatis -Plus 关于映射 Java Bean 对象的注意事项和细节(详细说明)

文章目录

  • 二,MyBatis -Plus 关于映射 Java Bean 对象的注意事项和细节(详细说明)
  • 1. 映射
  • 2. 表的映射
  • 3. 字段映射
  • 4. 字段失效
  • 5. 视图属性
  • 6. 总结:
  • 7. 最后:


1. 映射

这里的映射:是指将从数据库查询到的信息,映射到对应的Java Bean对象当中的。

学习过Mybatis的同学应该知道,Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现。

既然MybatisPlus是基于Mybatis的增强工具,所以也具有这样的映射规则。

我们先来了解一下自动映射规则。

  1. 表名和实体类名映射 -> 表名user 实体类名User
  2. 字段名和实体类属性名映射 -> 字段名name 实体类属性名name
  3. 字段名下划线命名方式和实体类属性小驼峰命名方式映射 ->
  4. 简单的说就是:**MyBatis-plus 将数据表当中的查询到的信息赋值到 对应Java bean 对象当中是,通过 反射机制当中,使用 setName->Name->name进行赋值操作的。并不是通过,bean 对象当中的属性名执行赋值的 **

字段名 user_email 实体类属性名 userEmail

MybatisPlus支持这种映射规则,可以通过配置来设置

map-underscore-to-camel-case: true 表示支持下划线到驼峰的映射
map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射

这里我们在 applicaition.yaml 文件当中进行配置。

在这里插入图片描述

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: MySQL123main:banner-mode: off  #关闭 spring boot  在命令行当中的图标显示mybatis-plus:global-config:banner: false  # 关闭 mybatis-plus 在命令行当中的图标显示configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 开启 Log 日志信息打印map-underscore-to-camel-case: true # 开启驼峰,下划线映射规则

2. 表的映射

通过 @TableName()注解指定映射的数据库表名,就会按照指定的表名进行映射。

在这里插入图片描述

表映射:主要用于,当我们的数据表名与 我们在Java当中创建的实体类的 Java Bean 不一致的时候。那么 MyBatis Plus 是无法为我们进行 实体类上的映射的,会报错。这时候,我们就需要通过 @TableName() 注解的当中的 value 属性对其进行操作,让我们的Java Bean 实体类 与 数据表名保持一致

在这里插入图片描述
在这里插入图片描述

这时我们添加上@TableName() 注解,指明该实体类,映射的数据表是哪一个。

在这里插入图片描述

package com.rainbowsea.bean;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
public class User {private Long id;private String name;private Integer age;private String email;
}

在这里插入图片描述

如果有很多实体类,对应到数据库中的很多表,我们不需要每个依次配置,只需要配置一个全局的设置,他都会给每个实体类名前面添加指定的前缀,这里我们演示一下全局配置的效果.

当多个实体类,存在有规律,有统一前缀的时候,我们可以在 application.yaml 文档当中,配置,所有实体类映射的前缀。当 MyBatis Plus 执行 SQL 语句的时候,会将我们配置的 前缀拼接上,然后,在进行一个执行 SQL语句。如下:**注意:该配置是全局性的,作用于整个 MyBatis -plus **

在这里插入图片描述

mybatis-plus:global-config:banner: false  # 关闭 mybatis-plus 在命令行当中的图标显示db-config:table-prefix: rainbowsea_ # 还可以通过统一添加前缀的方式:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: MySQL123main:banner-mode: off  #关闭 spring boot  在命令行当中的图标显示mybatis-plus:global-config:banner: false  # 关闭 mybatis-plus 在命令行当中的图标显示db-config:table-prefix: rainbowsea_ # 还可以通过统一添加前缀的方式:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 开启 Log 日志信息打印map-underscore-to-camel-case: true # 开启驼峰,下划线映射规则

在这里插入图片描述

package com.rainbowsea.bean;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor//@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
//@TableName(value = "user")
public class User {private Long id;private String name;private Integer age;private String email;
}

在这里插入图片描述

3. 字段映射

什么场景下会改变字段映射呢?

当数据库字段和表实体类的属性不一致时,我们可以使用@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致。

当我们数据表当中的字段名与我们Java Bean 实体类当中的属性名不一致的时候,运行程序,想要将查询结果赋值到对应的实体类上时,是会报错的。这时候,我们就可以在实体类的属性名上加上 @TableField() 注解,并将其 value 值指定为数据表中对应的字段名 。这样当执行 SQL 语句的时候,MyBatis Plus 会通过该注解标注指定的字段属性进行一个 as 别名的方式,让其赋值到对应Java Bean 实体类的属性上。

在这里插入图片描述

如:此时将数据库字段的名称我们改为username,在根据实体类的属性拼接SQL的使用,就会使用@TableField()中指定的名称username进行拼接,完成查询

在这里插入图片描述

在这里插入图片描述

在实体类当中的与数据表不一致的属性名上,我们使用上 @TableField() 注解的方式,进行指明为数据表当中的哪个字段名。
在这里插入图片描述

package com.rainbowsea.bean;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor//@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
//@TableName(value = "user")
public class User {private Long id;@TableField(value = "username")private String name;private Integer age;private String email;
}

在这里插入图片描述

当我们执行的 SQL语句当中包含了 SQL语句的关键字 ,如果没有使用别名特殊,处理的话,是会报错的。如下:

在这里插入图片描述

数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接sql语句,例如:

SELECT  id,username AS name,age,email,desc FROM `rainbowsea_user`

这条语句直接进行查询的时候,会出现错误

Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desc FROM rainbowsea_user’ at line 1。

原因是,desc属于关键字,不能直接用于sql查询,要解决这个问题,就需要将desc字段加上 “`” 符号,将他变为不是关键字,才能完成查询,那这个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过@TableField()改变实体类的属性名称,将desc变为desc,就可以解决这个问题。运行测试。

在这里插入图片描述

如果我们Java Bean 实体类当中,有这样一个 desc SQL语句的关键字,作为了该实体类当中的属性名,那么执行 SQL语句的时候,涉及到查询该属性名时,就会报错。

在这里插入图片描述

我们需要通过@TableField() 改变实体类的属性名称,将 desc 变为 desc , 就可以解决这个问题。运行测试。

在这里插入图片描述

package com.rainbowsea.bean;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor//@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
//@TableName(value = "user")
public class User {private Long id;@TableField(value = "username")private String name;@TableField(select = false)  // 查询时,不对age 字段进行查询private Integer age;private String email;@TableField(value = "`desc`") // 注意:有两层,但最里面的哪个不是引号private String desc;}

再次运行测试:

在这里插入图片描述

在这里插入图片描述

此时可以观察到,框架拼接生成的SQL语句的字段名称变为了desc,这样是可以正常完成查询的

4. 字段失效

package com.rainbowsea.bean;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor//@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
//@TableName(value = "user")
public class User {@TableField(select = false)  // 查询时,不对age 字段进行查询private Integer age;
}

当数据库中有字段不希望被查询,我们可以通过 @TableField(select = false) 来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段。

如:如果不想显示年龄信息,那么可以在age属性上添加这个注解,来隐藏这个字段。
在这里插入图片描述

package com.rainbowsea.bean;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor//@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
//@TableName(value = "user")
public class User {private Long id;@TableField(value = "username")private String name;@TableField(select = false)  // 查询时,不对age 字段进行查询private Integer age;private String email;
}

在这里插入图片描述

5. 视图属性


//@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
//@TableName(value = "user")
public class User {@TableField(exist = false)  // 表示,不让该 online 属性,作为 SQL语句当中的查询字段private Integer online;
}

在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段

根据之前的经验,框架会默认将实体类中的属性作为查询字段进行拼接,那我们来思考,像这种视图字段,能够作为查询条件么,显示是不能的。因为数据库中没有这个字段,所以查询字段如果包含这个字段,SQL语句会出现问题。我们通过@TableField(exist = false) 来去掉这个字段,不让他作为查询字段。

在这里插入图片描述

package com.rainbowsea.bean;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor//@TableName(value = "rainbowsea_user")  // 指明该实体类映射的是那张数据表
//@TableName(value = "user")
public class User {private Long id;@TableField(value = "username")private String name;@TableField(select = false)  // 查询时,不对age 字段进行查询private Integer age;private String email;@TableField(value = "`desc`") // 注意:有两层,但最里面的哪个不是引号private String desc;@TableField(exist = false)  // 表示,不让该 online 属性,作为 SQL语句当中的查询字段private Integer online;
}

6. 总结:

  1. 映射:是指将从数据库查询到的信息,映射到对应的Java Bean对象当中的。
  2. @TableName() 注解的当中的 value 属性对其进行操作,让我们的Java Bean 实体类 与 数据表名保持一致
  3. @TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致。同时也可以运用于,当属性名与SQL关键字冲突的时候,可以使用 @TableField(value = "desc") ,注意:含有关键字的时候,有两层包含的,最后一个不是单引号
  4. @TableField(select = false) 来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段。
  5. @TableField(select = false) 来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段。
  6. @TableField(exist = false) 来去掉这个字段,不让他作为查询字段。

7. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

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

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

相关文章

【数据优化】基于GEE填补遥感缺失数据

GEE填补遥感数据缺失 1.写在前面2.填充代码2.1 年内中值数据填充MODIS NPP空值2.2 年内中值数据填充Landsat8 NDVI空值 1.写在前面 在遥感影像分析中,我们经常会遇到由于云层遮挡、传感器故障等多重因素导致的图像数据缺失问题。为了解决这一挑战,常用的…

Selenium with Python学习笔记整理(网课+网站持续更新)

本篇是根据学习网站和网课结合自己做的学习笔记,后续会一边学习一边补齐和整理笔记 官方学习网站在这获取: https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

MySQL高阶之存储过程

什么是存储过程? 存储过程可称为过程化SQL语言,是在普通SQL语句的基础上增加了编程语言的特点,把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中,通过逻辑判断、循环等操作实现复杂计算的程序语言。 换句话说,存储过程其实…

Acwing BFS

一般通过队列实现,当边的权值相同时具有最短性,可以求最少操作步数。相比DFS无需回溯,而是逐层搜索。 Acwing 844 走迷宫 输入样例: 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 输出样例: 8 思路分析&am…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示: 图4-1 系统结构 登录系统结构图,如图4-2所示: 图4-2 登录结构图 蜗牛兼职网结构图,如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

[今日Arxiv] 思维迭代:利用内心对话进行自主大型语言模型推理

思维迭代:利用内心对话进行自主大型语言模型推理 Iteration of Thought: Leveraging Inner Dialogue for Autonomous Large Language Model Reasoning URL:https://arxiv.org/abs/2409.12618 注:翻译可能存在误差,详细内容建议…

Java -2

常用API System 可以获取当前时间,以此计算运行代码的时间也可以控制代码的结束 //获取当前时间点-毫秒 1970 1-1 8:00 long num System.currentTimeMillis(); System.out.println(num);//系统退出运行 System.exit(0); Runtime 获取操作系统的线程大小 能从操…

YOLOv8改进 | 主干网络 | 将backbone替换为Swin-Transformer结构【论文必备】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

Tansformer代码实现

目录 1.Tansformer架构图 2.代码实现 2.1创建类:实现基于位置的前馈网络 2.2创建 残差&LN层标准归一化的类 2.3编码器block 2.4创建编码器 2.5创建解码器 2.6transformer解码器部分 3.知识点个人理解 1.Tansformer架构图 2.代码实现 2.1创建类&…

连续数组问题

目录 一题目: 二思路: 三代码: 一题目: leetcode链接:. - 力扣(LeetCode) 二思路: 思路:前缀和(第二种)化0为-1hash: 这样可以把…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据,在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中,我们介绍了大模型的数据处理链路,本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

vscode 配置django

创建运行环境 使用pip安装Django:pip install django。 创建一个新的Django项目:django-admin startproject myproject。 打开VSCode,并在项目文件夹中打开终端。 在VSCode中安装Python扩展(如果尚未安装)。 在项…

滑动窗口经典题目

目录 滑动窗口 什么是滑动窗口? 什么时候用滑动窗口? 怎么用滑动窗口? 209. 长度最小的子数组(滑动窗口的引入) 3. 无重复字符的最长子串 1004. 最大连续1的个数 III 1658. 将 x 减到 0 的最小操作数 904. 水…

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

【重学 MySQL】三十七、聚合函数

【重学 MySQL】三十七、聚合函数 基本概念5大常用的聚合函数COUNT()SUM()AVG()MAX()MIN() 使用场景注意事项示例查询 聚合函数(Aggregate Functions)在数据库查询中扮演着至关重要的角色,特别是在处理大量数据时。它们能够对一组值执行计算&a…

37. Vector3与模型位置、缩放属性

本文章给通过组对象Group (opens new window)给大家讲解一下threejs层级模型或树结构的概念。 Group层级模型(树结构)案例 下面代码创建了两个网格模型mesh1、mesh2,通过THREE.Group类创建一个组对象group,然后通过add方法把网格模型mesh1、mesh2作为设置为组对象g…

Vuex的使用看这一篇就够了

Vuex概述 Vuex 是一个专为 Vue.js 应用程序开发的状态管理库。它采用集中式存储管理应用的所有组件的状态,并以一种可预测的方式来保证状态以一种可预测的方式发生变化。 state状态 把公用的数据放到store里的state就行了,上面是vue2的代码,下…

[大语言模型] LINFUSION:1个GPU,1分钟,16K图像

1. 文章 2409.02097 (arxiv.org)https://arxiv.org/pdf/2409.02097 LINFUSION: 1 GPU, 1 MINUTE, 16K IMAGE 摘要 本文介绍了一种新型的扩散模型LINFUSION,它能够在保持高分辨率图像生成性能的同时显著降低时间和内存复杂度。该模型采用了基于Transformer的UNet进…

【前端】ES6:Class语法和Class继承

文章目录 1 Class语法1.1 类的写法1.2 getter与setter1.3 静态属性和静态方法 2 Class继承 1 Class语法 1.1 类的写法 class Person {constructor(name,age){this.name name;this.age age;}say(){console.log(this.name,this.age)} } let obj new Person("kerwin&quo…

python--基础语法(2)

1.顺序语句 默认情况下,Python的代码执行顺序是按照从上到下的顺序,依次执行的。 2.条件语句 条件语句能够表达“如果 ...否则 ...”这样的语义这构成了计算机中基础的逻辑判定条件语, 也叫做 分支语句。表示了接下来的逻辑可能有几种走向…