Springboot新手开发 基本总结

news2025/2/23 6:18:30

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:后端专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

在这里插入图片描述

目录

  • 一、创建父工程
    • 在子项目里添加启动类
  • 二、整合其他技术
    • 1、整合 mybatis-plus 持久层
      • 分页功能
    • 2、整合swagger
    • 3、 阿里云OSS存储服务
    • 4、使用EasyExcel读取Excel内容
  • 三、common模块
    • 1.统一返回数据格式
    • 2.数据自动填充
    • 3.统一异常处理
      • 全局异常处理
      • 自定义异常处理
    • 4.统一日志处理
  • 最后

一、创建父工程

创建过程就不用多说 我们来详细说一下 pom.xml 文件

  • 添加<packaging>pom</packaging>在这里插入图片描述
  • <properties> 这里统一放版本号 </properties>在这里插入图片描述

在子项目里添加启动类

@SpringBootApplication
public class EduApplication {
    public static void main(String[] args) {
        SpringApplication.run(EduApplication.class,args);
    }
}
  • 注意启动类的位置在这里插入图片描述

二、整合其他技术

1、整合 mybatis-plus 持久层

导入坐标

<!--mybatis-plus 持久层-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>

            <!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>

代码生成器
详细请看另一博客:点此跳转

 public static void main(String[] args) {

        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        //gc.setOutputDir(projectPath + "/src/main/java");
        //代码生成的路径E:\学习\学习项目\硅谷课堂\ggkt_parent
        gc.setOutputDir("E:\\programming\\java\\学习项目\\guli_paret\\service\\service_edu\\src\\main\\java");
        gc.setServiceName("%sService");	//去掉Service接口的首字母I
        gc.setAuthor("xbfinal");
        gc.setOpen(false);
        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");//数据库账号
        dsc.setPassword("123456");//数据库密码
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.xbfinal");
        pc.setModuleName("eduservice"); //模块名
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("edu_teacher");
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
        mpg.setStrategy(strategy);

        // 6、执行
        mpg.execute();
    }

运行上面代码就能生成相应的结构了


配置类
在这里插入图片描述

注意
在配置类加上@MapperScan("mapper路径") 才能识别出mapper的位置
逻辑删除需要配置bean

@Configuration
@MapperScan("com.xbfinal.eduservice.mapper")
public class EduConfig {

    /**
     * 逻辑删除插件
     */
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }
}


分页功能

  • 在配置类加上分页插件
/**
     * mp分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
  • 编写分页接口的方法
 		 //创建page对象 参数1页码 参数2条数
        Page<EduTeacher> page=new Page<>(current,limit);
        //调用Service.page 方法实现分页 参数1 page对象 参数2 条件
        IPage<EduTeacher> page1 = eduTeacherService.page(page, null);

插件使用方法查看官网 ===>分页插件PaginationInnerInterceptor


有条件查询分页功能

  • 第一步 把条件值传递到接口里面(把条件封装到对象中 vo)在这里插入图片描述
  • 编写方法
//由于博客笔记原因 代码我就都写controller了
 @PostMapping("pageTeacherCondition/{current}/{limit}")
    public Result pageTeacherCondition(
            @ApiParam(name = "current",value = "当前页码")
            @PathVariable("current") Long current,
            @ApiParam(name = "limit",value = "条数")
            @PathVariable("limit") Long limit ,
            @RequestBody(required = false) TeacherQuery teacherQuery){

        //1.创建page对象
        Page<EduTeacher> page=new Page<>(current,limit);
        //构建条件wrapper
        QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
        //多条件组合查询
        String name=teacherQuery.getName();
        if (!StrUtil.isEmpty(name)){
            //模糊查询 参数1 数据库中字段的名称  参数2 条件
            wrapper.like("name",name);
        }
        //调用Service.page 方法实现分页 参数1 page对象 参数2 条件
        IPage<EduTeacher> page1 = eduTeacherService.page(page,wrapper );

        return Result.ok().addData(page1);
    }

2、整合swagger

基本情况请看 :swagger入门
注意事项:需要在 配置类打开注解@EnableSwagger2//开启Swagger配置

在这里插入图片描述

访问http://localhost:当前服务模块的端口号/swagger-ui.html 进入ui界面
例如 http://localhost:8001/swagger-ui.html

注解
@Api(value = " ")用于类;
@ApiOperation()用于方法;表示一个http请求的操作
@ApiParam(name = "id" ,value = "讲师的id",required = true)用于方法的参数列表,参数,字段说明;表示对参数的添加元数据(说明或是否必填等)
在这里插入图片描述在这里插入图片描述
在这里插入图片描述


3、 阿里云OSS存储服务

  • 创建 oss的许可证AccessKey
    在这里插入图片描述
  • 官方文档 SDK文档 不多说了很详细的文档 还有视频

配置文件

#阿里云 OSS
#服务器地址
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com #(服务器地址)
aliyun.oss.file.keyid=AccessKey ID
aliyun.oss.file.keysecret=AccessKey Secret
#bucket可以在控制台创建,也可以用java创建

aliyun.oss.file.bucketname=xxxx    # xxxx是 bucket的name

出现问题

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

  • 解决方案一:可以在配置文件配置数据库
  • 方案二(🎆):在启动类上添加属性,默认不去加载数据库 ======= == == = = = = = = == == =》 exclude = DataSourceAutoConfiguration.class在这里插入图片描述

4、使用EasyExcel读取Excel内容

三、common模块

  • common模块,也是公共模块,和父工程有着较多的相似性,其较大的作用在于为其他模块提供 共用 类,但不牵扯到其他模块的具体业务逻辑。
  • 需要在各个模块引入common模块jar包。完成对项目工程的改造。. 在前后端分离的微服务中,公共模块,大多承担的角色是,根据前端所需返回的数据类型,定义出一个或几个共同的类,满足前端类型所需
    在这里插入图片描述
  • 最后需要在业务模块启动类上加上注解 来扫描到common模块中的组件

1.统一返回数据格式

  • 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。
  • 一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码返回消息返回数据这几部分内容
  • 写一个interface 来定义成功和失败的状态码
/**
 * @author 笑霸final
 */
