源碼地址: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按鈕 可以看到有返回數據