当前位置: 首页 > news >正文

MyBatis-Plus为何用JavaBean映射数据库表及乐观锁实战

目录

映射匹配兼容性:

为什么 MyBatis-Plus 要用 JavaBean 来对应数据库表

因此自然而然的出现了下面的一些问题:

1.当表字段与编码属性设计不同步时:

2.编码中添加了数据库中未定义的属性

3.采用默认查询开放了更多的字段查看权限

4.表名与开发设置不匹配

id生成策略控制:

1. AUTO(数据库自增)

ASSIGN_ID(分布式ID,雪花算法)

NPUT(手动输入)

ASSIGN_UUID(UUID字符串)

多记录操作:

逻辑删除:

乐观锁:

1.在数组库表中加一个乐观锁字段

2.在实体类中加上对应的字段

3.在MybatisPlus的拦截器中加上乐观锁的拦截器


前言:上一篇我们讲解了MybatisPlus查询的相关基础操作以及null值的处理,这一章节我们主要补充查询中存在的一些特殊情况如映射匹配兼容性,

映射匹配兼容性:

当 MyBatis-Plus 执行 SQL 时,它需要知道我们的 Java 实体类对应数据库中的哪一张表。它的查找顺序是注解 -> 全局策略 -> 实体类名(驼峰转下划线)。

其次就是在MybatisPlus这个框架中,我们写的JavaBean主要是为了将数据库表结构映射为内存中的 Java 对象。

为什么 MyBatis-Plus 要用 JavaBean 来对应数据库表

MyBatis-Plus 选择用 JavaBean 作为实体类,是因为 JavaBean 的规范完美地解决了 ORM(对象关系映射) 的几个核心需求:

  1. 数据封装:表的字段对应 JavaBean 的属性。

  2. 赋值能力:MyBatis-Plus 通过反射调用setter方法,将数据库查询结果填入对象。

  3. 取值能力:MyBatis-Plus 通过反射调用getter方法,获取参数值拼接到 SQL 中(例如插入数据时获取字段值)。

  4. 自省能力:通过 JavaBean 的方法命名规范,框架可以推断出属性名,实现“约定大于配置”。

概念解释
JavaBean是一种代码编写规范(私有属性 + getter/setter + 无参构造)。它就像一个通用的数据盒子
数据库表对应是 JavaBean 在持久层的一个具体应用场景。当 JavaBean 专门用来映射数据库表时,我们称之为实体类 (Entity)

因此自然而然的出现了下面的一些问题:

1.当表字段与编码属性设计不同步时:

使用@TableField(value=“”)注解,写在模型类属性上方。value设置数据库表字段的名称。

2.编码中添加了数据库中未定义的属性

exist:设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用

@TableField(exist = false)

3.采用默认查询开放了更多的字段查看权限

如密码字段在执行的时候,会在前台进行展示,这样是完全不合理的,因此我们可以设置select设置属性是否参与查询

4.表名与开发设置不匹配

关于是现有JavaBean还是现有数据库表先出现

  • 在大多数使用 MyBatis-Plus 的互联网企业级项目中,通常流程是:设计数据表 $\rightarrow$ 使用代码生成器生成 JavaBean。因为这样效率高,且能保证数据库设计的合理性。

  • 但理解也可以先有 JavaBean 这种反向思维,能帮你更好地理解面向对象设计,以及为什么 JavaBean 会有那么多注解来定义字段映射关系。

维度先有数据表 (传统/数据驱动)先有 JavaBean (DDD/领域驱动)
出发点数据如何存储、如何查询更快业务如何建模、如何封装规则
JavaBean 角色数据的载体(只有getter/setter)业务逻辑的核心(包含行为方法)
对应关系JavaBean 完全匹配数据库数据库表适配JavaBean (可能有映射转换)
适用场景报表系统、简单的CRUD后台、对性能要求极高的系统业务逻辑复杂的核心系统、微服务、中台
设计者DBA、后端开发领域专家、架构师、后端开发

id生成策略控制:

主键id是什么,MyBatis-Plus执行updateByIddeleteById等方法时,需要知道哪个字段是主键

如果没有标记,MyBatis-Plus就不知道用哪个条件去更新或删除

唯一标识一条记录,被其他表引用(建立表间关系),提高查询效率,数据库会自动为主键创建索引,所以通过主键查询是最快的。简单来说,主键就是每一行数据的"身份证号",主键就像是数据世界的"坐标",没有它,你就无法精确找到任何一条数据,也无法建立表与表之间的关系。

在MyBatis-Plus中,主键有多种生成方式,通过@TableIdtype属性指定:

1. AUTO(数据库自增)
@TableId(type = IdType.AUTO) private Long id;
ASSIGN_ID(分布式ID,雪花算法)
@TableId(type = IdType.ASSIGN_ID) private Long id;
NPUT(手动输入)
@TableId(type = IdType.INPUT) private String orderNo; // 主键可能是业务编号
ASSIGN_UUID(UUID字符串)
@TableId(type = IdType.ASSIGN_UUID) private String id; // 注意这里是String类型
作用维度具体说明类比理解
唯一标识每条记录的唯一ID身份证号
查询速度主键索引,查询最快书的页码
表间关联被外键引用,建立关系人与人之间的亲属关系凭证
数据完整性不能为null,不能重复保证每个人都有一个唯一且有效的身份