public interface ResultCode {

    /**
     *  自定义成功的状态码
     */
    public static Integer SUCCESS=20000;

    /**
     * 自定义失败的状态码
     */
    public static Integer ERROR=20001;
}

  • 创建统一返回结果类Result
@Data
public class Result<T> {

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "状态码")
    private Integer code;

    @ApiModelProperty(value = "消息")
    private String message;

    @ApiModelProperty(value = "返回的数据")
    private T data;

    @ApiModelProperty(value = "动态数据")
    private Map map = new HashMap();

    /**
     * 防止直接new
     */
    private Result(){};

    /**
     * 成功的静态方法
     */
    public static<T> Result<T> ok(  ){
        Result r=new Result();
        r.success=true;
        r.code=ResultCode.SUCCESS;
        r.message="成功";
        return r;
    }

    /**
     * 失败的静态方法
     */
    public static Result failed( ){
        Result r=new Result();
        r.success=false;
        r.code=ResultCode.ERROR;
        r.message="失败";
        return r;
    }
    
    public Result addCode(Integer code){
        this.setCode(code);
        return this;
    }
    public Result addMessage(String message){
        this.setMessage(message);
        return this;
    }
    public Result<T> addData(T data){
        this.setData(data);
        return this;
    }

    /**
     * 用来操作 map = new HashMap(); 动态数据
     * @param key
     * @param value
     * @return
     */
    public Result<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}

2.数据自动填充

  • 先给需要自动填充的数据加上注解@TableField(fill = FieldFill.INSERT)或者@TableField(fill = FieldFill.INSERT_UPDATE)在这里插入图片描述

  • 编写MyMetaObjectHandler类去实现MetaObjectHandler接口

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //属性名称,不是字段名称
        this.setFieldValByName("gmtCreate", new Date(), metaObject);
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}

3.统一异常处理

全局异常处理

  • 定义一个异常类GlobalExceptionHandler并加上注解@ControllerAdvice
  • 异常处理类编写具体的对异常处理方法,在方法上添加注解@ExceptionHandler
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    //全局异常处理
    @ResponseBody//返回json数据
    @ExceptionHandler(Exception.class)
    public Result error(Exception e){
        log.info("当前异常信息\n",e);
        return Result.fail("全局异常处理");
    }
}

自定义异常处理

一:创建自定义异常处理类,继承 RuntimeException

public class GgktException extends RuntimeException{
}

二:在自定义异常处理类里面创建属性

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GgktException extends RuntimeException{
    private Integer code;//状态码
    private String msg;//异常信息


}

