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

发布时间:2026/10/25 23:56:35

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/10/24 7:09:29

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

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

2026/10/25 1:08:17

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

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

2026/10/25 1:52:10

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

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

2026/10/26 2:20:56

SpringBoot+微信小程序开发养老院预约系统实战

1. 项目概述养老院预约系统是一个典型的互联网养老解决方案,通过微信小程序前端和SpringBoot后端的技术组合,实现了养老机构床位预约、服务选择、家属沟通等核心功能。这个毕设选题紧贴社会老龄化趋势,既具备实际应用价值,又能全面…

2026/10/26 2:20:56

OpenDDS C#封装实战:P/Invoke跨原生DDS发布订阅接入

简介:面向需要在 .NET 环境中使用 OpenDDS 的 C# 开发者,这份 1.0 版封装资料围绕发布/订阅通信展开,覆盖主题、发布者、订阅者等核心对象在 C# 中的类封装,以及基于 UDP 的配置与 QoS 参数设置,可帮助读者在实时数据分…

2026/10/26 2:20:56

存储型XSS攻击防御与Web安全实践

1. 存储型XSS攻击的本质与危害存储型跨站脚本攻击(Stored XSS)是Web安全领域最顽固的威胁之一。与反射型XSS不同,恶意脚本会被永久存储在目标服务器上,每当用户访问被注入的页面时,攻击代码就会自动执行。这种"一…

2026/10/26 2:20:56

Windows平台编译Flash Attention的实战指南

1. Windows 下编译 Flash Attention 的挑战与突破在深度学习领域,Flash Attention 因其高效的内存利用和计算优化而备受关注。然而,Windows 平台上的编译过程却让许多开发者望而却步。不同于 Linux 环境的"开箱即用",Windows 编译 …

2026/10/26 2:20:56

板材封边技术革新:材料、工艺与智能化解决方案

1. 板材封边技术的现状与痛点作为一名在家具制造行业摸爬滚打多年的从业者,我亲眼见证了板材封边技术从手工操作到半自动化再到全自动化的演进过程。当前主流的封边技术主要采用热熔胶(EVA或PUR)配合自动封边机完成,虽然效率相比十…

2026/10/26 2:15:56

全国水系矢量图(CGCS2000投影)ArcGIS实操指南

简介:本资源为全国水系矢量数据集,面向GIS初学者、地理信息专业学生、环境与水利领域研究者及城市规划从业者,提供开箱即用的ArcGIS兼容水系空间数据,支撑水文分析、流域建模、防洪评估与生态保护等实际应用。压缩包共27个文件&am…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力?在传统深度学习模型中,我们常遇到一个根本性问题:模型在处理新任务时,往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”,而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里,但绝大多数人点进去后看到的,是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

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

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

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