发布时间:2026/7/22 13:34:10
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/7/22 13:34:10

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

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

2026/7/22 13:34:09

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

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

2026/7/22 13:29:09

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

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

2026/7/22 14:39:14

Tiva™ EMAC MAC地址寄存器与硬件过滤实战解析

1. 项目概述:从寄存器手册到网络数据过滤实战 如果你正在开发基于Tiva™ C系列微控制器的嵌入式网络设备,比如一个工业物联网网关或者一个智能家居的主控节点,那么你肯定绕不开以太网通信。而以太网通信的基石,除了物理层的PHY芯片…

2026/7/22 14:39:14

深入解析C2000 ePWM的Trip-Zone与Digital Compare硬件保护机制

1. 项目概述与核心价值在电机驱动、数字电源或者任何需要高可靠性功率控制的嵌入式系统里,PWM(脉宽调制)信号的稳定与安全是底线。我们通常花大量时间调PID、优化死区,但一个突如其来的过流或短路,如果处理不及时&…

2026/7/22 14:39:14

FreeCAD扫掠操作与参数化建模实战指南

如果你正在学习 FreeCAD,可能已经发现了一个关键问题:为什么跟着教程一步步操作,还是经常卡在某个步骤无法继续?特别是当涉及到"扫掠"、"装配"、"切掉一部分"这些复杂操作时,很多教程只…

2026/7/22 14:39:14

嵌入式以太网硬件核心:EMAC与MDIO架构、原理与驱动开发实战

1. 项目概述:从硬件视角理解嵌入式以太网的基石 在嵌入式系统开发中,实现稳定可靠的以太网通信是连接设备与数字世界的核心能力。无论是工业控制器的数据采集、智能家居设备的远程控制,还是网络设备的内部互联,其底层都离不开两个…

2026/7/22 14:39:14

2026 年最佳笔记平板电脑推荐:满足不同需求与预算!

2026 年最佳笔记平板电脑推荐 在当今数字化世界,人们依赖笔记本电脑、智能手机和平板电脑,手写艺术渐失,但专门记笔记或具备记笔记功能的平板电脑能让人重温手写乐趣。对于偏好书写而非打字的人,这类平板电脑是创意工作和提高效率…

2026/7/22 14:34:14

Tiva™ TM4C129 EPI地址映射与非阻塞读FIFO机制详解

1. 项目概述与核心价值在嵌入式系统开发中,尤其是面对高速数据采集、实时图像处理或大容量数据缓存这类场景时,微控制器(MCU)与外部存储器和外设之间的数据交换效率,往往是决定整个系统性能的瓶颈。传统的阻塞式访问方…

2026/7/22 9:29:13

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/22 0:02:17

抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具

抓包代理链路下的 TLS 指纹变化分析:为什么调试环境会影响访问结果 摘要 在网页调试、接口联调、自动化巡检和授权采集排查中,抓包是常见手段。但很多开发者会遇到一个现象:正常访问页面时没有问题,一进入抓包或代理调试环境&…

2026/7/22 0:02:17

微信QQ聊天记录误删恢复与备份方案全指南

1. 聊天记录误删的常见场景与恢复思路作为一名长期关注数据安全的技术博主,我处理过上百起聊天记录误删的求助案例。手机误操作、系统升级失败、设备损坏是三大常见诱因。上周就遇到用户更新微信时断电,导致近两年的工作群聊记录全部消失的极端案例。不同…

2026/7/22 0:02:17

2026最新8款个人AI编程免费工具深度实测

作为一名全栈独立开发者,我最近半年一直在折腾副业项目,每个月在AI编程工具上的订阅费算下来其实也不算便宜。作为个人开发者,我们追求的就是用最少的成本获得最高效的开发体验。TRAE 基础版免费,字节跳动出品的国内首款 AI 原生 …

2026/7/21 20:02:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…