1.pom.xml添加配置
<dependency> <groupId>com.spring4all</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>1.9.1.RELEASE</version> <!-- <version>2.0.1.RELEASE</version>--> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency> <!-- 代码生成器插件 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.1</version> </dependency> <!--velocity 模板引擎 代码生成器需要--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency>
2.application.yml配置数据库连接以及mybatis日志,软删除以及swagger2配置
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: # logic-delete-field: deleted # 全局逻辑删除的实体字段名 logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) ###swagger如下都是非必须的配置(实际使用时请根据实际情况配置) swagger: enabled: true title: API文档 description: XXX系统设计 #接口包扫描路径 base-package: com.XXX.XXX.XXX.controller #需排除的接口路径 exclude-path: /error/** version: ${project.version}
3.配置mybatis乐观锁,自动填充插件
@EnableTransactionManagement @Configuration //配置类 public class MybatisPlusConfig { /** *在实体类的字段上加上@Version注解 * @return 注册乐观锁插件, 分页插件 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); 分页插件 DbType:数据库类型(根据类型获取应使用的分页方言) interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } //逻辑删除 // @Bean // public ISqlInjector sqlInjector(){ // return new LogicSqlInjector(); // } // /** // * SQL执行效率插件 // */ // @Bean // @Profile({"dev","test"})// 设置 dev test 环境开启 // public PerformanceInterceptor performanceInterceptor() { // PerformanceInterceptor interceptor = new PerformanceInterceptor(); // //在工作中不允许用户等待 // interceptor.setMaxTime(100);// ms单位毫秒 设置sql可以执行的最大时间,如果超过了这个时间则不执行 // interceptor.setFormat(true);// // return interceptor; // } }
@Slf4j @Component //把处理器加到IOC容器中 public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill....."); //setFieldValByName(fieldName, fieldVal, metaObject, FieldFill.INSERT); this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); this.setFieldValByName("version",1,metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill......"); this.setFieldValByName("updateTime",new Date(),metaObject); } }
4.编写代码自动生成类
public class CodeGenerator { private static final String url = "jdbc:mysql://xxxx:3306/xxxxx?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false"; private static final String username = "XXX"; private static final String password = "XXX"; public static void main(String[] args) { //获取输出目录 String projectPath = System.getProperty("user.dir"); FastAutoGenerator.create(DATA_SOURCE_CONFIG) // 全局配置 fileOverride()覆盖已生成文件 .globalConfig((scanner, builder) -> builder .author(scanner.apply("jiakai")) .dateType(DateType.ONLY_DATE) .fileOverride() .enableSwagger() .disableOpenDir() //生成的代码所在的位置 .outputDir(projectPath + "/src/main/java") ) // 包配置 设置父包名 .packageConfig((scanner, builder) -> builder.parent(scanner.apply("com.sci.plan.decisionanalysis"))) // 策略配置 .strategyConfig((scanner, builder) -> builder //请输入表名,多个英文逗号分隔?所有输入 all .addInclude(getTables(scanner.apply("info_user"))) .controllerBuilder() //rest 风格 开启驼峰命名 .enableRestStyle() //controller 请求多字段连接 实现下划线连接 eg:localhost:8080/aa_bb .enableHyphenStyle() .serviceBuilder().formatServiceFileName("%sService") .formatServiceImplFileName("%sServiceImp") .entityBuilder() //lombok .enableLombok() .naming(NamingStrategy.underline_to_camel) .columnNaming(NamingStrategy.underline_to_camel) .idType(IdType.AUTO) .formatFileName("%sEntity") .logicDeleteColumnName("deleted") .logicDeletePropertyName("deleted") .versionColumnName("version") .versionPropertyName("version") .addTableFills(new Column("create_time", FieldFill.INSERT)) .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)) .build()) /* 模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker .templateEngine(new BeetlTemplateEngine()) .templateEngine(new FreemarkerTemplateEngine()) */ .execute(); } // 处理 all 情况 protected static List<String> getTables(String tables) { return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(",")); } /** * 数据源配置 */ private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig .Builder(url, username, password) .dbQuery(new MySqlQuery()) //数据库查询 .schema("mybatis-plus") //数据库schema(部分数据库适用) .typeConvert(new MySqlTypeConvert()) //数据库类型转换器 .keyWordsHandler(new MySqlKeyWordsHandler()); //数据库关键字处理器 }
5.生成的代码中添加注解
@ApiModelProperty("录入时间") @TableField(fill = FieldFill.INSERT) private Date createTime; @ApiModelProperty("更新时间") @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; /** * 版本号(用于乐观锁, 默认为 1) */ @ApiModelProperty("版本号") @Version @TableField(fill = FieldFill.INSERT) private Integer version; @ApiModelProperty("是否逻辑删除") @TableLogic @TableField(fill = FieldFill.INSERT) private Integer deleted;