1、创建springboot项目,导包
spring-boot-starter排除spring-boot-starter-logging
这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。
spring-boot-starter-log4j2
相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;
spring-boot-starter-aop
面向切面编程
spring-boot-starter-data-redis
Redis是一种高性能的非关系型数据库。redis作用在内存,性能极高。SpringBoot同样可以把Redis整合到项目里。
spring-boot-starter-mail
以目前IT系统功能来看,邮件功能是非常重要的一个功能。例如:找回密码、邮箱验证,邮件动态码、忘记密码,邮件营销等,都需要用到邮件功能。结合当下最流行的spring boot微服务,推出了spring-boot-starter-mail邮件支持包。
spring-boot-starter-web
引入spring web所需要的全部jar
spring-boot-starter-test
测试
fastjson
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
mysql-connector-java
mysql所需
spring-boot-configuration-processor
spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,就需要使用spring-boot-configuration-processor了
再在配置类开头加上@PropertySource("classpath:your.properties"),其余用法与加载yml的配置一样
@PropertySource 中的属性解释
1.value:指明加载配置文件的路径。
2.ignoreResourceNotFound:指定的配置文件不存在是否报错,默认是false。当设置为 true 时,若该文件不存在,程序不会报错。实际项目开发中,最好设置 ignoreResourceNotFound 为 false。
3.encoding:指定读取属性文件所使用的编码,我们通常使用的是UTF-8。
当我们使用 @Value 需要注入的值较多时,代码就会显得冗余,于是 @ConfigurationProperties 登场了
commons-lang3
apache提供的众多commons工具包,号称Java第二API,而common里面lang3包更是被我们使用得最多的
包结构
org.apache.commons.lang3
org.apache.commons.lang3.builder
org.apache.commons.lang3.concurrent
org.apache.commons.lang3.event
org.apache.commons.lang3.exception
org.apache.commons.lang3.math
org.apache.commons.lang3.mutable
org.apache.commons.lang3.reflect
org.apache.commons.lang3.text
org.apache.commons.lang3.text.translate
org.apache.commons.lang3.time
org.apache.commons.lang3.tuple
commons-collections
Commons Collections增强了Java集合框架。 它提供了几个功能来简化收集处理。 它提供了许多新的接口,实现和实用程序。
mybatis-plus-boot-starter
mybatis-plus需要的jar
lombok
自动生成setter、全参、无参等方法
joda-time
在Java中处理日期和时间是很常见的需求,基础的工具类就是我们熟悉的Date和Calendar,然而这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的库。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 排除 默认使用的logback -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.10</version>
</dependency>
</dependencies>
2、Mybatis分页插件
package com.okyang.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
//让spring可以扫描到配置文件
@Configuration
//扫描到mapper包下的xml
@MapperScan("com.okyang.dao.mapper")
public class MybatisPlusConfig {
// 分页插件
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor Interceptor = new MybatisPlusInterceptor();
Interceptor.addInnerInterceptor( new PaginationInnerInterceptor());
return Interceptor;
}
}
3、跨域配置
package com.okyang.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
// 跨域配置
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080");
}
}
4、springboot配置文件
#server
server.port= 8888
spring.application.name=okyang_blog
# datasource
spring.datasource.url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimeZone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#mybatis-plus
#打印日志输出sql语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#标识表前缀ms
mybatis-plus.global-config.db-config.table-prefix=ms_
5、编写实体类和Mapper
package com.okyang.dao.pojo;
import lombok.Data;
@Data
public class Article {
public static final int Article_TOP = 1;
public static final int Article_Common = 0;
private Long id;
private String title;
private String summary;
private int commentCounts;
private int viewCounts;
/**
* 作者id
*/
private Long authorId;
/**
* 内容id
*/
private Long bodyId;
/**
*类别id
*/
private Long categoryId;
/**
* 置顶
*/
private int weight = Article_Common;
/**
* 创建时间
*/
private Long createDate;
}
package com.okyang.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.okyang.dao.pojo.Article;
public interface ArticleMapper extends BaseMapper<Article> {
}
6、编写controller
package com.okyang.controller;
import com.okyang.service.ArticleService;
import com.okyang.vo.Result;
import com.okyang.vo.params.PageParms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("articles")
public class AticleController {
@Autowired
private ArticleService articleService;
/**
* 首页 文章列表
* @param pageParms
* @return
*/
@PostMapping
public Result listArticle(@RequestBody PageParms pageParms){
return articleService.listArticle(pageParms);
}
}
7、编写service
package com.okyang.service;
import com.okyang.vo.Result;
import com.okyang.vo.params.PageParms;
public interface ArticleService {
/**
* 分页查询 文章列表
* @param pageParms
* @return
*/
Result listArticle(PageParms pageParms);
}
8、编写service实现类
package com.okyang.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.okyang.dao.mapper.ArticleMapper;
import com.okyang.dao.pojo.Article;
import com.okyang.service.ArticleService;
import com.okyang.vo.ArticleVo;
import com.okyang.vo.Result;
import com.okyang.vo.params.PageParms;
import org.joda.time.DateTime;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleMapper articleMapper;
@Override
public Result listArticle(PageParms pageParms) {
/**
* 分页查询 article数据库表
*/
Page<Article> page = new Page<>(pageParms.getPage(),pageParms.getPageSize());
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>();
//是否置顶排序
// queryWrapper.orderByDesc(Article::getWeight);
//order by create_date desc
queryWrapper.orderByDesc(Article::getWeight,Article::getCreateDate);
Page<Article> articlePage = articleMapper.selectPage(page, queryWrapper);
List<Article> records = articlePage.getRecords();
//能直接返回嘛? 不能
List<ArticleVo> articleVos = copyList(records);
return Result.success(articleVos);
}
private List<ArticleVo> copyList(List<Article> records){
List<ArticleVo> articleVos = new ArrayList<>();
for (Article record : records) {
articleVos.add(copy(record));
}
return articleVos;
}
private ArticleVo copy(Article article){
ArticleVo articleVo = new ArticleVo();
BeanUtils.copyProperties(article,articleVo);
articleVo.setCreateDate(new DateTime(article.getCreateDate()).toString("yyyy-MM-dd HH:mm"));
return articleVo;
}
}
9、页面默认配置
package com.okyang.vo.params;
import lombok.Data;
@Data
public class PageParms {
private int page = 1;
private int pageSize = 10;
}
10、Result的vo
package com.okyang.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Result {
private boolean success;
private int code;
private String msg;
private Object data;
public static Result success(Object data){
return new Result(true, 200, "success", data);
}
public static Result fail(int code,String msg){
return new Result(false, code, msg, null);
}
}
11、AticleVO
package com.okyang.vo;
import lombok.Data;
import java.util.List;
@Data
public class ArticleVo {
private Long id;
private String title;
private String summary;
private int commentCounts;
private int viewCounts;
private int weight;
/**
* 创建时间
*/
private String createDate;
private String author;
// private ArticleBodyVo body;
private List<TagVo> tags;
// private List<CategoryVo> categorys;
}
12、TagVo
package com.okyang.vo;
import lombok.Data;
@Data
public class TagVo {
private Long id;
private String tagName;
}