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

news2024/9/21 15:29:18

二,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.StdOutImpl
    map-underscore-to-camel-case: true
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
    username: root
    password: MySQL123
  main:
    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.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
    username: root
    password: MySQL123
  main:
    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.coloradmin.cn/o/2152688.html

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

相关文章

【C/C++】速通涉及string类的经典编程题

【C/C】速通涉及string类的经典编程题 一.字符串最后一个单词的长度代码实现:(含注释) 二.验证回文串解法一:代码实现:(含注释) 解法二:(推荐)1. 函数isalnum…

单卡3090 选用lora微调ChatGLM3-6B

环境配置 Python 3.10.12 transformers 4.36.2 torch 2.0.1 下载demo代码 在官方网址https://github.com/THUDM/ChatGLM3/blob/main/finetune_demo 下载demo代码cd 进入文件夹 pip install -r requirements.txt 安装一些包 基本知识 SFT 全量微调: 4张显卡平均分配&#…

13年计算机考研408-数据结构

解析: 这个降序链表不影响时间复杂度,因为是链表,所以你想要升序就使用头插法,你想要降序就使用尾插法。 然后我们来分析一下最坏的情况是什么样的。 因为m和n都是两个有序的升序序列。 如果刚好m的最大值小于n的最小值&#xff0…

AI宠物拟人化新玩法,教你如何用0成本打造爆款创意内容!

近年来,随着AI技术的快速发展,各种创新玩法不断涌现,尤其是在内容创作领域,AI带来的变革尤为显著。 **其中,宠物拟人化逐渐成为社交媒体上的一大热门话题。**通过AI生成工具,我们不仅可以将宠物拟人化&…

Snapchat API 访问:Objective-C 实现示例

Snapchat 是一个流行的社交媒体平台,它允许用户发送和接收短暂存在的图片和视频。对于开发者来说,访问 Snapchat API 可以为应用程序添加独特的社交功能。本文将介绍如何在 Objective-C 中实现对 Snapchat API 的访问,并提供一个详细的代码示…

GD32F103单片机-EXTI外部中断

GD32F103单片机-EXTI外部中断 一、EXTI及NVIC介绍二、编程实验2.1 相关库函数2.2 实验代码 一、EXTI及NVIC介绍 GD32和STM32的EXTI基本相似,具体见STM32F1单片机-外部中断GD32的EXTI包括20个相互独立的边沿检测电路请求产生中断或事件,4位优先级配置寄存…

热像仪是如何工作的?

红外热像仪是一种非接触式设备,能够检测红外能量(热量)并将其转变成可见光图像。让我们深入了解红外热像仪的科学原理,以及借助红外热像仪我们能够看到的隐形世界。 捕捉红外波,而不是可见光 首先必须清楚的是&#…

windows环境下配置MySQL主从启动失败 查看data文件夹中.err发现报错unknown variable ‘log‐bin=mysql‐bin‘

文章目录 问题解决方法 问题 今天在windows环境下配置MySQL主从同步,在修改my.ini文件后发现MySQL启动失败了 打开my.ini检查参数发现没有问题 [mysqld] #开启二进制日志,记录了所有更改数据库数据的SQL语句 log‐bin mysql‐bin #设置服务id&#x…

Vue(13)——router-link

router-link vue-router提供了一个全局组件router-link(取代a标签) 能跳转,配置to属性指定路径(必须)。本质还是a标签。默认会提供高亮类名,可以直接设置高亮样式 右键检查,发现多了两个类: 可以直接写样式…

Java数据结构专栏介绍

专栏导读 在软件工程的世界里,数据结构是构建高效、可靠程序的基石。"Java数据结构"专栏致力于为Java开发者提供一个全面、深入的学习平台,帮助他们掌握各种数据结构的原理、实现及其在Java中的应用。通过这个专栏,读者将能够提升…

IPsec-Vpn

网络括谱图 IPSec-VPN 配置思路 1 配置IP地址 FWA:IP地址的配置 [FW1000-A]interface GigabitEthernet 1/0/0 [FW1000-A-GigabitEthernet1/0/0]ip address 10.1.1.1 24 [FW1000-A]interface GigabitEthernet 1/0/2 [FW1000-A-GigabitEthernet1/0/2]ip address

分布式Id生成策略-美团Leaf

之前在做物流相关的项目时候,需要在分布式系统生成运单的id。 1.需求: 1.全局唯一性:不能出现重复的ID。(基本要求) 2.递增:大多数关系型数据库(如 MySQL)使用 B 树作为索引结构。…

web前端-HTML常用标签-综合案例

如图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document&…

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行&#xff1b;当前是秒级时间戳&#xff0c;如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

Linux 系统进程理解——标识符,状态

目录 进程描述-pcb 并行与并发 概念&#xff1a; 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体 这短短的两行就概括了进程&#xff0c;但是进程的内在…

Mysql分组取最新一条记录

文章目录 Mysql分组取最新一条记录1. 数据准备1. 方法1&#xff1a;使用子查询获取每个组的最大时间戳&#xff0c;然后再次查询获取具体记录&#xff08;如果时间戳是唯一的&#xff09;2. 方法2&#xff1a;使用窗口函数&#xff08;MySQL 8.0&#xff09;3. 方法3&#xff1…

ClickHouse 与 Quickwit 集成实现高效查询

1. 概述 在当今大数据分析领域&#xff0c;ClickHouse 作为一款高性能的列式数据库&#xff0c;以其出色的查询速度和对大规模数据的处理能力&#xff0c;广泛应用于在线分析处理 (OLAP) 场景。ClickHouse 的列式存储和并行计算能力使得它在处理结构化数据查询时极具优势&…

F28335 的外部中断实验

1 外部中断介绍 1.1 外部中断简介 1.2 外部中断相关寄存器 (1)外部中断控制寄存器(XINTnCR) (2)外部 NMI 中断控制寄存器

多模态大模型MiniCPM-V技术学习

目前性价比最高的多模态模型 Minicpm-V-2.6参数8B&#xff0c;int4版本推理显存仅7GB&#xff0c;并且在幻觉数据集上效果好于其他模型&#xff0c;测试下来效果非常好&#xff0c;官方演示里面还给出了手机上端侧运行的图片和视频推理示例 p.s.Qwen2-VL和Minicpm-V-2.6头对头…

从小白到大神:C语言预处理与编译环境的完美指南(上)

从小白到大神&#xff1a;C语言预处理与编译环境的完美指南&#xff08;下&#xff09;-CSDN博客 新鲜出炉~~&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;下篇在这里&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&…