前言:上一篇我们讲解了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执行 updatebyid、deletebyid 等方法时,需要知道哪个字段是主键
如果没有标记,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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论