Mybatis-Plus详解01-代码生成器增删改查基本使用
创始人
2025-05-29 19:08:52
0

文章目录

  • 前言
  • 一、代码生成器
    • 1、简介
    • 2、使用步骤
  • 二、MybatisPlus常用方法
    • 1.基本的CRUD
      • 新增方法
      • 删除方法
      • 修改方法
      • 查询方法
  • 总结


前言

前文已经整合过Mybatis-Plus,本篇记录一下一些Mybatis-Plus一些常用方法的使用


一、代码生成器

1、简介

首先我们来到官网,https://baomidou.com/
在这里插入图片描述
点击快速开始可以看到以下目录
在这里插入图片描述
快速入门可以看上篇文章,https://blog.csdn.net/l_zl2021/article/details/129385836
本次从核心功能开始记录
点击代码生成器(旧),本次以代码生成器旧版作为演示
在这里插入图片描述
mybatis-plus自动生成器旧版适用于3.5.1以下版本,3.5.1以上需要使用新版,新版和旧版并不兼容
代码生成器是mybatis-plus为了简化开发而推出的功能,它的作用就是,只需要设置好相关配置,就可以对某一张数据表一键生成,实体类,控制层,业务层,和持久层的基本代码,不需要我们再一个个的手动创建。接下来看官网的说明

在这里插入图片描述
官网已经给出了核心的配置,可以根据提示去修改成为自己需要的代码生成工具,关于详细的配置,官网也已经给出了说明

2、使用步骤

新建一个SpringBoot项目,不再演示,直接进入导入依赖

com.baomidoumybatis-plus-boot-starter3.4.1com.baomidoumybatis-plus-generator3.4.1org.apache.velocityvelocity-engine-core2.3io.springfoxspringfox-swagger22.9.2io.springfoxspringfox-swagger-ui2.9.2mysqlmysql-connector-java8.0.13com.alibabadruid-spring-boot-starter1.2.9org.springframework.bootspring-boot-starter-weborg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtest

编写配置文件application.yml

#配置连接数据库
spring:datasource:username: 用户名password: 密码driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/库名?serverTimezone=Asia/Shanghai&characterEncoding=utf8type: com.alibaba.druid.pool.DruidDataSource#配置mybatis-plus
mybatis-plus:configuration:#日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#驼峰形式显示map-underscore-to-camel-case: true#扫描mapper.xml文件mapper-locations: classpath:mappers/*.xml

编写代码生成器,这里我放再和启动类的同一级目录下,编写,命名方式无所谓,根据官网给出的文档,整理如下