三:在全局异常处理类上添加上自定义的异常处理方法

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
 
    @ResponseBody//返回json数据
    @ExceptionHandler(Exception.class)   //全局异常处理Exception.class
    public Result error(Exception e){
        log.info("当前异常信息\n",e);
        return Result.fail("全局异常处理");
    }

 	@ResponseBody
    @ExceptionHandler(GgktException.class)  //自定义的异常处理方法
    public Result divError(GgktException e){
        log.info("当前异常信息\n",e.getMsg());
        return Result.fail("自定义的异常处理");
    }

四:手动抛出自定义异常

    public Result<List<Teacher>> findAllTeacher(){
        
        
        try{
            int i=1/0;
        }catch (Exception e){
            //手动抛出异常
            throw new GgktException(201,"执行了自定义异常处理");
        }
        List<Teacher> teacherList = teacherService.list();
        return Result.ok(teacherList);
    }

4.统一日志处理

在配置文件设置日志级别
logging.level.root=warn


把日志输出到文件中使用日志工具Logback用法和log4j差不多

  • 1.删除 配置文件的日志配置在这里插入图片描述
  • 2.resource文件中创建logback-spring.xml粘贴以下代码即可
    代码查看线路1 =====>点击查看代码
    代码查看线路2 =====>点击查看代码

最后

持续更新中 欢迎大家补充留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络实验之HSRP协议

一、HSRP协议简介 HSRP&#xff1a;热备份路由器协议&#xff08;HSRP&#xff1a;Hot Standby Router Protocol&#xff09;&#xff0c;是cisco平台一种特有的技术&#xff0c;是cisco的私有协议。该协议中含有多台路由器&#xff0c;对应一个HSRP组。该组中只有一个路由器承…

mac自定义环境变量,mac自定义python变量,自定义通用变量(任意名字)

文章目录几个常用的命令工作原理知道原理后已经有了环境变量没有该环境变量几个常用的命令 功能命令查看当前环境变量echo $PATH编辑文件&#xff08;注&#xff1a;这里是直接编辑bash_profile&#xff09;vi ~/.bash_profile编辑i退出编辑esc回到命令&#xff08;用命令来保…

Apollo实现cron语句的热配置

GitHub项目地址 Gitee项目地址 Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性&#xff0c;适…

stl algorithms 算法

所有泛型算法&#xff0c;除了少数例外&#xff0c;前两个参数均为一组iterator&#xff0c;用来标识欲遍历容器元素的范围&#xff0c;范围从第一个iterator所指位置开始&#xff0c;至第二个iterator所指位置&#xff08;并不包括&#xff09;结束 如 int arr[3]{1,2,3} ve…

管理客户信息并非易事

客户信息是企业的重要资产&#xff0c;是企业日积累月的价值沉淀&#xff0c;管理客户信息对于企业来说并不是一件容易的事&#xff0c;只有妥善管理客户信息&#xff0c;才能为企业创造更多价值。前言众所周知&#xff0c;客户信息是企业的重要资产&#xff0c;是企业日积累月…

rtu遥测终端机应用及安装介绍

1、设备介绍 设备集遥测终端机功能和视频录像机功能为一体&#xff0c;融合先进的3G/4G/WIFI通信技术、实现水文/水资源/环保212/TCP Modbus/MQTT等数据的采集、视频、图像存储、显示、控制、报警及传输等智能值守功能。 2、设备应用方向 本设备可广泛适用于带视频监测的水…

Jenkins 构建过程中提示 GPG 错误

错误信息如下&#xff1a;[INFO] --- maven-gpg-plugin:3.0.1:sign (sign-artifacts) rets-io --- gpg: no default secret key: No secret keygpg: signing failed: No secret key这个问题的原因应该是我们最近把我们的项目发布到中央 Maven 仓库中&#xff0c;但是发布项目到…

社区发现系列05:图的构建

想要挖掘作弊团伙首先先要构建社交网络图&#xff0c;然后用算法或者策略挖掘作弊团伙&#xff0c;那么如何构建社交网络图呢&#xff1f;下面给大家介绍一些实战经验&#xff0c;主要从电商和互金小额贷款两个业务场景来说&#xff1a; 1、电商业务 由于电商业务涉及的业务场…

《Spring揭秘》读书笔记1:IoC和AOP

1 Spring框架的由来 Spring框架的本质&#xff1a;提供各种服务&#xff0c;以帮助我们简化基于POJO的Java应用程序开发。 各种服务实现被划分到了多个相互独立却又相互依赖的模块当中&#xff1a; Core核心模块&#xff1a;IoC容器、Framework工具类。 AOP模块&#xff1a;S…

