Mybatis-Plus基础之Mapper的映射规则

文章目录

  • 映射规则
    • 1. 列名和属性名不一致
    • 2. PO 属性比数据库字段要多
    • 3. 关键字冲突
    • 4. ID 生成规则

映射规则

1. 列名和属性名不一致

有时你会遇到 PO 类和数据库表字段不一致的情况,并且又没办法将它俩调整成一致。这种情况下,你就要显示地在你的 PO 类的属性上添加 @TableField 注解,并通过它的 value 属性指定该属性所对应的数据库字段。

@TableField(value = "location")
private String xxx;

默认情况下,在属性名和数据库字段一致的情况下,@TableField 注解可以偷懒省略掉,不写。但是这种不一致的情况下,你就没法再偷懒了。

2. PO 属性比数据库字段要多

有可能你的数据库字段有 N 个,但是与之对应的 PO 类的属性有 N + 1 个,PO 类属性比数据库字段要多。

警告
个人觉得不应该出现这种情况。出现这种情况的唯一原因就是:有人偷了懒。

本应该再创建一个 JavaBean 的(可能是 DTO,也可能是 Domain),但是偷懒没有。在原本应该使用 DTO 或 Domain 的地方使用 PO ,而 DTO 和 Domain 本身和数据库表结构又不是严格意义对应的,进而导致你要在你的 PO 类中加属性。

PO 类中一加属性,那它还是 PO 吗?它和数据库表还是严格一一对应吗?

通过 @TableField 注解的 exist 属性赋值为 false ,要求 MP 不要管这个属性:在新增/修改操作时,MP 不会把这个属性的值 insert/update 到数据库的表中;在查询操作时,MP 也不会(也不能)用数据库中的某个字段为它赋值。

@TableField(exist = false)
private String xxx;

3. 关键字冲突

有时无意中给表名和列名起名字时会和 SQL 语法中的关键字同名。最典型的例子就是 order

提示
如果你是手动执行 SQL 语句建表,通常不会出现这种情况。因为在执行建表语句时,就会出错。通常都是大家通过客户端软件,在界面上点点点地建表,从而忽略掉了这个问题。

