MyBatis-Plus入门指南:简化Java数据库开发

发布时间:2026/9/8 17:14:24

MyBatis-Plus入门指南:简化Java数据库开发 1. 项目概述作为一名长期奋战在一线的Java开发者我深知数据库操作在业务开发中的重要性。传统MyBatis虽然灵活但每次都要手动编写XML映射文件和SQL语句对于简单的CRUD操作来说实在太过繁琐。直到遇见了MyBatis-Plus这个MyBatis的增强工具彻底改变了我的开发方式。最近在团队内部做技术分享时我发现很多刚接触MyBatis-Plus的同事特别是那些SQL基础不太扎实的开发者经常会被一些基础问题困扰如何快速实现增删改查条件查询该怎么写分页功能如何实现这些问题看似简单但如果没有掌握正确的方法确实会让人头疼。2. 环境搭建与配置2.1 依赖引入首先我们需要在项目中引入必要的依赖。如果你使用的是Maven项目在pom.xml中添加以下依赖dependencies !-- MyBatis-Plus Starter -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency !-- MySQL驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- Lombok可选但强烈推荐 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies提示建议使用Lombok来简化实体类的getter/setter方法这能让代码更加简洁。2.2 配置文件设置在application.yml中配置数据源和MyBatis-Plus相关设置spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useUnicodetruecharacterEncodingutf8serverTimezoneUTC username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true # 开启下划线转驼峰 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志 global-config: db-config: id-type: auto # 主键自增策略 logic-delete-field: is_deleted # 逻辑删除字段 logic-delete-value: 1 # 已删除值 logic-not-delete-value: 0 # 未删除值2.3 启动类配置别忘了在SpringBoot启动类上添加Mapper扫描注解SpringBootApplication MapperScan(com.yourpackage.mapper) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }3. 基础CRUD实现3.1 实体类定义我们先定义一个用户实体类对应数据库中的user表Data TableName(user) public class User { TableId(type IdType.AUTO) private Long id; private String username; private String password; private Integer age; private String email; TableLogic private Integer isDeleted; TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }3.2 Mapper接口创建Mapper接口继承BaseMapper即可获得基础的CRUD方法public interface UserMapper extends BaseMapperUser { // 无需编写任何方法BaseMapper已经提供了基础CRUD功能 }3.3 Service层实现Service层同样可以继承IService接口来简化开发public interface UserService extends IServiceUser { // 可以在这里定义业务特有的方法 } Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { // 基础方法已经由ServiceImpl实现 }3.4 控制器实现现在我们可以轻松实现CRUD接口了RestController RequestMapping(/users) public class UserController { Autowired private UserService userService; // 新增用户 PostMapping public boolean addUser(RequestBody User user) { return userService.save(user); } // 根据ID查询用户 GetMapping(/{id}) public User getUserById(PathVariable Long id) { return userService.getById(id); } // 更新用户 PutMapping public boolean updateUser(RequestBody User user) { return userService.updateById(user); } // 删除用户逻辑删除 DeleteMapping(/{id}) public boolean deleteUser(PathVariable Long id) { return userService.removeById(id); } // 查询所有用户 GetMapping public ListUser listUsers() { return userService.list(); } }4. 条件查询与分页4.1 条件构造器使用MyBatis-Plus提供了强大的条件构造器可以轻松实现复杂查询// 查询年龄大于20且用户名包含张的用户 public ListUser queryUsers() { QueryWrapperUser queryWrapper new QueryWrapper(); queryWrapper.gt(age, 20) .like(username, 张); return userService.list(queryWrapper); } // 更推荐使用Lambda方式避免字段名写错 public ListUser queryUsersLambda() { LambdaQueryWrapperUser lambdaQueryWrapper new LambdaQueryWrapper(); lambdaQueryWrapper.gt(User::getAge, 20) .like(User::getUsername, 张); return userService.list(lambdaQueryWrapper); }4.2 分页查询实现首先需要配置分页插件Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }然后就可以在Service中使用分页查询了public IPageUser pageUsers(int current, int size) { PageUser page new Page(current, size); return userService.page(page); } // 带条件的分页查询 public IPageUser pageUsersWithCondition(int current, int size) { PageUser page new Page(current, size); LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper(); queryWrapper.gt(User::getAge, 20); return userService.page(page, queryWrapper); }5. 常见问题与解决方案5.1 字段映射问题问题现象数据库字段user_name无法映射到实体类userName查询结果为null。解决方案确保配置文件中开启了map-underscore-to-camel-case: true或者在实体类字段上添加TableField(user_name)注解5.2 逻辑删除失效问题现象调用removeById方法后数据被物理删除而非逻辑删除。解决方案确保实体类中逻辑删除字段添加了TableLogic注解检查配置文件中是否正确配置了逻辑删除字段名和值确保使用的是MyBatis-Plus提供的remove方法而非直接使用MyBatis的delete方法5.3 分页查询不生效问题现象分页查询返回了所有数据而非分页结果。解决方案确认已正确配置分页插件确保查询使用的是page()方法而非list()方法检查是否传入了Page对象作为参数5.4 自动填充不生效问题现象createTime和updateTime字段没有自动填充。解决方案创建一个MetaObjectHandler实现类Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }确保实体类字段上有TableField(fill FieldFill.INSERT)或TableField(fill FieldFill.INSERT_UPDATE)注解6. 高级技巧与最佳实践6.1 代码生成器使用MyBatis-Plus提供了强大的代码生成器可以一键生成Entity、Mapper、Service、Controller等代码public class CodeGenerator { public static void main(String[] args) { FastAutoGenerator.create(jdbc:mysql://localhost:3306/your_db, username, password) .globalConfig(builder - { builder.author(yourname) .outputDir(System.getProperty(user.dir) /src/main/java); }) .packageConfig(builder - { builder.parent(com.yourpackage) .entity(entity) .mapper(mapper) .service(service) .controller(controller); }) .strategyConfig(builder - { builder.addInclude(user, order) // 要生成的表 .addTablePrefix(t_) // 表前缀过滤 .entityBuilder() .enableLombok() .controllerBuilder() .enableRestStyle(); }) .templateEngine(new VelocityTemplateEngine()) .execute(); } }6.2 批量操作优化对于批量插入、更新等操作MyBatis-Plus提供了批量操作方法// 批量插入 ListUser userList new ArrayList(); // 添加多个用户到list boolean success userService.saveBatch(userList); // 批量更新 boolean success userService.updateBatchById(userList);提示批量操作时建议控制每批次的数据量一般1000条左右比较合适避免单次操作数据量过大。6.3 自定义SQL虽然MyBatis-Plus提供了强大的CRUD功能但复杂查询还是需要自定义SQL在Mapper接口中定义方法Select(SELECT * FROM user WHERE age #{age}) ListUser selectUsersOlderThan(Param(age) Integer age);或者在XML中编写复杂SQL!-- UserMapper.xml -- select idselectComplexUsers resultTypecom.yourpackage.entity.User SELECT * FROM user WHERE age #{minAge} AND username LIKE CONCAT(#{keyword}, %) ORDER BY create_time DESC /select7. 性能优化建议合理使用索引为经常查询的字段建立索引特别是WHERE条件和ORDER BY中使用的字段。避免全表扫描尽量使用条件查询限制返回的数据量。分页查询优化对于大数据量表避免使用select *只查询需要的字段。批量操作尽量使用批量插入、更新代替循环单条操作。缓存策略对于不经常变动的数据考虑使用缓存减少数据库访问。SQL监控开发环境开启SQL日志生产环境使用监控工具分析慢查询。在实际项目中我通常会结合以上各种技术根据业务场景选择最合适的实现方式。MyBatis-Plus确实大大简化了数据库操作让开发者能够更专注于业务逻辑的实现。
延伸阅读

