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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring MVC基于注解的使用之JSON数据处理的方法

    Spring MVC基于注解的使用之JSON数据处理的方法

    这篇文章主要介绍了Spring MVC基于注解的使用JSON数据处理,json是一种轻量级的数据交换格式,是一种理想的数据交互语言,它易于阅读和编写,同时也易于机器解析和生成,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • mybatisplus isNotNull不生效问题及解决

    mybatisplus isNotNull不生效问题及解决

    这篇文章主要介绍了mybatisplus isNotNull不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java中的RecursiveTask从原理到实践全面解析

    Java中的RecursiveTask从原理到实践全面解析

    RecursiveTask 是 Java 并发编程中 Fork/Join 框架的核心组件,专为​​可递归分解且需返回结果​​的并行任务设计,本文从原理到实践全面解析Java中的RecursiveTask,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • java -jar启动参数设置file.encoding编码,解决中文乱码的问题

    java -jar启动参数设置file.encoding编码,解决中文乱码的问题

    这篇文章主要介绍了java -jar启动参数设置file.encoding编码,解决中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java中的常见几种发送http请求实例

    java中的常见几种发送http请求实例

    在Java编程中,发送HTTP请求是一个常见需求,常用的方法有四种:HttpURLConnection、URLConnection、HttpClient以及Socket,其中,使用HttpClient方式时,需要添加额外的库支持
    2024-11-11
  • java编程中实现调用js方法分析

    java编程中实现调用js方法分析

    这篇文章主要介绍了java编程中实现调用js方法,结合具体实例形式较为详细的分析了java编程中调用js方法的常用操作技巧与注意事项,需要的朋友可以参考下
    2017-09-09
  • Java中的ArrayList类常用方法和遍历

    Java中的ArrayList类常用方法和遍历

    这篇文章主要介绍了Java中的ArrayList类常用方法和遍历,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 深入解析Java中的Classloader的运行机制

    深入解析Java中的Classloader的运行机制

    这篇文章主要介绍了Java中的Classloader的运行机制,包括从JVM方面讲解类加载器的委托机制等,需要的朋友可以参考下
    2015-11-11
  • IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解

    IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解

    查看JAVA字节码有两种方式一种是使用 jdk命令 javap,还有一种就是 使用 插件了,今天给大家分享IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • Spring Boot 使用 Disruptor 做内部高性能消息队列

    Spring Boot 使用 Disruptor 做内部高性能消息队列

    这篇文章主要介绍了Spring Boot 使用 Disruptor 做内部高性能消息队列,工作中遇到项目使用Disruptor做消息队列,对你没看错,不是Kafka,也不是rabbitmq。Disruptor有个最大的优点就是快,还有一点它是开源的哦,下面做个简单的记录
    2022-06-06

最新评论