代码一键生成
源码地址:https://github.com/nongzihong/automatic
MyBatis-Plus 官网:https://mp.baomidou.com/
起源:
dao,entity,service,controller都要自己去编写。而这部分代码,都是有一定的规范,有需求,就有对应的产品应运而生,AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
环境
springboot 2.2.1.RELEASE
mybatis-plus 3.3.0
spring-boot-starter-swagger 1.5.1.RELEASE
项目结构图
sql脚本
create database pro; use pro; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(111) NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名', `age` int(11) NULL DEFAULT NULL COMMENT '年龄', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (1, '社长', 18); INSERT INTO `student` VALUES (2, '老王', 20); INSERT INTO `student` VALUES (3, '兰陵王', 11);
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>automatic</artifactId> <version>0.0.1-SNAPSHOT</version> <name>automatic</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--junit测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.0</version> </dependency> <!--代码生成模式插件 3.0.3以后需要手动设置依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.1.tmp</version> </dependency> <!--简化代码插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--代码生成模板--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency> <!-- druid阿里巴巴数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <!-- 热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!--swagger2--> <dependency> <groupId>com.spring4all</groupId> <artifactId>spring-boot-starter-swagger</artifactId> <version>1.5.1.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client --> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>2.3.0</version> </dependency> </dependencies> <build> <!--打包后的项目名--> <finalName>codeauto</finalName> <!--解决mapper文件不到class文件夹的问题--> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src\main\java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- 1、设置jar的入口类 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.example.automatic.AutoApplication</mainClass> </manifest> </archive> </configuration> </plugin> <!-- 3、打包过程忽略Junit测试 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
application.yml
server: port: 8888 spring: datasource: # 配置数据源 driver-class-name: org.mariadb.jdbc.Driver # 使用druid连接池 type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mariadb://127.0.0.1:3306/pro username: root password: 123 ###增加日志输出,方便定位问题 logging: level: root : warn com.cxyxs.mybatisplus.dao: trace ###控制台输出格式 pattern: console: '%p%m%n' mybatis-plus: mapper-locations: classpath*:/com/example/automatic/mapper/xml/*.xml global-config: db-config: ###逻辑未删除的值 logic-not-delete-value: 0 ###逻辑已删除的值 logic-delete-value: 1 ####扫描swagger注解 swagger: base-package: com.example
- 配置数据库的信息,以自己的配置为主
- mapper-locations 是根据自动生成代码的规则而定义的
- swagger 配置swagger注解,扫描范围
启动类
package com.example.automatic; import com.spring4all.swagger.EnableSwagger2Doc; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import springfox.documentation.swagger2.annotations.EnableSwagger2; @MapperScan("com.example.automatic.mapper") @SpringBootApplication @EnableSwagger2Doc public class AutomaticApplication { public static void main(String[] args) { SpringApplication.run(AutomaticApplication.class, args); } }
- @MapperScan配置扫描dao包的位置(以我们常用的思维),社长习惯以mapper命名
- @EnableSwagger2Doc 启用swagger注解
代码自动生成
package com.example.automatic; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.FieldFill; 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.po.TableFill; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.ArrayList; import java.util.List; @SpringBootTest @RunWith(SpringRunner.class) class CodeGenerationTests { 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("ZH"); //设置作者 //生成代码后,是否打开文件夹 gc.setOpen(false); gc.setFileOverride(false); //是否覆盖原来代码,个人建议设置为false,别覆盖,危险系数太高 gc.setServiceName("%sService"); //去掉service的I前缀,一般只需要设置service就行 gc.setDateType(DateType.ONLY_DATE); //日期格式 gc.setSwagger2(true); // 实体属性 Swagger2 注解,实体类上会增加注释 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mariadb://127.0.0.1:3306/pro"); // dsc.setSchemaName("public"); dsc.setDriverName("org.mariadb.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("123"); dsc.setDbType(DbType.MYSQL); //指定数据库的类型 mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.example.automatic"); //自定义包的路径 //pc.setModuleName("module"); //模块名称 设置后,会生成com.example.automatic,里面存放之前设置的mapper,entity pc.setEntity("entity"); pc.setMapper("mapper"); pc.setService("service"); pc.setController("controller"); mpg.setPackageInfo(pc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("student"); //设置映射的表名,可以设置多个表 //表前缀设置 cxyxs_student //strategy.setTablePrefix(new String[]{"cxyxs_"}); //包的命名规则,使用驼峰规则 strategy.setNaming(NamingStrategy.underline_to_camel); //列的名称,使用驼峰规则 strategy.setColumnNaming(NamingStrategy.underline_to_camel); //是否使用lombok strategy.setEntityLombokModel(true); //驼峰命名 strategy.setRestControllerStyle(true); strategy.setLogicDeleteFieldName("is_delete"); //逻辑删除,假删除会用到 //自动填充字段,在项目开发过程中,例如创建时间,修改时间,每次,都需要我们来指定,太麻烦了,设置为自动填充规则,就不需要我们赋值咯 TableFill fillInsert = new TableFill("create_time", FieldFill.INSERT); TableFill fillUpdate= new TableFill("update_time", FieldFill.UPDATE); List fillLists = new ArrayList(); fillLists.add(fillInsert); fillLists.add(fillUpdate); strategy.setTableFillList(fillLists); //乐观锁 //strategy.setVersionFieldName("version"); mpg.setStrategy(strategy); mpg.execute(); //执行 } }
contoller,entity,mapper,service代码都给我们生成好
- swagger注释都给我们生成好咯,而且代码也很规范,让我们自己来写,可能会遇到很多很低级的错误。
- 虽说,代码自动生成很智能,智能的前提,是有规范的,数据库命令,最高遵守相关的规范,这里就不过多阐述咯
controller类
package com.example.automatic.controller; import com.example.automatic.entity.Student; import com.example.automatic.mapper.StudentMapper; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * <p> * 前端控制器 * </p> * * @author ZH * @since 2020-04-08 */ @RestController @RequestMapping("/student") public class StudentController { @Autowired private StudentMapper studentMapper; @GetMapping("/test") @ApiOperation(value = "测试接口", notes = "测试") public List<Student> getStudent1(Student stu) { List<Student> lists = studentMapper.selectList(null); studentMapper.selectByMap(); return lists; } @GetMapping("/count") @ApiOperation(value = "统计数量", notes = "测试") public int getCount(){ return studentMapper.count(); } }
StudentController这个类,是自动生成的,增加两个个方法,来看看效果。
测试
http://localhost:8888/swagger-ui.html
通过页面可以发现有一个basic-error-controller,实际上,我们代码里面没有定义这个,有强迫症的,可以百度解决方法,配置一下,这里就不配置了
通过可视化界面,前端可以看到返回的参数注释
传参也有注释
点击try it out按钮 可以看到有返回数据