更多相关文章

2026/9/5 7:14:11

山西广告标识免费上门测量设计

在山西,广告标识类服务市场需求日益增长。越来越多的企业、商家开始重视自身形象的展示,广告标识作为重要的视觉传达元素,其设计和制作的质量直接影响着品牌的传播效果。而市场上部分广告加工厂推出的免费上门测量设计服务,更是备…

2026/9/4 13:35:53

经验丰富的3D墙绘施工队

经验丰富的3D墙绘施工队,打造典彩创意网红3D地面彩绘在当今充满创意与个性的时代,3D墙绘及3D地面彩绘以其独特的视觉效果,成为了城市景观、商业空间、家庭装饰等领域的热门选择。而一支经验丰富的3D墙绘施工队,对于打造出令人惊艳…

2026/9/6 3:08:23

移动端Web开发调试:Chrome远程调试实战指南

1. 移动端Web开发调试痛点与解决方案作为一名长期奋战在一线的移动端开发者,我深刻理解在真机环境下调试网页的种种不便。手机屏幕尺寸限制、触控交互差异、网络环境多变等因素,都让传统的alert调试和PC模拟器显得力不从心。而Chrome远程调试&#xff08…

2026/9/8 17:14:14

SystemVerilog验证工程实践:接口、约束随机与断言避坑指南