这种情况下,你需要在你的 PO 类中用上『反单引号(`)』将表名和列名引起来。其实,本质上本来就是需要的,只不过在不冲突的情况下,我们可以省略。现在无非是加回去了而已。

@TableName("`department`")
public class DepartmentPo implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "`id`", type = IdType.AUTO)private Long id;@TableField(value = "`name`")private String name;@TableField(value = "`location`")private String location;}

4. ID 生成规则

从上帝视角看,有 3 方可以为数据库中的数据的 ID 负责:程序员、MP 和数据库自己。

  • 『程序员负责』指的是我们在编码过程中,在代码层面为即将 insert 进数据库中的数据准备好 ID 。即,在 insert 到数据库之前,这条数据就已经有了 ID 了。

  • 『MP 负责』指的是虽然我们没有决定数据的 ID ,但是由于数据是经由 MP 去执行 insert SQL 语句的,MP 可以为这条数据生成 ID 。也就是说,在 insert 到数据库之前,这条数据已经有 ID 了。

  • 由『数据库自己负责』这种情况大家已经很熟悉了,数据库在收到要 insert 的数据时,数据是没有 ID 的,数据库自己来决定这条数据的 ID 。

ID 生成策略指的就是你准备让谁来负责为新数据生成 ID 这个事:

  • @TableId(type = IdType.AUTO) 这就是数据库负责,利用数据库的主键 ID 自增功能。这种情况下,我们在新增数据时不需要考虑为新数据的 ID 赋值。

  • @TableId(type = IdType.INPUT) 这就是程序员负责。这种情况下我们在代码中要为新数据的 ID 属性赋值,并且要保证它是非空且唯一的。

  • ASSIGN_IDASSIGN_UUID 都表示由 MP 负责。对于 ID 为 null 的数据,MP 会使用 uuid 或雪花 id 来为它们赋值,然后再使用 insert SQL 添加到数据库中。

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

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

相关文章

方太厨电,在创新科技中看见烟火人间

人类的历史,就是一部创新的历史。科普作者马特里德利在《创新的起源:一部科学技术进步史》写道:能源是所有创新之源。 火的发明和使用,就是一种创新,人类第一次通过控制热量的转换来做功,依靠火来取暖和烹饪…

命令行fdisk扩展ubuntu 扩展分区sda2下的sda5 挂载根路径下的主分区

具体如下 rootubuntu:~# fdisk /dev/sdaWelcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command.#查询现有分区情况,40G需要扩展到50G Command (m for help): p Di…

python cgi获取前端传送json

引言 在Web开发中,前端与后端之间需要进行数据的交互。前端通常将用户输入的数据封装为JSON格式,通过HTTP请求发送给后端。后端服务器收到请求后,需要解析JSON数据并进行相应的逻辑处理。本文将介绍如何使用Python的CGI模块来获取前端传送的JSON数据,并提供相应的代码示例。…

[NCTF 2022]calc

[NCTF 2022]calc 考点:python环境变量注入 打开题目,F12有hint 访问一下得到源码 app.route("/calc",methods[GET]) def calc():ip request.remote_addrnum request.values.get("num")log "echo {0} {1} {2}> ./tmp/log…

网络安全制度

文章目录 前言一、等级保护制度是基础二、科学的网络安全制度体系1、建立科学的网络安全等级保护制度2、建立科学的关键信息基础设施安全保护制度3、建立科学的数据安全保护制度三、法律、政策、标准,三方衔接1、三个制度在法律层面协调一致2、三个制度在政策层面协调一致3、三…

天擎离线升级工具使用说明

免责声明 本文旨在提供信息和解决问题的建议,观点和建议可能不适用于个人情况,仅供参考!!! 文章中所有敏感信息已经修改,对于因本文中提供的信息而导致的任何直接或间接损失或损害不承担责任。 使用本文中的…

Android14新特性 开启前台service服务

1. Android14新特性 1.1. 场景 在Android14(targetSDK34)系统手机开启前台service服务崩溃 ATAL EXCEPTION: mainProcess: com.inspur.lbrd, PID: 15634java.lang.RuntimeException: Unable to create service com.inspur.lbrd.service.KeepAliveServi…

uniapp Vue3 日历 可签到 跳转

上干货 <template><view class"zong"><view><view class"top"><!-- 上个月 --><view class"sgy" click"sgy">◀</view><view class"nianyue">{{ year }}年{{ month 1 }}…

MySQL 8.0 InnoDB Tablespaces之General Tablespaces(通用表空间/一般表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之General Tablespaces&#xff08;通用表空间/一般表空间&#xff09;General tablespaces&#xff08;通用表空间/一般表空间&#xff09;通用表空间的功能通用表空间的限制 创建通用表空间&#xff08;一般表空间&#xff09;创建语法…

【map】【滑动窗口】【字典树】C++算法:最长合法子字符串的长度

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口字典树 map 离线查询 map map可以分成有序(单调)map和无序(哈希)map。还可分成单键map和多键map&#xff08;允许重复的键&#xff09;。本文用&#xff1a;单键无序map。 …

防弹防线:彻底击败Redis缓存穿透问题【redis问题 一】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 防弹防线&#xff1a;彻底击败Redis缓存穿透问题 前言1. 缓存穿透定义和成因定义&#xff1a;缓存穿透的隐秘入侵成因分析&#xff1a;揭秘缓存穿透的幕后黑手故事描述 2. 缓存穿透的影响对数据库的影…

最优轨迹生成(三)—— 无约束BIVP轨迹优化

本系列文章是学习深蓝学院-移动机器人运动规划课程第五章最优轨迹生成 过程中所记录的笔记&#xff0c;本系列文章共包含四篇文章&#xff0c;依次介绍了微分平坦特性、无约束BVP轨迹优化、无约束BIVP轨迹优、 带约束轨迹优化等内容 本系列文章链接如下&#xff1a; 最优轨迹生…

设计模式详解:代理模式

1. 什么是代理模式&#xff1f; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许通过代理对象控制对另一个对象的访问。代理模式在客户端和目标对象之间引入了一个代理对象&#xff0c;客户端通过代理对象间接地访问目标对象&#xff0c…

以太坊代币标准解读及相关Dapp的搭建

文章目录 什么是以太坊代币标准1、什么是以太坊2、以太坊代币标准 同质化代币 Dapp 搭建1、MetaMask 的安装2、Ganache 的安装3、实现 ERC-20 代币协议4、前端页面的编写5、部署流程及操作演示 什么是以太坊代币标准 1、什么是以太坊 以太坊&#xff08;Ethereum&#xff09;是…

idea构建maven项目报错的解决

使用idea创建了一个新的spring项目&#xff0c;maven配置完毕后&#xff0c;报错&#xff0c;引用的依赖不存在。 控制台报错信息如下&#xff1a; 通过查询资料&#xff0c;发现是阿里云的maven仓库中没有这个版本的jar包&#xff0c;导入无法引用到对应的依赖。 解决方法就是…

01 HAL库点亮LED灯

引言&#xff1a;本专题采取的开发平台是stm32cubeIDE&#xff0c; 文章后面会后提供 一 、 LED简介 LED&#xff08;Light Emitting Diode&#xff09;是一种半导体发光器件&#xff0c;能够将电能直接转化为光能的电子元件。它具有体积小、功耗低、寿命长等特点&#xff0c;广…

接入Cloudflare后Nginx和Django获取用户真实IP的办法

可以用Nginx的real_ip的相关命令来实现这个需求。 01-real_ip命令集详解 real_ip命令的使用分为两个步骤: 01-1-设置从哪些代理IP获取真实IP 第1个步骤&#xff1a;通过set_real_ip_from命令设置从哪些代理IP请求获取真实的IP,比如下面的命令&#xff1a; set_real_ip_from…

Navicat for MySQL 创建函数——报错1418

解决方法 1查看是否开启了创建函数的功能 输入下面语句查看是否开启了创建函数的功能 show variables like %func%; 下面为创建函数功能为开启的查询结果 如果不是上面的结果可以用下面的语句修改为开启 set GLOBAL log_bin_trust_function_creatorstrue; //或 set GLOBAL …

Zookeeprt实战(待完善)

目录 原生java客户端实战 常用API 代码 Curator客户端实战 1. maven依赖 2. 初始化客户端 3. 重试策略 4. 增删改成API 5. 监听器API 分布式ID生成器 顺序节点生成分布式ID 实现雪花算法 zookeeper实现分布式队列 原生java客户端实战 常用API create(path, data, a…

vue3+vite 项目常用库

特别注意&#xff1a;需要使用管理员权限来打开命令提示符&#xff0c;不然会出现各种报错 yarn npm install -g yarn vite 1.使用vite创建项目 yarn create vite 2.安装包和运行 //或yarn yarn yarn dev 3.在vs code安装volar插件和Ant Design Vue Helper插件 需要注意…