MyBatisPlus用JavaBean映射数据库表及乐观锁实战指南

 更新时间:2026年04月22日 10:35:51   作者:北极的代码  
本文主要介绍了MyBatis-Plus查询中映射匹配兼容性相关概念,以及当表字段与编码属性设计不同步时的解决办法和JavaBean在MyBatis-Plus中的作用;同时讲述了主键id生成策略控制、多记录操作、逻辑删除以及乐观锁等操作的实现方式

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

映射匹配兼容性:

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

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

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

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

  • 数据封装:表的字段对应 JavaBean 的属性。
  • 赋值能力:MyBatis-Plus 通过反射调用 setter 方法,将数据库查询结果填入对象。
  • 取值能力:MyBatis-Plus 通过反射调用 getter 方法,获取参数值拼接到 SQL 中(例如插入数据时获取字段值)。
  • 自省能力:通过 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中,主键有多种生成方式,通过 @TableId 的 type 属性指定:

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;

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

  • 在SET语句中自动加上 version = version + 1
  • 在WHERE条件中自动加上 AND version = 旧版本号
  • 如果更新失败(影响行数为0),抛出异常

结语:

到此这篇关于MyBatis-Plus为何用JavaBean映射数据库表及乐观锁实战的文章就介绍到这了,更多相关MyBatis-Plus映射JavaBean内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java常用的时间类以及其转化方式

    Java常用的时间类以及其转化方式

    这篇文章主要介绍了Java常用的时间类以及其转化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringBoot项目启动时如何读取配置以及初始化资源

    SpringBoot项目启动时如何读取配置以及初始化资源

    这篇文章主要给大家介绍了关于SpringBoot项目启动时如何读取配置以及初始化资源的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • SpringBoot模块多项目解耦的最佳实践

    SpringBoot模块多项目解耦的最佳实践

    为了提高代码质量和灵活性,在Spring Boot项目中采用策略模式是一个有效的方法,该模式允许定义一系列算法并将每一个封装起来,使它们可以互相替换,本文给大家介绍了SpringBoot模块多项目解耦的最佳实践,需要的朋友可以参考下
    2025-02-02
  • jedis的testWhileIdle用法源码解读

    jedis的testWhileIdle用法源码解读

    这篇文章主要为大家介绍了jedis的testWhileIdle用法源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java中线程组ThreadGroup与线程池的区别及示例

    Java中线程组ThreadGroup与线程池的区别及示例

    这篇文章主要介绍了Java中线程组与线程池的区别及示例,ThreadGroup是用来管理一组线程的,可以控制线程的执行,查看线程的执行状态等操作,方便对于一组线程的统一管理,需要的朋友可以参考下
    2023-05-05
  • 理解Java当中的回调机制(翻译)

    理解Java当中的回调机制(翻译)

    今天我要和大家分享一些东西,举例来说这个在JavaScript中用的很多。我要讲讲回调(callbacks)。你知道什么时候用,怎么用这个吗?你真的理解了它在java环境中的用法了吗?当我也问我自己这些问题,这也是我开始研究这些的原因
    2014-10-10
  • Spring Boot集成RabbitMQ以及队列模式操作

    Spring Boot集成RabbitMQ以及队列模式操作

    RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,下面这篇文章主要给大家介绍了关于Spring Boot集成RabbitMQ以及队列模式操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 详解IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式)

    详解IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式)

    这篇文章主要介绍了详解IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • SpringBoot使用YML文件进行多环境配置的三种方法

    SpringBoot使用YML文件进行多环境配置的三种方法

    SpringBoot通过其灵活的配置机制,使得在不同环境中管理应用设置变得简单,尤其是使用YAML文件进行配置,它提供了一种简洁、易读的方式来定义应用的配置,本文将探讨在SpringBoot中使用YAML文件进行多环境配置的三种方法,需要的朋友可以参考下
    2024-04-04
  • java如何用递归生成树形结构

    java如何用递归生成树形结构

    作者分享了自己在使用脚本之家资源进行编程时的经验,包括准备实体对象、测试数据、构造树形结构递归函数、测试以及输出结果等步骤,作者希望这些经验能对大家有所帮助,并鼓励大家支持脚本之家
    2025-03-03

最新评论