什么是Mybatis-Plus

Mybatis-Plus:为简化开发而生

1.MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改变。

使得我们可以可以在 Mybatis 开发的项目上直接进行升级为 Mybatis-plus,正如它对自己的定位,它能够帮助我们进一步简化开发过程,提高开发效率。

2.Mybatis-Plus 其实可以看作是对 Mybatis 的再一次封装,升级之后,对于单表的 CRUD 操作,调用 Mybatis-Plus 所提供的 API 就能够轻松实现,此外还提供了各种查询方式、分页等行为。最最重要的,开发人员还不用去编写 XML,这就大大降低了开发难度

其官方主页:https://baomidou.com

使用代码生成

数据库准备

使用user表作为案例,其脚本如下:

CREATE TABLE `tb2023`.`t_user`  (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`username` varchar(50) NULL COMMENT '用户名',
`password` varchar(50) NULL COMMENT '密码',
`gender` tinyint NULL COMMENT '性别 0=女 1=男',
`version` int DEFAULT NULL COMMENT '乐观锁',
`deleted` tinyint unsigned DEFAULT '1' COMMENT '删除标志,默认0不删除 1删除',
`create_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
);

SpringBoot项目

使用IDEA新建一个SpringBoot项目

pom文件如下:

pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- JDBC -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Mybatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!-- Mybatis-Plus自动生成代码 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>
<!-- 模版引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

配置生成策略

在test中新建java文件CodeGenerator.java,写入一下代码:

test/java/CodeGenerator
public class CodeGenerator {

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.setAuthor("sw-code");
gc.setOpen(false); // 是否打开文件资源管理器
gc.setFileOverride(false); // 是否覆盖
gc.setServiceName("%sService"); // 去Service的I前缀
gc.setSwagger2(true); // 实体属性 Swagger2 注解
gc.setIdType(IdType.AUTO); // 主键策略
gc.setDateType(DateType.ONLY_DATE); // 定义生成的实体类中日期类型
mpg.setGlobalConfig(gc);

// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql:///tb2023?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8&nullCatalogMeansCurrent=true");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("swx852345");
mpg.setDataSource(dsc);

// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.swx.docker");
pc.setEntity("pojo");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);

// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("t_user");
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setLogicDeleteFieldName("deleted");
// 自动填充
TableFill deleted = new TableFill("deleted", FieldFill.INSERT);
TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
List<TableFill> tableFills = new ArrayList<>();
tableFills.add(createTime);
tableFills.add(updateTime);
tableFills.add(deleted);
strategy.setTableFillList(tableFills);
// 乐观锁
strategy.setVersionFieldName("version");

strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix("t_");
mpg.setStrategy(strategy);

mpg.execute();
}
}

可根据自己的情况修改生成规则。

开始生成代码

编辑完成,点击开始生成代码

生成的目录包括:pojomapperservicecontroller,即代表成功。

注意:自动生成的mapper.xmlmapper下,如果需要可移动到resource目录下,并修改yml文件。

其他配置

yml配置

resource/application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///tb2023?useSSL=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: swx852345
swagger2:
enabled: true
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER

mybatis-plus:
type-aliases-package: com.swx.docker # 别名扫描包
global-config:
db-config: # 逻辑删除
logic-not-delete-value: 1
logic-delete-value: -1

Swagger配置

config/swaggerConfig.java
/**
* 访问网址:http://localhost:port/swagger-ui/index.html
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Value(value = "${spring.swagger2.enabled}")
private Boolean swaggerEnabled;

@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.enable(swaggerEnabled)
.select()
.apis(RequestHandlerSelectors.basePackage("com.swx.docker")) // 写上自己的包名
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("接口文档")
.description("用restful风格写接口")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}

SpringBoot版本如果是2.6.0以上,项目启动时会报错:

Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException:

在配置文件里加入下面内容可解决:

application.yml
spring:
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER

自动填充配置

字段update_timecreate_time添加了@TableField注解,需要配置一下Handler

handler/AutoFillMetaObjectHandler.java
@Component
public class AutoFillMetaObjectHandler implements MetaObjectHandler {

@Value(value = "${mybatis-plus.global-config.db-config.logic-not-delete-value}")
private Integer notDeleted;

@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("deleted", notDeleted, metaObject);
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}

@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}

启动项目

为了方便测试,我们加入两个Controller

controller/UserController.java
@Api("用户User接口")
@RestController
@RequestMapping("/user")
public class UserController {

private final UserService userService;

public UserController(UserService userService) {
this.userService = userService;
}

@ApiOperation("添加用户")
@PostMapping("/add")
public void addUser(@RequestBody User user) {
userService.save(user);
}

@ApiOperation("添加用户")
@PostMapping("/get/{id}")
public void getUser(@PathVariable Integer id) {
userService.getById(id);
}
}

测试项目

使用Swagger测试接口,地址栏访问:http://localhost:8080/swagger-ui/index.html