logo

前言

主要记录我在开发这个小说网项目的使用的代码块,方便忘记之后复用和分析

排行榜查询实现开发日志

查询

Mapper层和xml层

1
2
3
IPage<Fiction> selectTopFictionsByClick(Page<?> page);
//selectTopFictionsByClick方法使用IPage作为返回类型,表示返回分页的结果。Page<?> page参数用于传递分页参数。

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.fiction.mapper.FictionMapper">
<select id="selectTopFictionsByClick" resultType="com.example.fiction.entity.Fiction">
SELECT *
FROM fiction
ORDER BY click DESC
</select>

</mapper>

业务层

1
2
3
4
public IPage<Fiction> getTopFictionsByClick() {
Page<Fiction> page = new Page<>(1, 10); // 设置分页参数,获取第一页的前20条数据
return fictionMapper.selectTopFictionsByClick(page);
}

视图层

要将 IPage<Fiction> 转换为 List<Fiction>,你可以使用 IPage 接口提供的方法 getRecords() 来获取数据列表。getRecords() 方法返回一个包含查询结果的列表。以下是一个示例代码:

1
2
javaCopy codeIPage<Fiction> fictionPage = fictionService.getTopFictionsByClick();
List<Fiction> fictionList = fictionPage.getRecords();

上述代码首先从 fictionService.getTopFictionsByClick() 方法中获取 IPage<Fiction> 对象 fictionPage,然后使用 getRecords() 方法将其转换为 List<Fiction> 对象 fictionList

现在你可以通过 fictionList 变量来访问查询结果的列表数据,并进行后续的操作。

需要注意的是,如果 IPage<Fiction> 对象 fictionPage 中的查询结果数据量较大,可能会涉及到分页查询,而不是一次性将所有数据加载到内存中。在这种情况下,fictionList 只包含当前分页的数据,如果需要获取所有数据,请根据具体的需求进行相应的处理。

查到数据后再进行写入到分出来的两个表

List 转换成 List

转化实体

要将 List<Fiction> 转换为 List<FictionClick>,你需要创建一个新的 List<FictionClick>,并遍历原始的 List<Fiction>,将每个 Fiction 对象转换为 FictionClick 对象,然后添加到新的列表中。以下是一个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
javaCopy codeList<Fiction> fictionList = ... // 原始的 Fiction 对象列表

List<FictionClick> fictionClickList = new ArrayList<>();
for (Fiction fiction : fictionList) {
FictionClick fictionClick = new FictionClick();
fictionClick.setFictionId(fiction.getFictionId());
fictionClick.setName(fiction.getName());
fictionClick.setAuthor(fiction.getAuthor());
// 其他属性的转换...

fictionClickList.add(fictionClick);
}

上述代码假设你已经有一个原始的 Fiction 对象列表 fictionList,然后创建一个新的 FictionClick 对象列表 fictionClickList。通过遍历原始列表,将每个 Fiction 对象转换为 FictionClick 对象,并设置相应的属性值,最后将 FictionClick 对象添加到新的列表中。

根据你的实际情况,可能需要根据 Fiction 和 FictionClick 类的属性进行相应的转换操作。上述代码仅提供了一个基本的示例,你需要根据实际情况进行适当的修改和调整。

请注意,转换过程需要确保 Fiction 和 FictionClick 类的属性名称和类型匹配,以及确保 FictionClick 类有与 Fiction 类相应的属性。

覆盖之前的数据

如果你想使用 MyBatis-Plus 的 saveBatch 方法将 FictionClick 对象列表保存到数据库,并在遇到重复数据时按照书籍 ID 进行覆盖更新,你可以使用 saveOrUpdateBatch 方法来实现。

saveOrUpdateBatch 方法可以将列表中的数据批量保存到数据库,并在遇到重复数据时进行覆盖更新。在此过程中,它会根据实体对象的主键进行判断,如果主键存在,则执行更新操作;如果主键不存在,则执行插入操作。

以下是示例代码:

1
2
3
4
5
6
7
8
javaCopy codeList<FictionClick> fictionClickList = ... // FictionClick 对象列表

boolean success = fictionClickService.saveOrUpdateBatch(fictionClickList);
if (success) {
System.out.println("数据保存成功");
} else {
System.out.println("数据保存失败");
}

上述代码假设你已经有一个 FictionClick 对象列表 fictionClickList,然后使用 fictionClickService 对象的 saveOrUpdateBatch 方法将列表中的数据保存到数据库中,并在遇到重复数据时进行覆盖更新。

请注意,在使用 saveOrUpdateBatch 方法进行覆盖更新时,要确保 FictionClick 对象的主键 fictionId 在数据库中是唯一的,且存在对应的记录。如果数据库中不存在相应的记录,那么将会执行插入操作而不是更新操作。

确保在使用 saveOrUpdateBatch 方法之前已经正确配置了数据库连接和 MyBatis-Plus 的相关设置,包括正确的数据源、实体类与数据库表的映射关系等。

应该按照分类进行排序

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.fiction.mapper.FictionMapper">
<select id="selectTopFictionsByClick" resultType="com.example.fiction.entity.Fiction">
SELECT *
FROM fiction
WHERE bigclass = #{bigclass}
ORDER BY click DESC
</select>
</mapper>

最后优化

这个地方可以package com.example.fiction.Service.impl

可以改排行榜每次更新多少条数据 默认各写30条

出现一个bug(已解决)

没有考虑到书本如果有新的加入 就会超过30本,后期优化吧,思路应该将数据库的条数定死,覆盖写,应该每次清空数据库的条数

写了一个每次清空数据库 但是性能消耗好像更大了

权限控制

这里使用的是一个轻量级的框架 sa-token 主要的配置步骤看官方文档

时间获取当前

1
2
3
 前提条件是传入的是这个user
public String register(@RequestBody User user)
user.setCreatTime(LocalDateTime.now());
1
2
3
4
5
6
// 获取当前时间
Date currentDate = new Date();
// 定义日期时间格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化日期时间
String formattedDateTime = dateFormat.format(currentDate);

@RequestParam 和@RequestBody 的区别

@RequestParam@RequestBody 是 Spring MVC 中常用的注解,用于处理 HTTP 请求中的参数。它们的主要区别如下:

  1. 用法和位置:
    • @RequestParam 用于从请求的 URL 或请求参数中获取单个或多个参数值。
    • @RequestBody 用于从请求的消息体中获取请求的内容,通常用于接收 POST、PUT 等请求方法的请求体。
  2. 数据来源:
    • @RequestParam 获取参数值的来源可以是 URL 路径、查询字符串或表单数据等。
    • @RequestBody 获取请求体中的内容,通常是 JSON、XML 或其他自定义的请求格式。
  3. 参数绑定方式:
    • @RequestParam 默认使用查询参数绑定方式,将请求参数绑定到方法的参数上。
    • @RequestBody 使用消息转换器(Message Converter)将请求体的内容转换为方法参数的对象。
  4. 数据类型:
    • @RequestParam 可以绑定基本数据类型(如 String、int、boolean 等)以及复杂对象(如自定义类)。
    • @RequestBody 通常用于绑定复杂对象(如 JSON 对象)到方法参数的自定义类。

全局异常拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestControllerAdvice
public class GlobalException {

// 拦截:未登录异常
@ExceptionHandler(NotLoginException.class)
public SaResult handlerException(NotLoginException e) {

// 打印堆栈,以供调试
e.printStackTrace();

// 返回给前端
return SaResult.error(e.getMessage());
}
}