万物皆可灵活用工?灵活用工模式最契合的行业是哪些?

灵活用工VS传统用工 1&#xff09;传统用工 企业与员工签订劳动合同&#xff0c;双方出现问题纠纷适用于劳动法&#xff0c;关系固定&#xff0c;企业责任大。养着你&#xff0c;难&#xff0c;辞了你&#xff0c;更难。企业成本相对较高、负担较重&#xff08;薪资、福利&am…

Hudi的核心概念 —— 表类型(Table Types)

文章目录Copy On WriteMerge On ReadCOW 与 MOR 的对比查询类型&#xff08;Query Types&#xff09;Snapshot QueriesIncremental QueriesRead Optimized Queries不同表支持的查询类型Copy On Write 在 COW 表中&#xff0c;只有数据文件/基本文件&#xff08;.parquet&#…

【Java寒假打卡】Java基础-集合HashSet

【Java寒假打卡】Java基础-集合Set概述哈希值hashSet原理HashSet存储学生对象并遍历小结概述 底层数据结构是哈希表不能保证存储和去除的顺序完全一致没有带索引的方法&#xff0c;所以不能使用普通的for循环进行遍历 使用增强for循环或者迭代器进行遍历由于是Set集合&#xf…

广告业务系统 之 承前启后 —— “消息中心”

文章目录广告业务系统 之 承前启后 —— “消息中心”消息中心物料同步链路图模块设计之 “一分为二”模块交互图之 “强一致性设计”奇怪交互图的数据链路数据一致性问题日志中心广告业务系统 之 承前启后 —— “消息中心” 消息中心 消息中心&#xff0c;是为 投放引擎 做…

韩顺平老师的Linux基础学习笔记 (上)

Linux学习笔记 前言&#xff1a;本系列笔记的参考由 2021韩顺平 一周学会Linux 总结而成&#xff0c;希望能给学习Linux的同学一些帮助。也感谢韩老师录制的视频给我带来了非常巨大的收获&#xff01; 目录&#xff1a; 韩顺平老师的Linux基础学习笔记 (上)韩顺平老师的Linu…

交通部互通互联二维码之发卡机构公钥证书

背景 随话说的好啊&#xff0c;好比不如烂笔头&#xff0c;之前开发联调OK后&#xff0c;闲置了半年&#xff0c;结果今天再去搞公钥&#xff0c;发现完全忘记了生成规则。审核 有病 哪里来的广告&#xff1f; 特此&#xff0c;记录一下我们的过程&#xff0c;以便后面再出现…

gitee的ssh配置

#1.配置自己的gitee郵箱&#xff0c;返回直接輸入郵箱 ssh-keygen -t rsa -C "郵箱" #2.複製郵箱的ssh秘鑰 cat ~/.ssh/id_rsa.pub #在個人配置添加自己的ssh秘鑰

【jQuery】常用API——jQuery样式

jQuery 给我们封装了很多动画效果&#xff0c;最为常见的如下&#xff1a;一、显示隐藏切换效果1. 显示语法规范 show([speed,[easing],[fn]]);显示参数&#xff1a;&#xff08;1&#xff09;参数都可以省略&#xff0c; 无动画直接显示。&#xff08;2&#xff09;speed&…

(十五)一篇文章搞懂Java的内部类

目录 1.概述: 2.内部类之一:静态内部类 3.内部类之二:成员内部类 4.内部类之三:局部内部类 5.内部类之四:匿名内部类 1.概述: 内部类就是定义在一个类里面的类&#xff0c;里面的类可以理解成(寄生)。 2.内部类的使用场景、作用&#xff1a; ①当一个事务的内部&#xff0c;还…

前端如何上传图片文件

效果图html代码js效果图 效果&#xff1a; 这篇博客必须要后台调用你的js函数&#xff0c;如果后台不打算调用你的js函数可以放弃此篇博客了&#xff0c;或者自己将代码改良。如果后台接受该代码可以参考这篇文章&#xff1a;&#xff08;如果后台不是使用php,也没关系只要返…

.net工作流引擎ccflow集成并增加自定义功能

一、为什么需要自定义扩展1、第三方类库已满足大部分需求&#xff0c;剩下的根据具体业务需求抽象成公共功能进行扩展2、第三方呈现的web页面与原类库耦合度较高&#xff0c;希望在原页面上扩展而不影响原来的功能3、在完全不修改第三方类库及web页面的情况下&#xff0c;加入自…