前几天帮同事排查一个验证环境编译问题,报错信息是“identifier ‘cfg’ has unknown type”。这是个很典型的SystemVerilog使用习惯问题:大家从Verilog切过来,语法上是上手了,但工程组织方式还停留在“全局信号宏替换”的老思路上…

2026/9/8 17:14:14

在职提升金融+管理能力,从厘清深造规划的底层逻辑开始

在职场上,尤其是金融与实业领域,中层管理者常面临一个现实困境:业务能力扎实,但面对战略决策、跨部门协同或产业升级时,明显感到“金融管理”复合能力的短板。想通过深造补齐短板,却发现高端教育项目信息庞…

2026/9/8 17:14:14

Isaac 0.5:感知的缩放控制(下)

26年8月来自Perception AI公司的论文“Isaac 0.5: Percepts Scale Control”。 Isaac 0.5 是一个拥有 360 亿个参数的开放权重具身基础模型,它将视频感知、具身视觉推理和机器人控制统一到一个稀疏骨干网络中。所有输出都来自同一个共享表示:该模型通过一…

2026/9/8 17:09:14

ISO26262功能安全: HARA实战后半程—S/E/C评分ASIL判定与SG输出

个人主页:云纳星辰怀自在 座右铭:“所谓坚持,就是觉得还有希望!” 前言 案例:某BMS项目HARA评审会上,团队对“BMS通信丢失导致过充”这一危害事件的ASIL等级争论不休。A工程师认为“电池过充很危险&#xf…

2026/9/8 7:15:10

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/8 7:15:10

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/8 0:01:49

踩多轮坑才跑通|OpenClaw 3.1.0 双平台本地 AI 自动化搭建实操实录

🔹 工具简述 OpenClaw 是一款备受开发者与办公人群青睐的开源本地智能工具,凭借离线本地运行、可视化图形面板、全流程自主任务处理三大核心特点,积累了众多忠实用户。与普通对话类 AI 产品不同,它能够直接调用电脑的软硬件操作权…

2026/9/8 0:01:50

拒绝复杂命令行,Hermes Agent 一键包快速解锁智能办公能力

🔍前言 不少想要体验 Hermes Agent 办公能力的使用者,往往会被复杂的环境配置拦住使用脚步。手动下载匹配依赖、反复调整系统目录、处理命令行持续报错、修复权限异常、补全丢失核心文件等一系列操作,对普通使用者而言门槛较高,很…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/7 22:45:59

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码