一、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)