隐藏页面特效

个人博客项目笔记_02

1|01. 统一异常处理


不管是controller层还是service,dao层,都有可能报异常,如果是预料中的异常,可以直接捕获处理,如果是意料之外的异常,需要统一进行处理,进行记录,并给用户提示相对比较友好的信息。

package com.cherriesovo.blog.handler; import com.cherriesovo.blog.vo.Result; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; //对加了@Controller注解的方法进行拦截处理 AOP的实现 @ControllerAdvice public class AllExceptionHandler { //进行异常处理,处理Exception.class的异常 @ExceptionHandler(Exception.class) @ResponseBody //返回json数据 public Result doException(Exception ex){ ex.printStackTrace(); return Result.fail(-999,"系统异常"); } }

2|02. 首页-最热文章


2|12.1 接口说明


接口url:/articles/hot

请求方式:POST

请求参数:

参数名称 参数类型 说明

返回数据:

{ "success": true, "code": 200, "msg": "success", "data": [ { "id": 1, "title": "springboot介绍以及入门案例", }, { "id": 9, "title": "Vue.js 是什么", }, { "id": 10, "title": "Element相关", } ] }

2|22.2 Controller


ArticleController:

@PostMapping("hot") public Result hotArticle(){ int limit = 5; return articleService.hotArticle(limit); }

2|32.3 Service


LambdaQueryWrapper<Article>QueryWrapper<Article> 都是 MyBatis-Plus 提供的用于构建查询条件的包装器,它们之间的主要区别在于构建查询条件的方式不同。

  1. LambdaQueryWrapper
    • LambdaQueryWrapper 是基于 Lambda 表达式的方式构建查询条件的,可以使用 Lambda 表达式直接引用实体类的属性。
    • 通过 Lambda 表达式引用属性,可以避免硬编码字段名称,使代码更加清晰易懂。
    • 由于使用了 Lambda 表达式,编译器可以在编译时进行类型检查,避免一些常见的拼写错误或属性不存在的问题。
  2. QueryWrapper
    • QueryWrapper 是传统的方式构建查询条件的,需要通过字符串指定字段名,比较符号等。
    • 在构建查询条件时,需要手动输入属性的名称,容易出现拼写错误或者属性不存在的问题。
    • 不具备 Lambda 表达式的类型检查和编译时安全性。

因此,如果项目采用了 Java 8 及以上的版本,推荐使用 LambdaQueryWrapper,它更加直观、类型安全,并且代码更加清晰易读。而如果项目不支持 Lambda 表达式或者需要与旧的代码兼容,可以继续使用 QueryWrapper

queryWrapper.orderByDesc(Article::getViewCounts)详解:

这行代码使用了 LambdaQueryWrapperorderByDesc 方法,用于指定查询结果按照指定字段进行降序排序。具体解释如下:

  • queryWrapper:这是一个 LambdaQueryWrapper<Article> 对象,用于构建查询条件和排序规则。
  • orderByDesc:这是 LambdaQueryWrapper 提供的方法之一,用于指定按照指定字段进行降序排序。
  • Article::getViewCounts:这是一个 Java 8 的方法引用,指定了排序的字段。Article 是实体类,getViewCounts 是该实体类中的一个方法或属性,通常表示文章的浏览量。

综上所述,这行代码的作用是对查询结果按照文章的浏览量字段进行降序排序。

public interface ArticleService { //首页最热文章 Result hotArticle(int limit); }
@Service public class ArticleServiceImpl implements ArticleService { //之前代码已省略。。。 @Override public Result hotArticle(int limit) { LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(Article::getViewCounts); //根据浏览量倒序 queryWrapper.select(Article::getId,Article::getTitle); queryWrapper.last("limit " + limit); //上述三条语句等同于:select id,title from article order by view_counts desc limit 5 List<Article> articles = articleMapper.selectList(queryWrapper); return Result.success(copyList(articles,false,false,false)); } }

2|42.4 测试


3|03. 首页-最新文章


3|13.1 接口说明


接口url:/articles/new

请求方式:POST

请求参数:

参数名称 参数类型 说明

返回数据:

{ "success": true, "code": 200, "msg": "success", "data": [ { "id": 1, "title": "springboot介绍以及入门案例", }, { "id": 9, "title": "Vue.js 是什么", }, { "id": 10, "title": "Element相关", } ] }

3|23.1 Controller


ArticleController:

/* * 最新文章 * */ @PostMapping("new") public Result newArticles(){ int limit = 5; return articleService.newArticles(limit); }

3|33.2 Service


public interface ArticleService { //最新文章 Result newArticles(int limit); }
@Service public class ArticleServiceImpl implements ArticleService { //之前代码已省略。。。 @Override public Result newArticles(int limit) { LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(Article::getCreateDate); queryWrapper.select(Article::getId,Article::getTitle); queryWrapper.last("limit "+limit); //select id,title from article order by create_date desc limit 5 List<Article> articles = articleMapper.selectList(queryWrapper); return Result.success(copyList(articles,false,false,false)); } }

4|04. 首页-文章归档


4|14.1接口说明


接口url:/articles/listArchives

请求方式:POST

请求参数:

参数名称 参数类型 说明

返回数据:

{ "success": true, "code": 200, "msg": "success", "data": [ { "year": "2021", "month": "6", "count": 2 } ] }

4|24.1 Controller


ArticleController:

//json数据进行交互 @RestController @RequestMapping("articles") public class ArticleController { /* * 文章归档 * */ @PostMapping("listArchives") public Result listArchives(){ return articleService.listArchives(); } }

4|34.2 Service


public interface ArticleService { //文章归档 Result listArchives(); }
@Service public class ArticleServiceImpl implements ArticleService { @Override public Result listArchives() { List<Archives> archivesList = articleMapper.listArchives(); return Result.success(archivesList); } }

4|44.3 Dao


package com.cherriesovo.blog.dao.dos; import lombok.Data; // 档案类 @Data public class Archives { private Integer year; private Integer month; private Integer count; //文章数量 }
package com.cherriesovo.blog.dao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.cherriesovo.blog.dao.dos.Archives; import com.cherriesovo.blog.dao.pojo.Article; import java.util.List; public interface ArticleMapper extends BaseMapper<Article> { List<Archives> listArchives(); }
<?xml version="1.0" encoding="UTF-8" ?> <!--MyBatis配置文件--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cherriesovo.blog.dao.mapper.ArticleMapper"> <!--List<Archives> listArchives();--> <select id="listArchives" resultType="com.cherriesovo.blog.dao.dos.Archives"> select year(from_unixtime(create_date/1000)) as year,month(from_unixtime(create_date/1000)) as month,count(*) as count from ms_article group by year,month </select> </mapper>
//使用FROM_UNIXTIME函数将时间戳转换为日期时间格式,并从中提取年份,然后使用YEAR函数提取年份部分。create_date/1000是为了将毫秒级时间戳转换为秒级时间戳,因为大多数数据库中的FROM_UNIXTIME函数接受的是秒级时间戳。 select year(from_unixtime(create_date/1000)) as year,month(from_unixtime(create_date/1000)) as month,count(*) as count from ms_article group by year,month

4|54.4 测试



__EOF__

本文作者CherriesOvO
本文链接https://www.cnblogs.com/zyj3955/p/18127279.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   CherriesOvO  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2021-04-10 关于ECharts图表反复修改都无法显示的解决方案
点击右上角即可分享
微信分享提示