【springboot核心注解 springboot+mybatis-plus快速生成项目模板】
目录
- 1、pom文件示范
- 2、mybatis-plus代码生成器
- 3、springboot配置文件
- 4、日志配置:logback-spring.xml
- 5、swagger结合knife4j配置类
- 6、返回前端结果集处理
- 7、异常统一处理
创建项目流程->创建项目时 , 父项目用springboot , 子模块用maven , 父项目用dependencyManagement统一管理jar包版本 , 子项目、子子模块按需求导入即可
1、pom文件示范父工程pom.xml
<properties><!--java8--><java.version>1.8</java.version><!--mybatis-plus--><mp.version>3.4.2</mp.version><!--swagger--><swagger.version>3.0.0</swagger.version><!--velocity模板引擎--><velocity.version>2.3</velocity.version><!--java连接数据库--><mysql-connect-java.version>8.0.25</mysql-connect-java.version><!--velocity--><velocity.version>2.3</velocity.version><!--mybatis-plus-generator--><mybatis-plus-generator.version>3.4.1</mybatis-plus-generator.version><!--knife4j--><knife4j.version>3.0.2</knife4j.version></properties><dependencyManagement><dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mp.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus-generator.version}</version></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>${velocity.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connect-java.version}</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>${knife4j.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip></configuration></plugin></plugins></build>子项目pom.xml:
<dependencies><!--controller相关--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!--代码生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId></dependency><!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId></dependency><!--java连接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--knife4j--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip></configuration></plugin></plugins></build>子项目web模块pom.xml(直接引用common模块)<dependencies><dependency><groupId>cn.jie</groupId><artifactId>admin-base-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>2、mybatis-plus代码生成器
public class CodeGenerator {/*** <p>* 读取控制台内容* </p>*/public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);StringBuilder help = new StringBuilder();help.append("请输入" + tip + ":");System.out.println(help.toString());if (scanner.hasNext()) {String ipt = scanner.next();if (StringUtils.isNotBlank(ipt)) {return ipt;}}throw new MybatisPlusException("请输入正确的" + tip + "!");}public static void main(String[] args) {// 代码生成器AutoGenerator mpg = new AutoGenerator();// 全局配置GlobalConfig gc = new GlobalConfig();String projectPath = scanner("项目路径");//项目生成路径gc.setOutputDir(projectPath + "/src/main/java");gc.setAuthor("sky");//打开资源管理器gc.setOpen(false);//开启swaggergc.setSwagger2(true);//覆盖文件gc.setFileOverride(false);gc.setServiceName("%sService");//主键自增gc.setIdType(IdType.AUTO);//java.util.dategc.setDateType(DateType.ONLY_DATE);mpg.setGlobalConfig(gc);// 数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/adminweb?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8");// dsc.setSchemaName("public");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("root");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 包配置PackageConfig pc = new PackageConfig();pc.setModuleName(scanner("模块名"));pc.setParent("cn.jie");pc.setEntity("entity");pc.setMapper("mapper");pc.setController("controller");pc.setService("service");pc.setServiceImpl("service.impl");mpg.setPackageInfo(pc);// 策略配置StrategyConfig strategy = new StrategyConfig();//表strategy.setInclude(scanner("表名 , 多个英文逗号分割").split(","));//驼峰命名strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);//lombokstrategy.setEntityLombokModel(true);//restfulstrategy.setRestControllerStyle(true);strategy.setControllerMappingHyphenStyle(true);mpg.setStrategy(strategy);mpg.execute();}}生成结果如图所示:(需要提前创建数据库)
文章插图
3、springboot配置文件
spring:application:name: admin-base-webdatasource:type:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/adminweb?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: rootjackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8server:port: 8081mybatis-plus:global-config:db-config:logic-delete-field: deleted# 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)mapper-locations: classpath*:/mapper/*.xml4、日志配置:logback-spring.xml
<?xml version="1.0" encoding="UTF-8" ?><!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL --><!-- 日志输出规则 根据当前ROOT 级别 , 日志输出时 , 级别高于root默认的级别时 会输出 --><!-- 以下 每个配置的 filter 是过滤掉输出文件里面 , 会出现高级别文件 , 依然出现低级别的日志信息 , 通过filter 过滤只记录本级别的日志 --><!-- scan 当此属性设置为true时 , 配置文件如果发生改变 , 将会被重新加载 , 默认值为true 。--><!-- scanPeriod 设置监测配置文件是否有修改的时间间隔 , 如果没有给出时间单位 , 默认单位是毫秒 。当scan为true时 , 此属性生效 。默认的时间间隔为1分钟 。--><!-- debug 当此属性设置为true时 , 将打印出logback内部日志信息 , 实时查看logback运行状态 。默认值为false 。--><configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 动态日志级别 --><jmxConfigurator/><!--*****************************************************************************--><!--自定义项 开始--><!--*****************************************************************************--><!-- 定义日志文件 输出位置 --><property name="log.home_dir" value="F:/test/admin-parent/log"/><property name="log.app_name" value="https://tazarkount.com/read/http-demo"/><!-- 日志最大的历史 30天 --><property name="log.maxHistory" value="https://tazarkount.com/read/30"/><property name="log.maxSize" value="https://tazarkount.com/read/5MB"/><!-- 日志界别 --><property name="log.level" value="https://tazarkount.com/read/info"/><!-- 打印sql语句 需要指定dao/mapper层包的位置 --><property name="mapper.package" value="https://tazarkount.com/read/cn.jie.system.mapper"/><!-- 彩色日志 --><!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 --><!-- magenta:洋红 --><!-- boldMagenta:粗红--><!-- cyan:青色 --><!-- white:白色 --><!-- magenta:洋红 --><property name="CONSOLE_LOG_PATTERN"value="https://tazarkount.com/read/%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/><!--*****************************************************************************--><!--自定义项 结束--><!--*****************************************************************************--><!-- ConsoleAppender 控制台输出日志 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern><!-- 设置日志输出格式 -->${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><!-- ERROR级别日志 --><!-- 滚动记录文件 , 先将日志记录到指定文件 , 当符合某个条件时 , 将日志记录到其他文件 RollingFileAppender --><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 过滤器 , 只记录WARN级别的日志 --><!-- 果日志级别等于配置级别 , 过滤器会根据onMath 和 onMismatch接收或拒绝日志 。--><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 设置过滤级别 --><level>ERROR</level><!-- 用于配置符合过滤条件的操作 --><onMatch>ACCEPT</onMatch><!-- 用于配置不符合过滤条件的操作 --><onMismatch>DENY</onMismatch></filter><!-- 最常用的滚动策略 , 它根据时间来制定滚动策略.既负责滚动也负责触发滚动 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志输出位置 可相对、和绝对路径 --><fileNamePattern>${log.home_dir}/error/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern><!-- 可选节点 , 控制保留的归档文件的最大数量 , 超出数量就删除旧文件,假设设置每个月滚动 , 且<maxHistory>是6 , 则只保存最近6个月的文件 , 删除之前的旧文件 。注意 , 删除旧文件是 , 那些为了归档而创建的目录也会被删除 --><maxHistory>${log.maxHistory}</maxHistory><!--日志文件最大的大小--><MaxFileSize>${log.maxSize}</MaxFileSize></rollingPolicy><encoder><pattern><!-- 设置日志输出格式 -->%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- WARN级别日志 appender --><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 过滤器 , 只记录WARN级别的日志 --><!-- 果日志级别等于配置级别 , 过滤器会根据onMath 和 onMismatch接收或拒绝日志 。--><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 设置过滤级别 --><level>WARN</level><!-- 用于配置符合过滤条件的操作 --><onMatch>ACCEPT</onMatch><!-- 用于配置不符合过滤条件的操作 --><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志输出位置 可相对、和绝对路径 --><fileNamePattern>${log.home_dir}/warn/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern><maxHistory>${log.maxHistory}</maxHistory><!--当天的日志大小 超过MaxFileSize时,压缩日志并保存--><MaxFileSize>${log.maxSize}</MaxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- INFO级别日志 appender --><appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.home_dir}/info/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern><maxHistory>${log.maxHistory}</maxHistory><MaxFileSize>${log.maxSize}</MaxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern></encoder></appender><!-- DEBUG级别日志 appender --><appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.home_dir}/debug/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern><maxHistory>${log.maxHistory}</maxHistory><MaxFileSize>${log.maxSize}</MaxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern></encoder></appender><!-- TRACE级别日志 appender --><appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>TRACE</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.home_dir}/trace/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern><maxHistory>${log.maxHistory}</maxHistory><MaxFileSize>${log.maxSize}</MaxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern></encoder></appender><!--设置一个向上传递的appender,所有级别的日志都会输出--><appender name="app" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.home_dir}/app/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern><maxHistory>${log.maxHistory}</maxHistory><MaxFileSize>${log.maxSize}</MaxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern></encoder></appender><!--org.springframework.web包下的类的日志输出--><logger name="org.springframework.web" additivity="false" level="WARN"><appender-ref ref="WARN"/></logger><!--dao层包下的类的日志输出--><logger name="${mapper.package}" additivity="false" level="DEBUG"><appender-ref ref="app"/><appender-ref ref="ERROR"/><appender-ref ref="DEBUG"/><!--打印控制台--><appender-ref ref="CONSOLE"/></logger><!-- root级别DEBUG --><root><!-- 打印debug级别日志及以上级别日志 --><level value="https://tazarkount.com/read/${log.level}"/><!-- 控制台输出 --><appender-ref ref="CONSOLE"/><!-- 不管什么包下的日志都输出文件 --><appender-ref ref="ERROR"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="DEBUG"/><appender-ref ref="TRACE"/></root></configuration>5、swagger结合knife4j配置类swagger注意要用3.0.0版本
配置完swagger2config
@Configuration@EnableSwagger2@EnableKnife4j@Import(BeanValidatorPluginsConfiguration.class)public class Swagger2Config {@Bean(value = "https://tazarkount.com/read/defaultApi2")public Docket defaultApi2() {Docket docket=new Docket(DocumentationType.SWAGGER_2).apiInfo(new ApiInfoBuilder()//.title("swagger-bootstrap-ui-demo RESTful APIs").description("物资管理系统API文档").termsOfServiceUrl("https://www.cnblogs.com/thatbluesky/").contact(new Contact("我的博客","https://www.cnblogs.com/thatbluesky/","1879186403@qq.com")).version("1.0").build())//分组名称.groupName("1.0版本").select()//这里指定Controller扫描包路径.apis(RequestHandlerSelectors.basePackage("cn.jie.system.controller")).paths(PathSelectors.any()).build();return docket;}}启动访问:http://localhost:8081/doc.html
文章插图
6、返回前端结果集处理
结构展示:
文章插图
config->配置包handler->异常处理包response->返回结果处理包跨域处理:@Configurationpublic class CrossConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("GET","POST","PUT","DELETE","OPTIONS","HEAD").allowCredentials(true).maxAge(3600).allowedHeaders("*");}}结果处理:Result:
@Datapublic class Result {@ApiModelProperty(value = "https://tazarkount.com/read/返回码")private Integer code;@ApiModelProperty(value = "https://tazarkount.com/read/返回消息")private String message;@ApiModelProperty(value = "https://tazarkount.com/read/是否成功")private Boolean success;@ApiModelProperty(value = "https://tazarkount.com/read/返回数据")private Map<String,Object> data = https://tazarkount.com/read/new HashMap();private Result() {}/*** 成功* @return*/public static Result ok(){Result result = new Result();result.setSuccess(true);result.setCode(ResultCode.SUCCESS.getCode());result.setMessage(ResultCode.SUCCESS.getMsg());return result;}/*** 失败* @return*/public static Result error(){Result result = new Result();result.setSuccess(false);result.setCode(ResultCode.COMMON_FAIL.getCode());result.setMessage(ResultCode.COMMON_FAIL.getMsg());return result;}/*** 自定义失败返回码* @param resultCode* @return*/public static Result error(ResultCode resultCode){Result result = new Result();result.setSuccess(false);result.setCode(resultCode.getCode());return result;}/*链式编程 定制返回结果*/public Result success(Boolean success){this.setSuccess(success);return this;}public Result code(Integer code){this.setCode(code);return this;}public Result msg(String msg){this.setMessage(msg);return this;}public Result data(String key,Object value){this.data.put(key,value);return this;}public Result data(Map map){this.setData(map);return this;}} 定制接口CustomizeResultCod:public interface CustomizeResultCode {Integer getCode();String getMsg();}定制ResultCode:public enum ResultCode implements CustomizeResultCode{SUCCESS(200,"操作成功"),COMMON_FAIL(999,"操作失败"),/*参数异常 1000-1999 *//*用户相关 2000-2999 */USER_NOT_EXIST_ERROR(2000,"用户不存在"),/*部门相关 3000-3999 */DEPT_NOT_FOUND_EXCEPTION(3000,"未查找到部门信息")/*权限相关*//*其他*/;private Integer code;private String msg;ResultCode(Integer code, String msg) {this.code = code;this.msg = msg;}@Overridepublic Integer getCode() {return code;}@Overridepublic String getMsg() {return msg;}}7、异常统一处理自定义异常BusinessException:
@Data@AllArgsConstructor@NoArgsConstructorpublic class BusinessException extends RuntimeException{@ApiModelProperty(value = "https://tazarkount.com/read/异常状态码")private Integer code;@ApiModelProperty(value = "https://tazarkount.com/read/异常信息")private String errMsg;}统一处理controller全局异常@ControllerAdvice@Slf4jpublic class GlobalExceptionHandler {/*** 所有异常* @param e* @return*/@ExceptionHandler(Exception.class)@ResponseBodypublic Result error(Exception e){log.error(e.getMessage());//return Result.error();}/*** 自定义异常* @param businessException* @return*/@ExceptionHandler(BusinessException.class)@ResponseBodypublic Result error(BusinessException businessException){log.error(businessException.getErrMsg());return Result.error().code(businessException.getCode()).msg(businessException.getErrMsg());}}
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