我们也可以在yml文件中进行全局配置,不用在每个JavaBean中写注解

多记录操作:


按照主键删除多条记录
List<Long> ids= Arrays.aslist(new Long[]{2,3});userDao.deleteBatchIds (ids);
根据主键查询多条记录
List<Long> ids= Arrays.asList(new Long[]{2,3});List<User> userList = userDao.selectBatchIds(ids);

逻辑删除:

在有些情况时,我们删除数据的时候,会导致业务数据从数据库中废弃。因此我们使用逻辑删除,并不是真正的把数据删除。,而是为数据设置为是否可用字段,需要删除时设置为不可用字段(如员工离职,但是员工做成的业务对公司有用,所以不能完全删除掉),数据保留在数据库中。

1.在数据库表添加逻辑删除字段

2.实体类中添加对应的字段,并表明是逻辑字段。

3.配置逻辑删除字面值(全局配置简化)

乐观锁:

在实际生活中,某平台开放了秒杀活动,但只有100个名额,但是抢购的人很多,当就剩最后一个名额的时候,但又有很多人抢购,这个名额归谁呢,这时就需要我们的锁机制了。

1.在数组库表中加一个乐观锁字段

2.在实体类中加上对应的字段

3.在MybatisPlus的拦截器中加上乐观锁的拦截器

在SQL发送到数据库之前,动态修改它。

乐观锁拦截器,乐观锁是一种解决并发冲突的机制,它假设并发冲突很少发生,所以在更新时检查数据是否被修改过。
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mpInterceptor;

拦截器帮我们做了三件事:

  1. 在SET语句中自动加上version = version + 1

  2. 在WHERE条件中自动加上AND version = 旧版本号

  3. 如果更新失败(影响行数为0),抛出异常

结语:

最后的最后,感谢大家观看到最后,如果对你有帮助,请一键三连,点赞,关注(拜托了),收藏你的支持就是我最大的鼓励,持续更新对大家有帮助的知识!

http://www.jsqmd.com/news/406426/

相关文章:

  • 基于Visio的SDPose-Wholebody系统架构图绘制规范
  • 手机号查QQ:高效安全的本地查询解决方案
  • 3大创新方案实现手机号与QQ号智能关联:企业级数据整合实战指南
  • 提升Google Apps Script性能的秘诀:UrlFetchApp的应用
  • Python实战:用贝叶斯优化让随机森林模型准确率提升5%的完整流程
  • Lingyuxiu MXJ LoRA开源镜像技术白皮书:本地缓存+热切换+LoRA轻量三重保障
  • DouyinLiveRecorder:突破40+平台直播录制限制的全方位解决方案
  • 3步掌控Illusion游戏Mod管理:KKManager从入门到精通指南
  • WindowsCleaner:3步化解C盘空间危机
  • Revelation光影包:Minecraft写实渲染技术解析与应用指南
  • 家庭游戏串流革命:Sunshine打造跨设备游戏自由体验
  • Seedance 2.0任务队列吞吐翻倍实践:从QPS 320到2850的7项内核级参数调优清单(附压测对比数据)
  • 人脸识别新体验:Retinaface+CurricularFace镜像快速上手
  • 零基础3步玩转DOL游戏:汉化美化全攻略,告别英文界面烦恼
  • WarcraftHelper:魔兽争霸III现代解决方案——经典游戏的全方位增强指南
  • 深入解析AMBA-APB4总线:从基础概念到实际应用
  • 小白必看:EagleEye动态阈值调节技巧
  • 解锁壁纸资源潜力:用RePKG工具实现Wallpaper Engine素材自由
  • 硬字幕去除困境:video-subtitle-remover如何通过AI技术实现视频内容净化
  • STM32CubeMX实战:定时器输入捕获技术解析与频率测量
  • GLM-4-9B-Chat-1M实战教程:结合LangChain构建企业知识图谱问答
  • HY-Motion 1.0与Unity集成:游戏动作资源快速生成
  • 3个创新突破让小说爱好者轻松构建个人数字图书馆
  • 金融数据获取工具与市场数据分析库:用Python实现高效数据处理全指南
  • Fish Speech 1.5性能优化:提升合成速度的技巧
  • 手机号与QQ号关联查询实战指南:技术实现与企业级应用方案
  • 决策树在电商用户行为分析中的应用:以Scikit-learn为例的实战案例
  • 突破网盘下载瓶颈:直链获取工具的技术解析与实践指南
  • 3分钟玩转DeepSeek-R1-Distill-Qwen-7B:Ollama快速入门
  • 从单机游戏到MMO:构建登录系统的实践与思考