什么是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> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <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/CodeGeneratorpublic 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"); gc.setSwagger2(true); 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.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(); } }
|
可根据自己的情况修改生成规则。
开始生成代码
编辑完成,点击开始生成代码
生成的目录包括:pojo
、mapper
、service
、controller
,即代表成功。
注意:自动生成的mapper.xml
在mapper
下,如果需要可移动到resource
目录下,并修改yml文件。
其他配置
yml配置
resource/application.ymlspring: 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
@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.ymlspring: mvc: pathmatch: matching-strategy: ANT_PATH_MATCHER
|
自动填充配置
字段update_time
和create_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