# MyBatisPlus **Repository Path**: zhuang-kang/my-batis-plus ## Basic Information - **Project Name**: MyBatisPlus - **Description**: 学习MyBatisPlus所写的代码(后续会更新) - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-23 - **Last Updated**: 2022-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyBatisPlus学习笔记 # 简介 [MyBatis-Plus (opens new window)](https://github.com/baomidou/mybatis-plus)(简称 MP)是一个 [MyBatis (opens new window)](https://www.mybatis.org/mybatis-3/)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 愿景 我们的愿景是成为 MyBatis 最好的搭档,就像 [魂斗罗](https://baomidou.com/img/contra.jpg) 中的 1P、2P,基友搭配,效率翻倍。 ![img](https://img-blog.csdnimg.cn/img_convert/4b45c1fe15e181422a218cf02fa5d382.png) ## [特性](https://baomidou.com/guide/#特性) - **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 - **损耗小**:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 - **强大的 CRUD 操作**:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 - **支持 Lambda 形式调用**:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 - **支持主键自动生成**:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题 - **支持 ActiveRecord 模式**:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作 - **支持自定义全局通用操作**:支持全局通用方法注入( Write once, use anywhere ) - **内置代码生成器**:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用 - **内置分页插件**:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询 - **分页插件支持多种数据库**:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库 - **内置性能分析插件**:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询 - **内置全局拦截插件**:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作 官网:[MyBatis-Plus (baomidou.com)](https://baomidou.com/) 文档:[简介 | MyBatis-Plus (baomidou.com)](https://baomidou.com/guide/) 源码:[baomidou/mybatis-plus](https://github.com/baomidou/mybatis-plus) ## 框架结构 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fd7213e0612f41d9b75271a6d8b0b6c1.png) # 快速使用 **创建项目步骤不再赘述,此文章是快速上手MP,其余步骤自行搜索!!** 开发环境 **JDK:jdk1.8** **IDE:IntelliJ IDEA 2020.2.3 x64** **Maven:apache-maven-3.6.3** **MYSQL:mysql5.5** ## 引入mybatis-plus相关maven依赖 ```xml com.baomidou mybatis-plus 3.4.2 ``` ## 引入mybatis-plus在spring boot中的场景启动器 ```xml com.baomidou mybatis-plus-boot-starter 3.4.0 ``` ps:切记不可再在pom.xml文件中引入mybatis与mybatis-spring的maven依赖,这一点,mybatis-plus的官方文档中已经 说明的很清楚了 ## 项目中其他需要导入依赖 ```xml mysql mysql-connector-java runtime org.projectlombok lombok true com.alibaba druid-spring-boot-starter 1.2.3 ``` ## 创建表SQL语句 ```sql CREATE DATABASE mp; USE mp; CREATE TABLE tbl_employee( id INT(11) PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(50), email VARCHAR(50), gender CHAR(1), age INT ); INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tom','tom@atguigu.com',1,22); INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Jerry','jerry@atguigu.com',0,25); INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Black','black@atguigu.com',1,30); INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('White','white@atguigu.com',0,35); SELECT * FROM tbl_employee; ``` ## 项目结构一览 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0f9630c8fc2a4b19a3cc5a1788d87ff9.png) ## 项目配置 ### 配置MapperScan注解 ![在这里插入图片描述](https://img-blog.csdnimg.cn/cdccbd56da1d48849b9e01b5eb4fac78.png) ### application.properties配置 ```yaml #mysql spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #mybatis-plus查看SQL语句 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` ### 创建Entity(Pojo)实体 src/main/java/com/zhuang/pojo 使用`lombok`插件简化代码 ```java package com.zhuang.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import org.springframework.stereotype.Component; /** * @Classname Employee * @Description 实体类 * @Date 2021/10/23 8:49 * @Author by zhuang */ @Component @Data @AllArgsConstructor @NoArgsConstructor @ToString @TableName("tbl_employee") public class Employee { /** * TableId 注解对应数据库字段,防止识别失败 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; @TableField(value = "last_name") private String lastName; @TableField(value = "email") private String email; @TableField(value = "gender") private Integer gender; @TableField(value = "age") private Integer age; } ``` ### 创建接口 **注意注解要加!** ```java package com.zhuang.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhuang.pojo.Employee; import org.springframework.stereotype.Repository; /** * @Classname EmployeeMapper * @Description Mapper接口 * @Date 2021/10/23 8:51 * @Author by dell */ @Repository public interface EmployeeMapper extends BaseMapper { } ``` ### 普通的CRUD操作 **直接看代码!** ```java package com.zhuang.mybatisplus; import com.zhuang.mapper.EmployeeMapper; import com.zhuang.pojo.Employee; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Arrays; import java.util.HashMap; import java.util.List; @SpringBootTest class MybatisPlusApplicationTests { @Autowired private EmployeeMapper employeeMapper; /** * 插入一条数据的测试 */ @Test public void insert() { int result = employeeMapper.insert(new Employee(null, "zhuangkang", "123@qq.com", 0, 18)); System.out.println(result); } /** * 通过Id修改数据 */ @Test public void updateById() { // 先查询 Employee employee = employeeMapper.selectById(1); employee.setLastName("123zk"); // 再执行修改 int result = employeeMapper.updateById(employee); System.out.println(result); } /** * 查询id为1的员工信息 */ @Test public void queryById() { Employee employee = employeeMapper.selectById(1); System.out.println(employee); } /** * 查询性别为男性(0)且年龄在25岁的员工信息 */ @Test public void selectByIdMap() { HashMap map = new HashMap<>(); map.put("gender", 0); map.put("age", 25); List employees = employeeMapper.selectByMap(map); employees.forEach(System.out::println); } /** * 查询id分别为1、2、3的员工的信息 */ @Test public void queryBatch() { List employees = employeeMapper.selectBatchIds(Arrays.asList(1, 2, 3)); employees.forEach(System.out::println); } /** * 删除id为1的员工信息 */ @Test public void deleteById() { int result = employeeMapper.deleteById(1); System.out.println(result); } /** * 删除性别为男性(0)且年龄在25岁的员工信息 */ @Test public void deleteByMap() { HashMap map = new HashMap<>(); map.put("gender", 0); map.put("age", 25); int result = employeeMapper.deleteByMap(map); System.out.println(result); } /** * 删除id分别为3、8、9的员工的信息 */ @Test public void deleteBatch() { int result = employeeMapper.deleteBatchIds(Arrays.asList(3, 8, 9)); System.out.println(result); } } ``` **注意** 有时候IDEA会抽风,识别不到Mapper,出现下列情况可以忽略 ![在这里插入图片描述](https://img-blog.csdnimg.cn/01c52d36a8c447e68d6f7cff18b3ec87.png) # 注解 **这里只介绍常用的,具体可去官方文档查询 [注解 | MyBatis-Plus (baomidou.com)](https://baomidou.com/guide/annotation.html#tablename)** 👉 [mybatis-plus-annotation](https://gitee.com/baomidou/mybatis-plus/tree/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation) ## [#](https://baomidou.com/guide/annotation.html#tablename)[@TableName(opens new window)](https://github.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/TableName.java) - 描述:表名注解 | 属性 | 类型 | 必须指定 | 默认值 | 描述 | | :--------------: | :------: | :------: | :----: | ------------------------------------------------------------ | | value | String | 否 | "" | 表名 | | schema | String | 否 | "" | schema | | keepGlobalPrefix | boolean | 否 | false | 是否保持使用全局的 tablePrefix 的值(如果设置了全局 tablePrefix 且自行设置了 value 的值) | | resultMap | String | 否 | "" | xml 中 resultMap 的 id | | autoResultMap | boolean | 否 | false | 是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建并注入) | | excludeProperty | String[] | 否 | {} | 需要排除的属性名(@since 3.3.1) | ## [@TableId(opens new window)](https://github.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/TableId.java) - 描述:主键注解 | 属性 | 类型 | 必须指定 | 默认值 | 描述 | | :---: | :----: | :------: | :---------: | :--------: | | value | String | 否 | "" | 主键字段名 | | type | Enum | 否 | IdType.NONE | 主键类型 | #### [#](https://baomidou.com/guide/annotation.html#idtype)[IdType(opens new window)](https://github.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/IdType.java) | 值 | 描述 | | :-----------: | :----------------------------------------------------------: | | AUTO | 数据库ID自增 | | NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) | | INPUT | insert前自行set主键值 | | ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口`IdentifierGenerator`的方法`nextId`(默认实现类为`DefaultIdentifierGenerator`雪花算法) | | ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口`IdentifierGenerator`的方法`nextUUID`(默认default方法) | | ID_WORKER | 分布式全局唯一ID 长整型类型(please use `ASSIGN_ID`) | | UUID | 32位UUID字符串(please use `ASSIGN_UUID`) | | ID_WORKER_STR | 分布式全局唯一ID 字符串类型(please use `ASSIGN_ID`) | ## [#](https://baomidou.com/guide/annotation.html#tablefield)[@TableField(opens new window)](https://github.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/TableField.java) - 描述:字段注解(非主键) | 属性 | 类型 | 必须指定 | 默认值 | 描述 | | :--------------: | :--------------------------: | :------: | :----------------------: | :----------------------------------------------------------: | | value | String | 否 | "" | 数据库字段名 | | el | String | 否 | "" | 映射为原生 `#{ ... }` 逻辑,相当于写在 xml 里的 `#{ ... }` 部分 | | exist | boolean | 否 | true | 是否为数据库表字段 | | condition | String | 否 | "" | 字段 `where` 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 `%s=#{%s}`,[参考(opens new window)](https://github.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/SqlCondition.java) | | update | String | 否 | "" | 字段 `update set` 部分注入, 例如:update="%s+1":表示更新时会set version=version+1(该属性优先级高于 `el` 属性) | | insertStrategy | Enum | N | DEFAULT | 举例:NOT_NULL: `insert into table_a(column) values (#{columnProperty})` | | updateStrategy | Enum | N | DEFAULT | 举例:IGNORED: `update table_a set column=#{columnProperty}` | | whereStrategy | Enum | N | DEFAULT | 举例:NOT_EMPTY: `where column=#{columnProperty}` | | fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 | | select | boolean | 否 | true | 是否进行 select 查询 | | keepGlobalFormat | boolean | 否 | false | 是否保持使用全局的 format 进行处理 | | jdbcType | JdbcType | 否 | JdbcType.UNDEFINED | JDBC类型 (该默认值不代表会按照该值生效) | | typeHandler | Class | 否 | UnknownTypeHandler.class | 类型处理器 (该默认值不代表会按照该值生效) | | numericScale | String | 否 | "" | 指定小数点后保留的位数 | ## [@TableLogic(opens new window)](https://github.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/TableLogic.java) - 描述:表字段逻辑处理注解(逻辑删除) | 属性 | 类型 | 必须指定 | 默认值 | 描述 | | :----: | :----: | :------: | :----: | :----------: | | value | String | 否 | "" | 逻辑未删除值 | | delval | String | 否 | "" | 逻辑删除值 | ## [@OrderBy(opens new window)](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/OrderBy.java) - 描述:内置 SQL 默认指定排序,优先级低于 wrapper 条件查询 | 属性 | 类型 | 必须指定 | 默认值 | 描述 | | :----: | :-----: | :------: | :-------------: | :------------: | | isDesc | boolean | 否 | 是 | 是否倒序查询 | | sort | short | 否 | Short.MAX_VALUE | 数字越小越靠前 | # MyBatisPlus的条件构造器 构造器是个很强大的东西,简化开发很多,通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者 Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担, 能够有效提高开发效率,它主要用于处理 sql 拼接,排序,实体参数查询。 > 注意:使用的是数据库字段,不是 Java 属性! 警告:MyBatis-Plus不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输,Wrapper 很重,传输 Wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场),正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作 说明: - 以下出现的第一个入参`boolean condition`表示该条件**是否**加入最后生成的sql中,例如:query.like(StringUtils.isNotBlank(name), Entity::getName, name) .eq(age!=null && age >= 0, Entity::getAge, age) - 以下代码块内的多个方法均为从上往下补全个别`boolean`类型的入参,默认为`true` - 以下出现的泛型`Param`均为`Wrapper`的子类实例(均具有`AbstractWrapper`的所有方法) - 以下方法在入参中出现的`R`为泛型,在普通wrapper中是`String`,在LambdaWrapper中是**函数**(例:`Entity::getId`,`Entity`为实体类,`getId`为字段`id`的**getMethod**) - 以下方法入参中的`R column`均表示数据库字段,当`R`具体类型为`String`时则为数据库字段名(**字段名是数据库关键字的自己用转义符包裹!**)!而不是实体类数据字段名!!!,另当`R`具体类型为`SFunction`时项目runtime不支持eclipse自家的编译器!!! - 以下举例均为使用普通wrapper,入参为`Map`和`List`的均以`json`形式表现! - 使用中如果入参的`Map`或者`List`为**空**,则不会加入最后生成的sql中!!! ## Warrper结构 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4a3596c4d9724dca80da9925aa574357.png) ## 常用方法 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6ec9f81ec5fe40e2baee2dbc354a2343.png) **只介绍常用的,具体请跳转**👉[条件构造器 | MyBatis-Plus (baomidou.com)](https://baomidou.com/guide/wrapper.html) ```java /** * 查询员工年龄小于30 */ @Test public void queryForList() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lt("age", 30); List employees = employeeMapper.selectList(queryWrapper); employees.forEach(System.out::println); } /** * 查询所有员工信息 */ @Test public void queryAll() { QueryWrapper queryWrapper = new QueryWrapper<>(); List employees = employeeMapper.selectList(null); employees.forEach(System.out::println); } /** * 查询所有女员工的信息 */ @Test public void countByGender() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("gender", 1); Integer count = employeeMapper.selectCount(queryWrapper); System.out.println(count); } /** * 修改年龄大于25的女生为男生 */ @Test public void update() { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("gender", 1).gt("age", 25); Employee employee = new Employee(); employee.setGender(0); employeeMapper.update(employee, updateWrapper); } /** * 删除指定名字的员工 */ @Test public void delete() { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("last_name", "Tom"); int result = employeeMapper.delete(updateWrapper); System.out.println(result); } ``` # 代码生成器 很香的东西,自动生成`Pojo,Service,Controller`,太强啦! ## 先创建表空间SQL语句 ```sql ## 删除表 DROP TABLE IF EXISTS `tbl_user`; ## 创建表 CREATE TABLE `tbl_user` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` VARCHAR(30) DEFAULT NULL COMMENT '姓名', `age` INT(11) DEFAULT NULL COMMENT '年龄', `email` VARCHAR(30) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='用户'; ## 导入数据 INSERT INTO `tbl_user`(`id`,`name`,`age`,`email`) VALUES (1,'Jone',18,'test1@baomidou.com'); INSERT INTO `tbl_user`(`id`,`name`,`age`,`email`) VALUES (2,'Jack',20,'test2@baomidou.com'); INSERT INTO `tbl_user`(`id`,`name`,`age`,`email`) VALUES (3,'Tom',28,'test3@baomidou.com'); INSERT INTO `tbl_user`(`id`,`name`,`age`,`email`) VALUES (4,'Sandy',21,'test4@baomidou.com'); INSERT INTO `tbl_user`(`id`,`name`,`age`,`email`) VALUES (5,'Billie',24,'test5@baomidou.com'); ``` ## 导入相关的依赖 ```xml org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web 2.4.5 mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine com.alibaba druid-spring-boot-starter 1.2.3 com.baomidou mybatis-plus-boot-starter 3.4.0 com.baomidou mybatis-plus 3.4.2 org.springframework.boot spring-boot-test 2.5.6 compile com.baomidou mybatis-plus-generator 3.4.1 org.apache.velocity velocity-engine-core 2.2 ``` **创建自动生成代码器的类** **根据官方文档配置即可** ```java package com.zhuang.mybatisplus; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import org.junit.platform.commons.util.StringUtils; import java.util.Scanner; /** * @Classname CodeGenerator * @Description 代码自动生成器类及配置 * @Date 2021/10/23 10:56 * @Author by zhuang */ public class CodeGenerator { public static String scanner(String tip) { // 与控制台交互 Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("请输入" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotBlank(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java");//设置代码生成路径 gc.setFileOverride(true);//是否覆盖以前文件 gc.setOpen(false);//是否打开生成目录 gc.setAuthor("KangXiaoZhuang");//设置项目作者名称 gc.setIdType(IdType.AUTO);//设置主键策略 gc.setBaseResultMap(true);//生成基本ResultMap gc.setBaseColumnList(true);//生成基本ColumnList gc.setServiceName("%sService");//去掉服务默认前缀 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/mp?useSSL=false&useUnicode=true&characterEncoding=utf8"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root"); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.zhuang"); pc.setMapper("mapper"); pc.setXml("mapper.xml"); pc.setEntity("pojo"); pc.setService("service"); pc.setServiceImpl("service.impl"); pc.setController("controller"); mpg.setPackageInfo(pc); // 策略配置 StrategyConfig sc = new StrategyConfig(); sc.setNaming(NamingStrategy.underline_to_camel); sc.setColumnNaming(NamingStrategy.underline_to_camel); sc.setEntityLombokModel(true); sc.setRestControllerStyle(true); sc.setControllerMappingHyphenStyle(true); sc.setTablePrefix("tbl_"); sc.setInclude(scanner("表名,多个英文逗号分割").split(",")); mpg.setStrategy(sc); // 生成代码 mpg.execute(); } } ``` 启动输入想要创建的表名即可 **创建成功的项目路径一览** ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc526f8080ad438f8d1a3f89b6953fd8.png) **User** ```java package com.zhuang.pojo; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; /** *

