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

实践应用:Spring Boot项目集成Mybatis-Plus

支付成功订单却没了?MyBatis连接池的坑我踩了
如何让 MyBatis 批量插入从5分钟缩短到3秒?我的三个关键优化

写在前面

MyBatis的增强方案确实有不少,甚至有种感觉是现在如果只用 “裸MyBatis”,不来点增强插件都不好意思了。这不,在上一篇文章《Spring Boot项目利用MyBatis Generator进行数据层代码自动生成》 中尝试了一下 MyBatis Generator。这次来点更加先进的 Mybatis-Plus,SQL语句都不用写了,分页也是自动完成,嗯,真香!

数据库准备

DROPTABLEIFEXISTS`dept`;CREATETABLE`dept`(`dept_no`bigint(20)NOTNULLAUTO_INCREMENT,`dept_name`varchar(60)DEFAULTNULL,`dept_source`varchar(60)DEFAULTNULL,PRIMARYKEY(`dept_no`))ENGINE=InnoDBAUTO_INCREMENT=6DEFAULTCHARSET=utf8COMMENT='部门表';--------------------------------Recordsof dept------------------------------INSERTINTO`dept`VALUES('1','开发部','db01');INSERTINTO`dept`VALUES('2','人事部','db01');INSERTINTO`dept`VALUES('3','财务部','db01');INSERTINTO`dept`VALUES('4','市场部','db01');INSERTINTO`dept`VALUES('5','运维部','db01');

MyBatis-Plus加持

  • 工程搭建 (不赘述了)
  • 依赖引入
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version></dependency></dependencies>

主要是 Mybatis Plus、Lombok(不知道Lombok干嘛的?可以看这里)、Druid连接池 等依赖。

  • MyBatis Plus配置

项目配置

server:port:10100# 配置启动端口号 spring:#springboot的配置 datasource:#定义数据源 #127.0.0.1为本机测试的ip,3306是mysql的端口号。serverTimezone是定义时区,照抄就好,mysql高版本需要定义这些东西 #useSSL也是某些高版本mysql需要问有没有用SSL连接 url:jdbc:mysql://127.0.0.1:3306/db01?serverTimezone=GMT%2B8&useSSL=FALSEusername:root #数据库用户名,root为管理员 password:123456#该数据库用户的密码 # 使用druid数据源 type:com.alibaba.druid.pool.DruidDataSource# mybatis-plus相关配置 mybatis-plus:# xml扫描,多个目录用逗号或者分号分隔(告诉Mapper所对应的XML文件位置) mapper-locations:classpath:mapper/*.xml # 以下配置均有默认值,可以不设置 global-config: db-config: #主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; id-type: auto #字段策略 IGNORED:"忽略判断" NOT_NULL:"非 NULL 判断") NOT_EMPTY:"非空判断" field-strategy: NOT_EMPTY #数据库类型 db-type: MYSQL configuration: # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射 map-underscore-to-camel-case: true # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段 call-setters-on-nulls: true # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

新增 MyBatis Plus配置类

@Configuration@MapperScan("com.dhx.mapper")publicclassMybatisPlusConfig{/** * mybatis-plus SQL执行效率插件【生产环境可以关闭】 */@BeanpublicPerformanceInterceptorperformanceInterceptor(){returnnewPerformanceInterceptor();}/** * 分页插件 */@BeanpublicPaginationInterceptorpaginationInterceptor(){returnnewPaginationInterceptor();}}

看到没,几乎零配置啊,下面就可以写业务逻辑了

业务编写

  • 实体类
@Data@TableName("dept")//@TableName中的值对应着表名publicclassDeptimplementsSerializable{privatestaticfinallongserialVersionUID=1L;/** * 主键 * @TableId中可以决定主键的类型,不写会采取默认值,默认值可以在yml中配置 * AUTO: 数据库ID自增 * INPUT: 用户输入ID * ID_WORKER: 全局唯一ID,Long类型的主键 * ID_WORKER_STR: 字符串全局唯一ID * UUID: 全局唯一ID,UUID类型的主键 * NONE: 该类型为未设置主键类型 */@TableId(type=IdType.AUTO)privateLongdeptNo;privateStringdeptName;privateStringdeptSource;}
  • Mapper类
@MapperpublicinterfaceDeptMapperextendsBaseMapper<Dept>{}

这里啥接口方法也不用写,就可以实现增删改查了!

  • Service类

Service接口:

publicinterfaceDeptServiceextendsIService<Dept>{}

Service实现:

@Service@AllArgsConstructorpublicclassDeptServiceImplextendsServiceImpl<DeptMapper,Dept>implementsDeptService{}
  • controller类