package com.lzl;import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;import java.util.ArrayList;
import java.util.List;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/3/8 14:23*/
public class MybatisPlusGenerator {public static void main(String[] args) {//代码生成对象AutoGenerator mpg = new AutoGenerator();//默认模拟引擎 Veloctiympg.setTemplateEngine(new VelocityTemplateEngine());// 全局配置GlobalConfig gc = new GlobalConfig();gc.setAuthor("zhenLong");//开发人员名称gc.setOutputDir("项目绝对路径\\src\\main\\java");//代码生成目录gc.setFileOverride(true);// 是否覆盖同名文件,默认是falsegc.setEnableCache(false);// XML 二级缓存gc.setBaseResultMap(true);// XML ResultMapgc.setBaseColumnList(true);// XML columListgc.setServiceName("%sService");//去掉Service的前缀Igc.setSwagger2(true); //实体属性 Swagger2 注解,提前导入 Swagger 依赖mpg.setGlobalConfig(gc);// 数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUsername("数据库用户名");dsc.setPassword("数据库密码");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUrl("jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai");mpg.setDataSource(dsc);// 包配置PackageConfig pc = new PackageConfig();pc.setParent("com.lzl");//父类包名,和创建项目时起的包名一致//pc.setModuleName("user");//在父类包下再创建一个包(可以设置不同模块生成不同包)//手动设置包名pc.setEntity("pojo");//实体类包名pc.setMapper("mapper");//mapper接口包名pc.setXml("mappers");//mapper.xml文件包名mpg.setPackageInfo(pc);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略:下划线转驼峰strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略, 未指定按照 naming 执行strategy.setEntityLombokModel(true);//实体是否为lombok模型strategy.setRestControllerStyle(true);//生成 @RestController 控制器strategy.setControllerMappingHyphenStyle(true);//驼峰转连字符//strategy.setTablePrefix("t_");//生成代码时类名不带表前缀//手动指定映射表名(不写参数映射所有表)strategy.setInclude("user");//通过表名对当前表生成代码//strategy.setLikeTable(new LikeTable("t_"));//生成以t_开头的多张表的代码mpg.setStrategy(strategy);//解决Mapper.xml生成位置// 自定义配置InjectionConfig cfg = new InjectionConfig() {@Overridepublic void initMap() {// to do nothing}};// 如果模板引擎是 freemarker// String templatePath = "/templates/mapper.xml.ftl";// 如果模板引擎是 velocityString templatePath = "/templates/mapper.xml.vm";// 自定义输出配置List focList = new ArrayList<>();// 自定义配置会被优先输出focList.add(new FileOutConfig(templatePath) {@Overridepublic String outputFile(TableInfo tableInfo) {// 自定义输出文件名以及位置 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!return "项目的绝对路径/src/main/resources/mappers/"+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;}});/*cfg.setFileCreate(new IFileCreate() {@Overridepublic boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {// 判断自定义文件夹是否需要创建checkDir("调用默认方法创建的目录,自定义目录用");if (fileType == FileType.MAPPER) {// 已经生成 mapper 文件判断存在,不想重新生成返回 falsereturn !new File(filePath).exists();}// 允许生成模板文件return true;}});*/cfg.setFileOutConfigList(focList);mpg.setCfg(cfg);// 配置模板TemplateConfig templateConfig = new TemplateConfig();// 配置自定义输出模板//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别// templateConfig.setEntity("templates/entity2.java");// templateConfig.setService();// templateConfig.setController();templateConfig.setXml(null);//不生成系统配置的xml文件mpg.setTemplate(templateConfig);// 执行生成mpg.execute();}
}

配置完成,点击运行mian方法即可,注意,一定要开启数据库服务,如下:
在这里插入图片描述
生成完成,检查目录结构如下:
在这里插入图片描述

需要注意的是,生成器可以自动生成Swagger注解的实体类,但某些注解还是需要自己手动添加,例如,有参和无参构造,和持久层接口的@Repository
在这里插入图片描述

二、MybatisPlus常用方法

1.基本的CRUD

mybatis-plus帮我们自动生成的mapper.xml映射文件中,已经有了基本的resultMap结果集映射,和sql片段。当mybaits-plus内部封装的基本CRUD方法无法满足业务需求的时候需要我们自己按照mybatis的方法进行手动编写除此之外

在这里插入图片描述
(报红是插件的问题,不影响使用)

mybatis-plus内部帮我们封装了基本上所有的基础CRUD,我们可以在代码生成器的基础上,直接调用mapper层的方法,如果需要增加额外的业务逻辑,例如,对传给前端的数据返回格式进行加工。最好还是在service业务层的实现类进行额外逻辑代码的编写。

官方给出的说明
在这里插入图片描述
在这里插入图片描述

新增方法

我需要对返回值进行改造,所以还是在service业务层的中间稍微做了一些编码工作,如果不需要改造,可以直接调用持久层接口,或者改造返回值的任务交给Controller层,这个看个人喜好

controller层

package com.lzl.controller;import com.lzl.pojo.User;
import com.lzl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Map;/*** 

* 前端控制器*

** @author zhenLong* @since 2023-03-08*/ @RestController @RequestMapping("/user") public class UserController {@Autowiredprivate UserService service;@RequestMapping("/insert")public Map insert(User user){return service.addNew(user);} }

ServiceImpl

package com.lzl.service.impl;import com.lzl.pojo.User;
import com.lzl.mapper.UserMapper;
import com.lzl.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;/*** 

* 服务实现类*

** @author zhenLong* @since 2023-03-08*/ @Service public class UserServiceImpl extends ServiceImpl implements UserService {@Autowiredprivate UserMapper mapper;@Overridepublic Map addNew(User user) {Map map = new HashMap<>();int key = mapper.insert(user);//mapper接口自带的新增方法,直接调用if(key != 0){map.put("code",0);map.put("msg","新增成功!");}else {map.put("code",1);map.put("msg","新增失败!");}return map;} }

此时,我的mapper接口没有写任何代码,接着运行项目,打开postman进行测试

在这里插入图片描述
新增成功

删除方法

删除方法的controller层就不再展示了,这里只展示ServiceImpl,

 @Overridepublic Map delete(Integer id) {Map map = new HashMap<>();int key = mapper.deleteById(id);if(key != 0){map.put("code",0);map.put("msg","删除成功!");}else {map.put("code",1);map.put("msg","删除失败!");}return map;}

测试,删除刚才我新增的那一条数据

在这里插入图片描述
批量删除
controller层

 @RequestMapping("/deleteList")public Map deleteList(@Param("ids") Integer[] ids){return service.deleteList(ids);}

ServiceImpl

 @Overridepublic Map deleteList(Integer[] ids) {List list = Arrays.asList(ids);Map map = new HashMap<>();int key = mapper.deleteBatchIds(list);if(key != 0){map.put("code",0);map.put("msg","删除成功!");}else {map.put("code",1);map.put("msg","删除失败!");}return map;}

测试
在这里插入图片描述

修改方法

ServiceImpl

 @Overridepublic Map updateInfo(User user) {Map map = new HashMap<>();int key = mapper.updateById(user);//直接调用if(key != 0){map.put("code",0);map.put("msg","修改成功!");}else {map.put("code",1);map.put("msg","修改失败!");}return map;}

在这里插入图片描述

查询方法

查询所有
ServiceImpl

    @Overridepublic Map getAll() {Map map = new HashMap<>();List list = mapper.selectList(null);Integer count = mapper.selectCount(null);if(list.size() != 0){map.put("code",0);map.put("data",list);map.put("count",count);}else {map.put("code",1);map.put("msg","没有数据!");}return map;}

在这里插入图片描述

条件查询+分页

条件查询需要用到Mybatis-plus自定义查询参数对象Wrapper< T >,并且配置分页插件

首先配置分页插件

package com.lzl.config;import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/3/8 16:11*/
@Configuration
public class MybatisPlusConfig {/*** 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//分页插件return interceptor;}}

测试
在这里插入图片描述
模糊查询
controller

 @RequestMapping("/getAllByKeyWords")public Map getAllByKeyWords(String username){return service.getAllByKeyWords(username);}

ServiceImpl

 @Overridepublic Map getAllByKeyWords(String username) {Map map = new HashMap<>();QueryWrapper wrapper = new QueryWrapper<>();wrapper.like("username",username);List list = mapper.selectList(wrapper);if(list.size() != 0){map.put("code",0);map.put("data",list);}else {map.put("code",1);map.put("msg","没有数据!");}return map;}

测试
在这里插入图片描述


总结

本篇记录了Mybatis-plus的代码生成器和基本CRUD方法的使用,更多内容见下篇

相关内容

热门资讯

安卓10系统断网软件,轻松实现... 你有没有遇到过这种情况?手机突然断网了,明明信号满格,却连不上网,急得你团团转。别急,今天就来给你揭...
安卓可以改什么系统版本,体验全... 你有没有想过,你的安卓手机其实可以像换衣服一样,换一个全新的“系统版本”呢?没错,这就是今天我们要聊...
最好的平板游戏安卓系统,畅享指... 亲爱的游戏迷们,你是否在寻找一款能够让你在安卓平板上畅玩无忧的游戏神器?别急,今天我就要给你揭秘,究...
华为安卓系统卡顿解决,华为安卓... 你是不是也遇到了华为安卓系统卡顿的问题?别急,今天就来给你支几招,让你的华为手机重新焕发活力!一、清...
安卓建议升级鸿蒙系统吗,探讨鸿... 亲爱的安卓用户们,最近是不是被鸿蒙系统的新鲜劲儿给吸引了?是不是在犹豫要不要把你的安卓手机升级成鸿蒙...
安卓如何变苹果系统桌面,桌面系... 你有没有想过,把你的安卓手机变成苹果系统桌面,是不是瞬间高大上了呢?想象那流畅的动画效果,那简洁的界...
windows平板安卓系统升级... 你有没有发现,最近你的Windows平板电脑突然变得有些不一样了?没错,就是那个一直默默陪伴你的小家...
安卓系统扩大运行内存,解锁更大... 你知道吗?在科技飞速发展的今天,手机已经成为了我们生活中不可或缺的好伙伴。而手机中,安卓系统更是以其...
安卓系统怎么改变zenly,探... 你有没有发现,你的安卓手机上的Zenly应用最近好像变得不一样了?没错,安卓系统的大手笔更新,让Ze...
英特尔安卓子系统,引领高效移动... 你有没有想过,手机里的安卓系统竟然也能和电脑上的英特尔处理器完美结合呢?这可不是天方夜谭,而是科技发...
永远会用安卓系统的手机,探索安... 亲爱的手机控们,你是否也有那么一款手机,它陪伴你度过了无数个日夜,成为了你生活中不可或缺的一部分?没...
有哪些安卓手机系统好用,好用系... 你有没有发现,现在手机市场上安卓手机的品牌和型号真是琳琅满目,让人挑花了眼?不过别急,今天我就来给你...
卡片记账安卓系统有吗,便捷财务... 你有没有想过,用手机记账是不是比拿着小本本记录来得方便多了?现在,手机上的应用层出不穷,那么,有没有...
武汉摩尔影城安卓系统APP,便... 你有没有想过,一部手机就能带你走进电影的世界,享受大屏幕带来的震撼?今天,就让我带你详细了解武汉摩尔...
联想刷安卓p系统,畅享智能新体... 你有没有发现,最近联想的安卓P系统刷机热潮可是席卷了整个互联网圈呢!这不,我就迫不及待地来和你聊聊这...
mac从安卓系统改成双系统,双... 你有没有想过,你的Mac电脑从安卓系统改成双系统后,生活会有哪些翻天覆地的变化呢?想象一边是流畅的苹...
kindke安卓系统激活码,激... 亲爱的读者,你是否在寻找一款能够让你手机焕然一新的操作系统?如果你是安卓用户,那么今天我要给你带来一...
萤石云监控安卓系统,安卓系统下... 你有没有想过,家里的安全可以随时随地掌握在手中?现在,有了萤石云监控安卓系统,这不再是梦想啦!想象无...
手机安卓系统会不会爆炸,系统升... 手机安卓系统会不会爆炸——一场关于安全的探讨在当今这个数字化的世界里,手机已经成为我们生活中不可或缺...
安卓系统双清详图解,恢复出厂设... 你有没有遇到过手机卡顿、运行缓慢的问题?别急,今天就来给你详细解析一下安卓系统的“双清”操作,让你的...