* 用户 *

* * @author KangXiaoZhuang * @since 2021-10-23 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("tbl_user") public class User implements Serializable { private static final long serialVersionUID = 1L; /** * 主键ID */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 姓名 */ private String name; /** * 年龄 */ private Integer age; /** * 邮箱 */ private String email; } ``` **UserMapper接口** ```java package com.zhuang.mapper; import com.zhuang.pojo.User; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** *

* 用户 Mapper 接口 *

* * @author KangXiaoZhuang * @since 2021-10-23 */ public interface UserMapper extends BaseMapper { } ``` **UserMapper.xml** ```xml id, name, age, email ``` **UserService** ```java package com.zhuang.service; import com.zhuang.pojo.User; import com.baomidou.mybatisplus.extension.service.IService; /** *

* 用户 服务类 *

* * @author KangXiaoZhuang * @since 2021-10-23 */ public interface UserService extends IService { } ``` **UserServiceImpl** ```java package com.zhuang.service.impl; import com.zhuang.pojo.User; import com.zhuang.mapper.UserMapper; import com.zhuang.service.UserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** *

* 用户 服务实现类 *

* * @author KangXiaoZhuang * @since 2021-10-23 */ @Service public class UserServiceImpl extends ServiceImpl implements UserService { } ``` **UserController** ```java package com.zhuang.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** *

* 用户 前端控制器 *

* * @author KangXiaoZhuang * @since 2021-10-23 */ @RestController @RequestMapping("/user") public class UserController { } ``` 更多了解请跳转👉[代码生成器(3.5.1+版本) | MyBatis-Plus (baomidou.com)](https://baomidou.com/guide/generator-new.html#快速入门) **总结:** 1. 只学会了如何快速上手MabitsPlus的操作,具体详细`配置信息,乐观锁,逻辑删除`后续补充 2. 学过的知识需要复习,总结,才能融会贯通,,加油!💪