启动测试bug
表格不存在,需要加上@TableName()在entity里,@TableId标识主键
提示:公用模块修改后需要maven重新install
统一响应格式
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> implements Serializable {
private Integer code;
private String msg;
private T data;
public ResponseResult() {
this.code = AppHttpCodeEnum.SUCCESS.getCode();
this.msg = AppHttpCodeEnum.SUCCESS.getMsg();
}
public ResponseResult(Integer code, T data) {
this.code = code;
this.data = data;
}
public ResponseResult(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public ResponseResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public static ResponseResult errorResult(int code, String msg) {
ResponseResult result = new ResponseResult();
return result.error(code, msg);
}
public static ResponseResult okResult() {
ResponseResult result = new ResponseResult();
return result;
}
public static ResponseResult okResult(int code, String msg) {
ResponseResult result = new ResponseResult();
return result.ok(code, null, msg);
}
public static ResponseResult okResult(Object data) {
ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMsg());
if (data != null) {
result.setData(data);
}
return result;
}
public static ResponseResult errorResult(AppHttpCodeEnum enums) {
return setAppHttpCodeEnum(enums, enums.getMsg());
}
public static ResponseResult errorResult(AppHttpCodeEnum enums, String msg) {
return setAppHttpCodeEnum(enums, msg);
}
public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums) {
return okResult(enums.getCode(), enums.getMsg());
}
private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String msg) {
return okResult(enums.getCode(), msg);
}
public ResponseResult<?> error(Integer code, String msg) {
this.code = code;
this.msg = msg;
return this;
}
public ResponseResult<?> ok(Integer code, T data) {
this.code = code;
this.data = data;
return this;
}
public ResponseResult<?> ok(Integer code, T data, String msg) {
this.code = code;
this.data = data;
this.msg = msg;
return this;
}
public ResponseResult<?> ok(T data) {
this.data = data;
return this;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
返回结果枚举类
public enum AppHttpCodeEnum {
// 成功
SUCCESS(200,"操作成功"),
// 登录
NEED_LOGIN(401,"需要登录后操作"),
NO_OPERATOR_AUTH(403,"无权限操作"),
SYSTEM_ERROR(500,"出现错误"),
USERNAME_EXIST(501,"用户名已存在"),
PHONENUMBER_EXIST(502,"手机号已存在"), EMAIL_EXIST(503, "邮箱已存在"),
REQUIRE_USERNAME(504, "必需填写用户名"),
CONTENT_NOT_NULL(506, "评论内容不能为空"),
FILE_TYPE_ERROR(507, "文件类型错误,请上传png文件"),
LOGIN_ERROR(505,"用户名或密码错误");
int code;
String msg;
AppHttpCodeEnum(int code, String errorMessage){
this.code = code;
this.msg = errorMessage;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
《简单》查询最热文章 view_Counts
postman测试-----》localhost:7777/article/hotArticle
controller–》service–》servicerImpl
/**
* 查询热门文章,封装为ResponseResult返回
*/
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>();
//按照浏览量进行排序
queryWrapper.orderByDesc(Article::getViewCounts);
Page<Article> page = new Page<>(1,10);
page(page,queryWrapper);
List<Article> articles = page.getRecords();
//BeanUtils拷贝
List<HotArticleVo> hotArticleVos = new ArrayList<>();
for (Article article:articles) {
HotArticleVo vo = new HotArticleVo();
BeanUtils.copyProperties(article,vo);
hotArticleVos.add(vo);
}
return ResponseResult.okResult(hotArticleVos);
}
跨域问题
@Configuration
public class WemvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//设置允许跨域的路径
registry.addMapping("/**")
//设置跨域请求的域名
.allowedOriginPatterns("*")
//是否允许cookie
.allowCredentials(true)
//设置允许的请求方式
.allowedMethods("GET", "POST", "DELETE", "PUT")
//设置允许的header属性
.allowedHeaders("*")
//跨域允许时间
.maxAge(3600);
}
}
字面量处理,敏感信息隐藏
package com.delete.constants;
public class SystemConstants {
/**
* 文章是草稿
*/
public static final int ARTICLE_STATUS_DRAFT = 1;
/**
* 文章是正常分布状态
*/
public static final int ARTICLE_STATUS_NORMAL = 0;
}
BeanUtils拷贝工具类
//单个对象拷贝
private static <V> V copyBean(Object source,Class<V> clazz){
//创建目标对象
V result = null;
try {
result = clazz.newInstance();
//实现属性拷贝
BeanUtils.copyProperties(source,result);
} catch (Exception e) {
e.printStackTrace();
}
//返回结果
return result;
}
//集合对象拷贝
public static <O,V>List<V> copyBeanList(List<O>list,Class<V> clazz){
return list.stream()
.map(o -> copyBean(o, clazz))
.collect(Collectors.toList());
}
EasyCode模板
Mapper
##导入宏定义
$!{define.vm}
##设置表后缀(宏定义)
#setTableSuffix("Mapper")
##保存文件(宏定义)
#save("/mapper", "Mapper.java")
##包路径(宏定义)
#setPackageSuffix("mapper")
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
##表注释(宏定义)
#tableComment("表数据库访问层")
public interface $!{tableName} extends BaseMapper<$!tableInfo.name> {
}
entity
##导入宏定义
$!{define.vm}
##保存文件(宏定义)
#save("/entity", ".java")
##包路径(宏定义)
#setPackageSuffix("entity")
##自动导入包(全局变量)
$!{autoImport.vm}
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
##表注释(宏定义)
#tableComment("表实体类")
@SuppressWarnings("serial")
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("$!{tableInfo.name}")
public class $!{tableInfo.name} {
#foreach($column in $tableInfo.pkColumn)
#if(${column.comment})//${column.comment}#end
@TableId
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.otherColumn)
#if(${column.comment})//${column.comment}#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
}
service
##导入宏定义
$!{define.vm}
##设置表后缀(宏定义)
#setTableSuffix("Service")
##保存文件(宏定义)
#save("/service", "Service.java")
##包路径(宏定义)
#setPackageSuffix("service")
import com.baomidou.mybatisplus.extension.service.IService;
##表注释(宏定义)
#tableComment("表服务接口")
public interface $!{tableName} extends IService<$!tableInfo.name> {
}
serviceImpl
##导入宏定义
$!{define.vm}
##设置表后缀(宏定义)
#setTableSuffix("ServiceImpl")
##保存文件(宏定义)
#save("/service/impl", "ServiceImpl.java")
##包路径(宏定义)
#setPackageSuffix("service.impl")
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
##表注释(宏定义)
#tableComment("表服务实现类")
@Service("$!tool.firstLowerCase($tableInfo.name)Service")
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper, $!{tableInfo.name}> implements $!{tableInfo.name}Service {
}
分类查询文章
多表分步查询----》localhost:7777/category/getCategoryList
@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
@Autowired
private ArticleService articleService;
@Override
public ResponseResult getCategoryList() {
//分步查询,一般不建议多表联查
//查询文章表状态(weight)为1
LambdaQueryWrapper<Article> articleWrapper = new LambdaQueryWrapper();
articleWrapper.eq(Article::getWeight, SystemConstants.ARTICLE_WEIGHT_NORMAL);
List<Article> articleList = articleService.list(articleWrapper);
//获取文章的分类id,并去重
Set<Integer> categoryIds = articleList.stream()
.map(article -> article.getCategoryId())
.collect(Collectors.toSet());
//查询分类表
List<Category> categories = listByIds(categoryIds);
//封装vo
List<CategoryVo> categoryVos = BeanCopyUtils.copyBeanList(categories, CategoryVo.class);
return ResponseResult.okResult(categories);
}
}
分页查询
以前写过但是忘记了======》localhost:7777/article/articleList?pageNum=2&pageSize=1
1.MybatisPlus需要添加分页配置,否则不起分页插件作用
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
2.注入service时发生循环转入,添加@Lazy注解
3.要新建数据表中不存在的字段且为其复制
//类别名称,表示为不存在
@TableField(exist = false)
private String categoryName;
4.简化查询
stream流
articles.stream()
.map(article -> article.
setCategoryName(categoryService.getById(article.getCategoryId()).getCategoryName()))
.collect(Collectors.toList());
==========等于
articles.stream()
// .map(new Function<Article, Article>() {
//stream流,较复杂
// @Override
// public Article apply(Article article) {
// //获取分类id,查询分类名称
// Category category = categoryService.getById(article.getCategoryId());
// //把分类名称重新设置回去
// article.setCategoryName(category.getCategoryName());
// return article;
// }
5.lombok注解
set方法返回值为一个对象/不加为void
fastJson配置,规范日期格式
写在webmvcConfig
@Bean//用bean注入fastJsonMessageConvertor,规范日期格式
public HttpMessageConverter fastJsonMessageConvertor(){
FastJsonHttpMessageConverter fastConvertor = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
SerializeConfig.globalInstance.put(Long.class, ToStringSerializer.instance);
fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);
fastConvertor.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConvertor;
return converter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(fastJsonMessageConvertor());
}
文章详情查询
localhost:7777/article/id=1
为PathVariable写法,/xxx?id=1&xxx为query写法
controller
@GetMapping("/id={id}")
public ResponseResult getArticleDetail(@PathVariable("id") Integer id){
return articleService.getArticleDetail(id);
}
}
serviceImpl
@Override
public ResponseResult getArticleDetail(Integer id) {
//根据id查询文章
Article article = getById(id);
//转换为VO
ArticleDetailVo articleDetailVo = BeanCopyUtils.copyBean(article, ArticleDetailVo.class);
//根据分类id查询分类名
Integer categoryId = articleDetailVo.getCategoryId();
Category category = categoryService.getById(categoryId);
if (category!=null){
articleDetailVo.setCategoryName(category.getCategoryName());
}
//封装响应返回
return ResponseResult.okResult(articleDetailVo);
}
友链
localhost:7777/link/getAllLink
serviceImpl
@Override
public ResponseResult getAllLink() {
//查询所有审核通过的
LambdaQueryWrapper<Link> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Link::getStatus, SystemConstants.Link_STATUS_NORMAL);
List<Link> list = list(queryWrapper);
//转换为VO
List<LinkVo> linkVos = BeanCopyUtils.copyBeanList(list, LinkVo.class);
return ResponseResult.okResult(linkVos);
}