Springboot开发流程

本文详细介绍了Springboot的开发流程,包括Entity、Mapper、Service、Controller各层的配置与使用,以及Swagger2、Redis、RabbitMq的集成。还涵盖了Enum的使用、异常处理、返回格式统一、SpringCloud微服务集成、Docker打包镜像、CI/CD持续集成等内容,全面讲解了Springboot应用的开发与部署。
摘要由CSDN通过智能技术生成

一、Entity

实体类中属性标注时的注解

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data//1 基本构造方法可以加@AllArgsConstructor和@NoArgsConstructor
@ApiModel("文章")//2  swagger标题 属性注解
public class Article {
   

    @ApiModelProperty("要闻id")
    Integer articleId;//3 实体字段要和数据库一样

    @ApiModelProperty("文章名称")
    String articleName;

}

Swagger依赖

 		<dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.6.0</version>
        </dependency>

Lombok依赖

		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

二、 Mapper

继承BaseMapper<实体>可以使用batisplus

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Repository//使用此注解将此接口注入到spring容器
public interface ArticleMapper extends BaseMapper<Article> {
   

	//使用select语句时 增加注解和语句,以下为示例
    @Select("SELECT * FROM `guli`.`Article` LIMIT 0, 1000")
    List<Article> getArticleInfo();  ***返回值类型一定要想好,很坑

    @Select("SELECT * FROM `guli`.`Article` WHERE `articleName` = #{articleName}")
    Article getOneByUser(@Param("articleName") String ArticleName );
}

mabatisPlus依赖:

不导入出现过Invalid bound statement (not found): com.example.test.mapper.ArticleMapper.selectList] with root cause 搞了我一下午

			<dependency>
			    <groupId>com.baomidou</groupId>
			    <artifactId>mybatis-plus-core</artifactId>
			    <version>3.2.0</version>
			</dependency>

**找不到mapper主启动类增加@MapperSacn 注解

同时pom中需要加入依赖**

		@MapperScan({
   "com.example.test.mapper"})
 		<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        
		<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.5</version>
        </dependency>

Tips:使用mybatisplus的时候需要注意实体类和数据库之间的规范

数据库配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://139.224.234.236:3306/guli?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

三、Service

编写接口


public interface ArticleService {
   
		
	//返回值类型   函数名(参数)
    List<Article>  getArticleInfo();
}

ServiceImpl:
//实现接口 public class A implements ServiceExample

- 1、依赖注入

@Service//自动装配到spring容器中去
public class ArticleServiceImp implements ArticleService {
   
	//依赖注入方式一,注解自动注入
	//@Autowired
    //private ArticleMapper articleMapper;
	//依赖注入方式二,构造器注入
	 private ArticleMapper articleMapper;
	
	 public ArticleServiceImp(ArticleMapper articleMapper){
   
        this.articleMapper=articleMapper;
    }
	/**格式:public 当前类(classA a){		
			this.a=a
			}
	**/
}

- 2、日志打印

private static final Logger log = LoggerFactory.getLogger(ArticleServiceImp.class);
	//使用方法:{}后跟传入的object eg:
		List<Article> articleInfo = this.articleMapper.selectList(null);
	    log.info("查询到数据:{}",articleInfo);

- 3、重写接口

快捷键:ctrl+i

public List<Article> getArticleInfo() {
   
        
        //调用mybatisplus的方法查询
        List<Article> articleInfo = this.articleMapper.selectList(null);
        log.info("查询到数据:{}",articleInfo);
        return articleInfo;//要注意返回值符合定义的接口返回值类型
    }

四、Controller

以下分无参,有参restful风格,有参?传参和请求体

@RestController//返回是rest风格的数据  可以用@Controller 返回页面
@RequestMapping("/test")//请求Url
public class ArticleController {
   
	@Autowired
    private ArticleService articleService;
  
   public 返回值类型 函数(参数){
    
		业务逻辑;
		return 返回值类型;
		} 
	//get请求Url,不同的请求方法使用不同注解 eg: @PostMapping
	@GetMapping("/art")
    public List<Article> get(){
    
        List<Article> articleInfo = articleService.getArticleInfo();
        return articleInfo;
    }
	
