MyBatis-Plus:JavaBean 映射原理与乐观锁实战
在开发中,我们常需要把数据库表结构映射到内存中的 Java 对象。MyBatis-Plus 选择 JavaBean 作为核心载体,是因为它完美契合 ORM 的需求:数据封装、赋值取值以及通过反射实现的自省能力。简单来说,JavaBean 就是那个通用的'数据盒子',当它专门用来映射表时,我们就叫它实体类(Entity)。
映射匹配兼容性
MP 执行 SQL 时,确定表名的顺序是:注解 -> 全局策略 -> 实体类名(驼峰转下划线)。但在实际项目中,字段设计往往不会那么完美同步,这时候就需要一些注解来微调。
字段不同步处理
如果表字段和代码属性不一致,可以用 @TableField 指定真实列名。比如:
@TableField(value = "real_column_name")
private String fieldName;
有时候代码里加了新属性,但数据库还没建,不想报错也不想查出来,可以设置 exist = false:
@TableField(exist = false)
private String tempData;
另外,像密码这种敏感字段,默认查询可能会暴露,建议设置 select = false 排除在查询之外。
表名与开发习惯
有些项目是先有表再生成代码,也有些是领域驱动设计先写模型。如果是前者,JavaBean 只是数据的载体;如果是后者,JavaBean 则包含业务逻辑,数据库表反而要适配它。
主键生成策略
主键是记录的'身份证号'。MP 执行更新或删除时,必须明确哪个字段是主键。可以通过 @TableId 的 type 属性来控制生成方式:
- AUTO:依赖数据库自增。
@TableId(type = IdType.AUTO) private Long id; - ASSIGN_ID:分布式雪花算法,适合高并发场景。
@TableId(type = IdType.ASSIGN_ID) private Long id; - INPUT:手动传入,比如订单号。
@TableId(type = IdType.INPUT) private String orderNo; - ASSIGN_UUID:字符串 UUID。
@TableId(type = IdType.ASSIGN_UUID) private String id;
当然,如果不想每个类都写注解,也可以在 yml 里做全局配置。
批量操作与逻辑删除
处理多条记录时,MP 提供了便捷方法。比如根据主键批量删除或查询:
List<Long> ids = Arrays.asList(2L, 3L);
userDao.deleteBatchIds(ids);
List<User> userList = userDao.selectBatchIds(ids);



