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

MyBatis+MyBatis-Plus 全套 CRUD 数据库实战

MyBatis+MyBatis-Plus 全套 CRUD 数据库实战

写 SQL 写到怀疑人生?MyBatis-Plus 了解一下——连 XML 都能省掉大半,CRUD 写得像点菜一样简单。

一、MyBatis vs MyBatis-Plus:一对亲兄弟

很多新手以为 MyBatis-Plus 是 MyBatis 的替代品,其实它是增强工具包,在 MyBatis 基础上做了大幅强化。两者的关系可以这么理解:

对比维度MyBatisMyBatis-Plus
SQL 编写XML / 注解手写 SQL内置 CRUD,零 SQL 完成基本操作
分页手动写 LIMIT + COUNT分页插件一行搞定
条件查询手写 WHERE 拼接QueryWrapper 链式调用
代码生成AutoGenerator 一键生成
主键策略手动处理@TableId 注解,雪花算法/自增按需选

一句话总结:MyBatis-Plus 只做增强不做改变,引入它不会影响你原有的 MyBatis 代码,丝滑升级。

二、数据库准备

先搞定 MySQL。假设你已有 MySQL 环境,执行以下建库建表 SQL:

CREATEDATABASEIFNOTEXISTSdemo_dbDEFAULTCHARSETutf8mb4;USEdemo_db;CREATETABLE`user`(`id`BIGINTNOTNULLAUTO_INCREMENTCOMMENT'主键',`username`VARCHAR(50)NOTNULLCOMMENT'用户名',`age`INTDEFAULTNULLCOMMENT'年龄',`email`VARCHAR(100)DEFAULTNULLCOMMENT'邮箱',`create_time`DATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户表';

三、SpringBoot 整合 MyBatis-Plus

3.1 pom.xml 依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

3.2 application.yml 配置

spring:datasource:url:jdbc:mysql://localhost:3306/demo_db?useUnicode=true&characterEncoding=utf8mb4username:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Drivermybatis-plus:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl# 控制台打印SQLmapper-locations:classpath:mapper/*.xml# XML映射文件路径(没用XML可省略)

四、实体类注解:字段映射三板斧

@Data@TableName("user")// 映射表名,类名和表名一致可省略publicclassUser{@TableId(type=IdType.AUTO)// 主键策略:AUTO=数据库自增, ASSIGN_ID=雪花算法privateLongid;@TableField("username")// 字段名映射,驼峰自动转下划线时可省略privateStringusername;privateIntegerage;privateStringemail;@TableField(fill=FieldFill.INSERT)privateLocalDateTimecreateTime;}

三个核心注解:

  • @TableName:指定表名,类名转下划线和表名一致时不用写
  • @TableId:主键注解,IdType.AUTO 是数据库自增,ASSIGN_ID 是雪花算法(分布式推荐)
  • @TableField:字段映射,exist=false ��排除非数据库字段

五、BaseMapper 内置 CRUD——零 SQL 数据库操作

只需定义一个 Mapper 接口继承BaseMapper<T>,所有基础 CRUD 开箱即用:

@MapperpublicinterfaceUserMapperextendsBaseMapper<User>{// 继承BaseMapper后,以下方法全部免费获得,不需要写一行代码}

内置方法速览:

// 插入userMapper.insert(user);// 根据ID删除userMapper.deleteById(1L);// 根据ID更新userMapper.updateById(user);// 根据ID查询Useruser=userMapper.selectById(1L);// 查询全部List<User>list=userMapper.selectList(null);// 批量查询List<User>users=userMapper.selectBatchIds(Arrays.asList(1L,2L,3L));

deleteById举例:MyBatis-Plus 自动生成DELETE FROM user WHERE id = ?,你一行 SQL 都不用写。

六、条件构造器:QueryWrapper 链式查询杀器

当查询条件复杂起来,光靠selectList(null)可不够,这时条件构造器登场:

// QueryWrapper 写法(直接写数据库字段名)QueryWrapper<User>query=newQueryWrapper<>();query.eq("age",25)// age = 25.like("email","@qq.com")// email LIKE '%@qq.com%'.ge("create_time","2024-01-01").orderByDesc("id");List<User>list=userMapper.selectList(query);

更推荐LambdaQueryWrapper,用 lambda 表达式避免字段名字符串硬编码:

LambdaQueryWrapper<User>lambda=newLambdaQueryWrapper<>();lambda.eq(User::getAge,25).like(User::getEmail,"@qq.com").in(User::getId,Arrays.asList(1L,2L,3L)).orderByDesc(User::getCreateTime);List<User>list=userMapper.selectList(lambda);// 自动生成SQL:SELECT * FROM user WHERE age = ? AND email LIKE ? AND id IN (?,?,?) ORDER BY create_time DESC

常用条件函数:

  • eq等于 /ne不等于
  • gt大于 /ge大于等于 /lt小于 /le小于等于
  • like模糊查询 /notLike不匹配
  • in包含 /notIn不包含
  • isNull为空 /isNotNull不为空
  • orderByAsc升序 /orderByDesc降序
  • between区间查询

七、分页插件配置

MyBatis-Plus 的分页功能需先注册插件:

@ConfigurationpublicclassMybatisPlusConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}

使用分页只需两行:

Page<User>page=newPage<>(1,10);// 第1页,每页10条Page<User>result=userMapper.selectPage(page,null);System.out.println("总记录数:"+result.getTotal());System.out.println("总页数:"+result.getPages());System.out.println("当前页数据:"+result.getRecords());

输出的 SQL 会自动拼接LIMIT 0,10SELECT COUNT(*),免去手写分页的繁琐。

八、完整 CRUD 实战:Controller + Service + Mapper

下面给出标准的 Controller-Service-Mapper 三层写法:

// Mapper 层@MapperpublicinterfaceUserMapperextendsBaseMapper<User>{}// Service 接口publicinterfaceUserServiceextendsIService<User>{}// Service 实现@ServicepublicclassUserServiceImplextendsServiceImpl<UserMapper,User>implementsUserService{}// Controller 层@RestController@RequestMapping("/user")publicclassUserController{@AutowiredprivateUserServiceuserService;@PostMappingpublicResultadd(@RequestBodyUseruser){userService.save(user);// IService 提供的 save 方法returnResult.ok();}@DeleteMapping("/{id}")publicResultdelete(@PathVariableLongid){userService.removeById(id);returnResult.ok();}@PutMappingpublicResultupdate(@RequestBodyUseruser){userService.updateById(user);returnResult.ok();}@GetMapping("/{id}")publicResultgetById(@PathVariableLongid){returnResult.ok(userService.getById(id));}@GetMapping("/page")publicResultpage(@RequestParamintcurrent,@RequestParamintsize){Page<User>page=newPage<>(current,size);LambdaQueryWrapper<User>wrapper=newLambdaQueryWrapper<>();wrapper.orderByDesc(User::getCreateTime);returnResult.ok(userService.page(page,wrapper));}}

是的,Service 层也继承了IServiceServiceImpl,同样获得一套现成的 CRUD,连 Service 都不用写逻辑——典型的偷懒利器。

九、常见问题排查

问题一:字段映射不生效

检查mybatis-plus.configuration.map-underscore-to-camel-case是否设为 true(默认就是 true),确认实体字段和数据库字段的驼峰-下划线对应关系。

问题二:分页不生效

最容易踩的坑——分页插件没注册。检查是否有@Configuration类注入MybatisPlusInterceptor并添加PaginationInnerInterceptor。没有这个 Bean,MyBatis-Plus 不做任何分页干预,Page对象就是个摆设。

问题三:updateById 只更新了部分字段

MyBatis-Plus 默认的更新策略是NOT_NULL,即实体字段为 null 时不更新。如果想把某个字段更新为 null,需要在字段上加@TableField(updateStrategy = FieldStrategy.IGNORED)


MyBatis-Plus 的价值在于把重复劳动自动化,让你聚焦核心业务逻辑。从 BaseMapper 到 IService,从条件构造器到分页插件,每一步都在践行"开发者体验优先"。当然也别因为太方便就忘了学原生 SQL——调试时看不懂控制台打印的 SQL,等于白搭。

http://www.jsqmd.com/news/1290520/

相关文章:

  • 2026模具制造五轴联动加工中心品牌排行一览 - 起跑123
  • 2026年国内环保无甲醛实木家具品牌排行一览 - 起跑123
  • 大厂面试,自进化 agent 正在成为主流!
  • 2026年国内分体灯杆靠谱生产合作方推荐指南 - 起跑123
  • 氯化钙厂家有哪些2026年源头直供怎么选更稳妥 - 品牌优推
  • 2026年7月最新长沙封窗机构一览 工艺口碑维度排行 - 起跑123
  • Java编码utf-8的坑,踩得我头破血流
  • 2026 五金加工场景下钣金喷涂一体化厂家哪家好 - 起跑123
  • 2026保姆级图片换背景教程:手机电脑免费工具+Photoshop完整操作步骤 - 工具软件使用方法推荐
  • 为什么97.3%的提示词迭代失败?——批判性反馈缺失引发的反馈衰减链(附NASA式根因分析模板)
  • 宁夏锚具生产商怎么选才靠谱?看这几点就对了 - 热点品牌推荐
  • 冲孔网工厂推荐几家?按这几点选不踩坑 - 热点品牌推荐
  • 2026年废气处理设备品牌厂商推荐几家怎么选? - 热点品牌推荐
  • GraphRAG 上线后崩盘了,问题不在模型,而在权限与日志的缺失
  • 2026国际货运代理公司哪家靠谱 行业选择参考指南 - 起跑123
  • 容量测试到底测什么——一次对话理清同时在线和并发请求
  • AI做B站教程的致命误区:92%新人踩坑的3类违规素材、2种语音模型、1个元数据雷区
  • Java写的学生管理系统,竟藏着这么多秘密
  • 什么是“外部结果”?
  • 【单片机课设毕设项目】 嵌入式 STM32 平台下 PM2.5 监测与声光报警系统设计, 基于单片机四按键交互的空气质量调控终端搭建010301
  • 2026年8月最新性价比高的柔性电缆应用场景相关推荐 - 起跑123
  • 破解电阻对焊机行业痛点:PPS三维全链路定制方法论如何实现高效降本? - 全域品牌推荐
  • 业务拓展期如何筛选合适的上海平台推荐 - 热点品牌推荐
  • 2026北京门窗/保温门窗定做厂家怎么选?源头厂家选购指南与实用攻略 - mobible
  • 深水打捞队怎么选择?看这几点避开坑保安全 - 热点品牌推荐
  • 爬虫工程师转大模型:采集能力如何变成真正的 AI 竞争力?
  • Path of Building PoE2:免费离线角色构建规划器完整教程
  • 2026乌鲁木齐酱酒口碑推荐:龙国宴口粮酒,高品质礼品酒选择 - mobible
  • 体验家 XMPlus 新零售全渠道融合体验管理:线上线下体验落差检测与一致性运营
  • 2026天津诚信高考志愿填报热门机构排行名单汇总 - 起跑123