	//参数restful style   http://127.0.0.1:9000/test/art1/姜秋峰/1   
	@GetMapping("/art1/{name}/{id}")//-----url后面的参数和注解内的参数对应
   public Article get1(@PathVariable("name") String articlename,@PathVariable("id") int articleid){
   
        Article article = articleMapper.getOneByUser(articlename);
        return article ;
    }
  
  
  //参数?传参     http://127.0.0.1:9000/test/art1/?name=姜秋峰&id=1
	@GetMapping("/art2)//-----url后面的参数和注解内的参数对应   好像不能中文
   public Article get2(String articlename,int articleid){
   
        Article article = articleMapper.getOneByUser(articlename);
       	article.setArticleid(id);
        return article ;
    }


	//参数请求体@RequestBody注解    --注意请求body内的参数要是实体类定义的参数,不能瞎填
	//http://127.0.0.1:9000/test/art3    请求body{"articleName":"jqf","articleid":111}
	@PostMapping("/art3")// ArticleVoreq 自定义请求实体,也可以自定义返回实体
    public Article get3(@RequestBody ArticleVoReq articleVoReq){
   
        Article article= articleMapper.getOneByUser(articleVo.getArticleName());
        article.setArticleid(articleVo.getArticleid());
        return article;
    }

	Tips:请求头是这样的@RequestHeader(name = "Authorization",required = true)
}

五、Application.properties

mysql配置

注意:数据库后面的时区编码等配置,我又被坑了一晚上

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://139.224.234.236:3306/guli?serverTimezone=UTC&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

Redis配置

spring.redis.host=139.224.234.236
spring.redis.port=6379
spring.redis.database= 0
spring.redis.password= bwadmin
spring.redis.timeout=1800000

RabbitMq配置

spring.rabbitmq.host=139.224.234.236
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/

日志打印级别配置

logging.level.com.example.test.mapper=debug
logging.level.包路径=日志level

自定义配置

使用@Value 必须把类注入到spring 中去,不然无法使用,读不到。

config.uname=jiangqf
使用:
   @Value("${config.uname}")--properties和yml一样的使用。
    private String uname="hi";
     System.out.println(uname);
     打印出jiangqf

Application.yml(转换地址)

六、集成Swagger2

1、导入依赖

**

	  <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- 访问页面靠这个,我忙活了好久-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.2.2</version>
        </dependency>

2、实体类内配置

@ApiModel(“”)实体名称 &&@ApiModelProperty(“”)实体参数名称
@ApiModel 注解用于实体类,表示对类进行说明,用于参数用实体类接收。
@ApiModelProperty 注解用于类中属性,表示对 model 属性的说明或者数据操作更
改。

@ApiModel("文章")
public class Article {
   

    @ApiModelProperty("要闻id")
    private Integer articleid;

    @ApiModelProperty("文章名称")
    private String articleName;

}

3、Controller内配置

@Api(“”)总接口&&@ApiOperation(“”)接口描述&&@ApiParam
@Api 注解用于类上,表示标识这个类是 swagger 的资源。
@ApiOperation 注解用于方法,表示一个 http 请求的操作。
@ApiParam 注解用于参数上,用来标明参数信息。

@Api("测试")
@RestController
@RequestMapping("/test")
public class ArticleController {
   

    @Autowired
    private ArticleService articleService;

    @ApiOperation("获取对应文章信息")
    @PostMapping("/art2")
    public List<Article> get2(@ApiParam(value = "用户名称") String name,@ApiParam(value = "用户id")Interger id){
   
        List<Article> articleinfo = articleMapper.getOneByUser(name);
        return articleinfo;
    }
}

4、Swagger内的截图

在这里插入图片描述

5、SwaggerConfig配置UI界面的信息

@Configuration
@EnableSwagger2
public class SwaggerConfig {
   

    @Bean
    public Docket webApiConfig(){
   

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("web888")
                .apiInfo(webApiInfo())
                .select()
//                .paths(Predicates.not(PathSelectors.regex("/admin/.*")))
                .paths(Predicates.not(PathSelectors.regex("/error.*")))
                .build();

    }

    private ApiInfo webApiInfo(){
   

        return new ApiInfoBuilder()
                .title("网站-课程中心API文档")
                .description("本文档描述了课程中心微服务接口定义")
                .version("1.0")
                .build();
    }
}

七、集成Redis

1、依赖导入

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、RedisUtil

package com.example.test.utils;

//---工具类 redisutils
//
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Author: wxySmile
 * @Date 20-1-5 上午11:58
 */
@Component
public class RedisUtil {
   


    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 指定缓存失效时间
     * @param key 键
     * @param time 时间(秒)
     * @return
     */
    public boolean expire(String key,long time){
   
        try {
   
            if(time>0){
   
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
   
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据key 获取过期时间
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    public long getExpire(String key){
   
        return redisTemplate.getExpire(key,TimeUnit.SECONDS);
    }

    /**
     * 判断key是否存在
     * @param key 键
     * @return true 存在 false不存在
     */
    public boolean hasKey(String key){
   
        try {
   
            return redisTemplate.hasKey(key);
        } catch (Exception e) {
   
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除缓存
     * @param key 可以传一个值 或多个
     */
    @SuppressWarnings("unchecked")
    public void del(String ... key){
   
        if(key!=null&&key.length>0){
   
            if(key.length==1){
   
                redisTemplate.delete(key[0]);
            }else{
   
                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }

    //============================String=============================
    /**
     * 普通缓存获取
     * @param key 键
     * @return 值
     */
    public Object get(String key){
   
        return key==null?null:redisTemplate.opsForValue().get(key);
    }

    /**
     * 普通缓存放入
     * @param key 键
     * @param value 值
     * @return true成功 false失败
     */
    public boolean set(String key,Object value) {
   
        try {
   
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
   
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 普通缓存放入并设置时间
     * @param key 键
     * @param value 值
     * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @return true成功 false 失败
     */
    public boolean set(String key,Object value,long time){
   
        try {
   
            if(time>0){
   
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            }else{
   
                set(key, value)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值