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

MyBatis-Plus实用指南:玩转自动化与高效CRUD

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了丰富的功能,如代码生成器、通用 CRUD、分页、乐观锁、逻辑删除等,极大地提升了开发体验。


目录

  • 快速开始
  • 常用注解
    • @TableName
    • @TableId
    • @TableField
    • @TableLogic
    • @Version
  • 分页查询
  • 条件查询
  • 代码生成器
  • 参考资料

快速开始

1. 添加依赖

pom.xml 中引入 MyBatis-Plus 依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>
</dependency>

2. 配置数据库连接

application.yml 中配置数据库信息:

spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/test

3. 创建 Mapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

4. 使用示例

@SpringBootTest
public class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void selectTest(){User user = userMapper.selectById(3);System.out.println(user);}
}

常用注解

@TableName

用于指定实体类对应的数据库表名。

@TableName("user")
public class User { ... }

@TableId

用于指定主键字段及主键策略。

可选值描述
AUTO数据库主键自增
NONE未显式设置主键类型(跟随全局,全局默认≈INPUT)
INPUT插入前需手动调用 setId() 赋值
ASSIGN_ID由 MyBatis-Plus 分配雪花 ID(Long/Integer/String)
ASSIGN_UUID由 MyBatis-Plus 分配 UUID(String)
@TableId(type = IdType.AUTO)
private Long id;

@TableField

用于指定字段与数据库列的映射关系。

属性名默认值描述
value“”指定数据库列名(与实体字段名不一致时使用)
existtrue是否为数据库表字段(false 表示实体字段不对应列)
selecttrue查询时是否包含该字段(false 表示排除在 select 外)
@TableField(value = "user_name")
private String name;

@TableLogic

用于实现逻辑删除,即数据不会被物理删除,而是通过标记字段(如 deleted)来表示删除状态。

配置方式一:注解 + 配置
  1. 配置全局逻辑删除值

    mybatis-plus:global-config:db-config:logic-delete-value: 1             # 已删除logic-not-delete-value: 0         # 未删除
    
  2. 实体类字段加注解

    @TableLogic
    private String deleted;
    
配置方式二:全局字段配置(3.4.0+)

只需在配置文件中指定逻辑删除字段名,无需在实体类加注解:

mybatis-plus:global-config:db-config:logic-delete-field: deleted       # 全局逻辑删除字段名logic-delete-value: 1logic-not-delete-value: 0

注意: 需 MyBatis-Plus 3.4.0 及以上版本。

工作原理
  • 删除操作:deleteById 等方法会将 deleted 字段设为 1,而不是物理删除。
  • 查询操作:自动加上 deleted = 0 条件,只查未删除数据。

@Version

用于实现乐观锁,防止并发更新时数据被“脏覆盖”。

使用方法
  1. 数据库表需有 version 字段,初始值为 1。

  2. 实体类字段加 @Version 注解:

    @Version
    private Integer version;
    
  3. 更新时,MyBatis-Plus 会自动在 SQL 中带上 version 条件,并在更新成功后将 version +1。

工作原理
  • 更新 SQL 示例:

    UPDATE user SET name=?, version=version+1 WHERE id=? AND version=?
    
  • 如果 version 不一致,更新条数为 0,表示更新失败。


分页查询

1. 配置分页插件

@Configuration
public class MpConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

2. 使用分页

void getPage(){Page<User> page = new Page<>(1,5); // 第1页,展示5行userMapper.selectPage(page, null);List<User> records = page.getRecords();
}

条件查询

1. QueryWrapper 用法

// 查询年龄<25,姓赵,按id降序
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lt("age",25).likeRight("name","赵").orderByDesc("id");
List<User> users = userMapper.selectList(wrapper);

2. LambdaQueryWrapper 推荐用法

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.lt(User::getAge,25).likeRight(User::getName,"赵").orderByDesc(User::getId);
List<User> users = userMapper.selectList(wrapper);

推荐使用 Lambda 表达式,避免字段名硬编码,重构更安全。


代码生成器

MyBatis-Plus 提供了代码生成器,可以根据数据库表结构自动生成实体类、Mapper、Service、Controller 等代码,大大提升开发效率。

1. 添加依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.5</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>

2. 编写生成器代码

AutoGenerator mpg = new AutoGenerator();
// 配置数据源、包名、策略等
// mpg.setDataSource(...);
// mpg.setPackageInfo(...);
// mpg.setStrategy(...);
// mpg.setTemplateEngine(new VelocityTemplateEngine());
mpg.execute();

详细用法见 官方文档


参考资料

  • MyBatis-Plus 官方文档

MyBatis-Plus 让 MyBatis 更加易用和高效,掌握其常用注解和功能,可以大幅提升开发效率。建议结合官方文档和视频教程深入学习与实践!

http://www.dtcms.com/a/403019.html

相关文章:

  • 揭开AI神秘面纱:大语言模型原理与Python极简开发
  • cmake详解
  • RabbitMQ-高可用机制
  • 云手机对网络游戏的重要性
  • 莱州做网站设计院一般年薪
  • Java 将 PDF 转换为 HTML:高效解决方案与实践
  • 从Prompt到Answer:详解AI Agent架构中的ReAct模式与工具调用
  • 六、OpenCV中的图像读写
  • 设计案例的网站pc开奖网站建设
  • 10月底实习准备-Mysql(按面试频率准备)
  • Flink Watermark机制解析
  • Windows系统Web UI自动化测试学习系列2--环境搭建--Python-PyCharm-Selenium
  • 实战:基于HarmonyOS 5构建分布式聊天通讯应用
  • 承德网站建设公司网页设计模板设计
  • HCIP-IoT/H52-111 真题详解(章节C),接入技术和网络设计 /Part1
  • 灵画-AI绘画小程序
  • 从拆盒到共创:手办盲盒抽赏小程序的多元体验与文化联结
  • 做网站必须学php吗现在感染症状有哪些
  • 如何在电脑上备份Redmi
  • 云计算实验1——CentOS中hadoop的安装
  • 使用 Captura 和 FFmpeg 配置免费高效的录屏环境
  • FFmpeg安装(Windows)
  • 电子商务网站建设与管理英文网站开发方式演进
  • Jenkins运维之路(共享库集成流水线发布)
  • 论文精读:mmDrive: Fine-grained Fatigue Driving Detection Using mmWave Radar
  • 网站多媒体加载卡顿?视频压缩 + 音频优化,加载速度提升 75% 的实操方法
  • 关于Modbus CRC16生成算法的一些理解
  • Springboot整合Netty的启动方式(二)
  • 17.15 ChatPPT深度拆解:GLM-4多模态引擎如何实现23.6%成本优势碾压竞品?
  • 计算机系毕设代做网站自已建网站卖东西要多少钱