@RestController@RequestMapping("/userInfo")publicclassDeptInfoController{@AutowiredprivateDeptServicedeptService;/** * 新增用户信息 */@RequestMapping("/saveInfo")publicObjectsaveInfo(@RequestBodyDeptdept){returndeptService.save(dept);}/** * 批量新增用户信息 */@RequestMapping("/saveInfoList")publicObjectsaveInfoList(@RequestBodyList<Dept>list){//批量保存returndeptService.saveBatch(list);}/** * 根据ID删除用户信息 */@RequestMapping("/deleteInfo")publicObjectdeleteInfo(@RequestBodyDeptdept){returndeptService.removeById(dept);}/** * 更新用户信息 */@RequestMapping("/updateInfo")publicObjectupdateInfo(@RequestBodyDeptdept){//根据实体中的ID去更新,其他字段如果值为null则不会更新该字段,参考yml配置文件returndeptService.updateById(dept);}/** * 新增或者更新用户信息 * @Author Sans * @CreateTime 2019/6/8 16:50 */@RequestMapping("/saveOrUpdateInfo")publicObjectsaveOrUpdate(@RequestBodyDeptdept){//传入的实体类userInfoEntity中ID为null就会新增(ID自增)//实体类ID值存在,如果数据库存在ID就会更新,如果不存在就会新增returndeptService.saveOrUpdate(dept);}/** * 根据ID获取部门信息 * @param dept * @return Dept 部门实体 */@RequestMapping("/getInfo")publicDeptgetInfo(@RequestBodyDeptdept){returndeptService.getById(dept.getDeptNo());}/** * 查询全部信息 * @return List<Dept> 部门实体集合 */@RequestMapping("/getList")publicList<Dept>getList(){returndeptService.list();}/** * 分页查询全部数据 * @Return IPage<Dept> 分页数据 */@RequestMapping("/getInfoListPage")publicIPage<Dept>getInfoListPage(@RequestBodyPagepage){//需要在Config配置类中配置分页插件page.setCurrent(page.getCurrent());//当前页page.setSize(page.getSize());//每页条数returndeptService.page(page);}}

通过以上几个简单的步骤,我们就实现了 Dept表的增删改查,传统 MyBatis的 XML文件一个都不需要写!

实际实验

启动项目


接下来通过Postman来发送增删改查的请求

插入记录

通过Postman随便插入几条记录 POST http://localhost:10100/userInfo/saveInfo

{"deptName":"开发部","deptSource":"db01"}


删除记录

修改记录时同样需要带部门ID,比如删除ID=5那条运维部的记录


修改记录

修改记录时需要带部门ID,比如我们修改开发部那条记录的名字为新开发部门


查询记录(普通查询,下文讲分页查询)

比如,查询全部信息: GET http://localhost:10100/userInfo/getList

最关心的分页问题

首先装配分页插件

/** * 分页插件 */@BeanpublicPaginationInterceptorpaginationInterceptor(){returnnewPaginationInterceptor();}

Controller类

/** * 分页查询全部数据 * @Return IPage<Dept> 分页数据 */@RequestMapping("/getInfoListPage")publicIPage<Dept>getInfoListPage(@RequestBodyPagepage){//需要在Config配置类中配置分页插件page.setCurrent(page.getCurrent());//当前页page.setSize(page.getSize());//每页条数returndeptService.page(page);}

首先装配分页插件

实际实验一下,我们分页查询 的多条记录:

可以看到结果数据中,除了给到当前页数据,还把总记录条数,总页数等一并返回了,很是优雅呢 !

http://www.zskr.cn/news/1456373.html

相关文章:

  • 2026年天津离婚律师怎么挑选?关键5个要点避免踩雷 - 本地品牌推荐
  • 性价比优先!盘点平价好用的国产 AI 写作网站,应届学生党收藏
  • 北京沙发翻新换皮换布2026年本地靠谱推荐——匠阁、御匠、锦修三大品牌详解,服务区域覆盖北京各区,专业沙发翻新换皮换布一站式解决方案 - 我叫一
  • HS2-HF_Patch:Honey Select 2汉化优化补丁的终极解决方案
  • WSL2图形化桌面避坑实录:解决Gnome仅Root可用、VcXsrv连接失败与CUDA驱动冲突
  • 2026广州GEO优化公司怎么选?实测五家服务商,这份选型指南帮你避坑 - GEO优化
  • 终极解决方案:3分钟搞定Windows热键冲突检测
  • 自动点赞成功
  • ThinkPad风扇控制终极指南:用TPFanCtrl2释放你的笔记本潜能
  • 解锁免疫失衡核心密码,Luminex检测多因子全面解析Th细胞亚群调控,武汉云克隆多因子助力免疫疾病研究攻坚
  • 塔机障碍物远距离超声测距方法与识别机理解析方案【附仿真】
  • 如何将手机摄像头变成专业直播设备:DroidCam OBS插件完整教程
  • semi-utils:重构摄影工作流的智能批量水印终极指南
  • 如何快速上手Hy-MT2-1.8B:5分钟部署你的第一个翻译AI
  • RAG技术方案选型:向量索引的数据结构与量化压缩
  • 2026年实测10款降AI率软件推荐:免费与付费全对比,顺利通过AI率检测必看 - 降AI小能手
  • 免疫炎症因子组合(BLC1,CXCL2,IFNg,IL12,IL18,IL6,MIP3b,RANTES,SLC,TNFa),武汉云克隆Luminex多因子方案引领高通量检测新时代
  • Hermes WebUI边缘计算:在边缘设备上部署的完整方案
  • 毕业定稿撞枪口,Turnitin大面积标蓝怎么办?实测5款英文降AIGC神器
  • LLaVA多模态模型完全解析:从视觉语言理解到革命性聊天能力
  • 【绝密架构图解】:头部元宇宙公司正在封存的AI-VR双闭环系统(含ROS2+Unreal Engine 5.3双向语义桥接层源码片段)
  • 每日一个开源项目(第120篇):SkillLens - 微软出品,照亮 AI Agent 技能生命周期的“显微镜”
  • imFile下载管理器:终极架构解析与高效工作流优化指南
  • Agent 系列(11):A2A 协议——Agent 与 Agent 如何协作
  • 2026年6月干线物流自动驾驶「车·路·运·能」一体化综合实力测评
  • 基于LattePanda的DIY Windows 10平板:从硬件选型到3D打印外壳全流程
  • 终极指南:如何快速解锁Cursor AI编程工具试用限制
  • 托马斯·阿尔瓦·爱迪生的故事
  • FanControl终极指南:3步实现Windows系统风扇智能控制
  • Neo-Launcher动画系统深度解析:打造丝滑流畅的Android启动器体验