当前位置: 首页 > 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.jsqmd.com/news/944896/

相关文章:

  • 基于Arduino与BVM的简易呼吸机自动化方案:开源硬件在应急医疗中的应用
  • Kronos金融基础模型:用AI语言解读市场脉搏的实战指南
  • Rocketmq学习第三篇
  • 全自动评论系统精确度记录分析
  • 求推荐!适配知网查重,国内靠谱的 AI 论文写作辅助网站有哪些?
  • 2026年天津离婚律师怎么挑选?关键5个要点避免踩雷 - 本地品牌推荐
  • 保姆级避坑指南:Ubuntu 20.04/22.04 安装NVIDIA驱动,告别黑屏和循环登录
  • 基于低复杂度自适应信号处理的波束成形技术解析【附代码】
  • 适配食安检测标准!云克隆全链条自研技术赋能行业质控
  • CentOS 8停服后,yum报错‘No URLs in mirrorlist’的三种修复姿势(附Vault源配置)
  • 2026应届生降AI率软件盘点:深度消痕+保护隐私哪家强?
  • 告别‘无声’烦恼:手把手教你用USB麦克风(UAC 2.0)在Windows 10上实现完美录音
  • 从文库到成药:核酸适配体费用与多肽筛选市场价
  • AI Agent 的三次进化
  • 性价比优先!盘点平价好用的国产 AI 写作网站,应届学生党收藏
  • 北京沙发翻新换皮换布2026年本地靠谱推荐——匠阁、御匠、锦修三大品牌详解,服务区域覆盖北京各区,专业沙发翻新换皮换布一站式解决方案 - 我叫一
  • WSL2图形化桌面避坑实录:解决Gnome仅Root可用、VcXsrv连接失败与CUDA驱动冲突
  • HS2-HF_Patch:Honey Select 2汉化优化补丁的终极解决方案
  • Luyten Java反编译工具:5分钟快速上手与核心功能详解
  • 给全自动评论系统添加 点赞 收藏 关注 功能
  • Qwen3.6-35B-A3B-APEX-MTP-GGUF新手入门:从下载到运行的5分钟快速教程
  • 企业无线网络配置不求人:手把手教你用神州数码DCWS-6028 AC搞定三层发现(附Option 43配置详解)
  • 基于视觉与图像的植物信息采集与处理技术解析【附代码】
  • HPLT BERT Base LV实战教程:从文本分类到问答系统的完整应用
  • 鸿蒙Flutter三级联动选择器技术详解:省市区级联选择实现方案
  • 终极解决方案:3分钟搞定Windows热键冲突检测
  • 如何快速地拥有一个帮你管理知识库的agent
  • 2026广州GEO优化公司怎么选?实测五家服务商,这份选型指南帮你避坑 - GEO优化
  • 技术模拟的“四诊仪”,为何永远无法触及中医的灵魂?
  • Mermaid在线编辑器终极指南:如何用代码思维重塑可视化工作流