Springboot:Lombok

简介 Lombok 是一个 Java 库,它可以自动插入编辑器和构建工具中,简化 Java 代码的编写。 Lombok 提供了一系列注解,用于自动生成 getter、setter、构造函数、toString 方法等,从而减少了代码量,提高了代码的可读性和可维护性。 安装 1 2 3 4 5 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </dependency> 常用注解 注解名 作用 @Data 自动生成 getter、setter、toString、equals、hashCode 方法 @Getter 自动生成 getter 方法 @Setter 自动生成 setter 方法 @ToString 自动生成 toString 方法 @EqualsAndHashCode 自动生成 equals 和 hashCode 方法 @NoArgsConstructor 自动生成无参构造函数 @AllArgsConstructor 自动生成全参构造函数 全部注解 @Data @Data注解是一个非常强大的综合注解,它等价于同时使用@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor。使用@Data可以大大简化代码,减少样板代码的编写。 1 2 3 4 5 6 import lombok.Data; @Data public class Person { private String name; private int age; } @Getter和@Setter 1. 放置位置的灵活性 ...

2025-03-12 · 8 min · 1640 words

Springboot:输出嵌套数据

实体类 1 2 3 4 5 6 7 8 9 10 11 12 @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Entity @TableName("t_article") public class Article { private Long id; private String title; private String content; private Long parentId; } DTO类 1 2 3 4 5 6 7 @Data public class ArticleDTO { private Long id; private String title; private String content; private List<ArticleDTO> children;//这是重点 } Service类 1 2 3 public interface ArticleService { List<ArticleDTO> getArticleList(); } ServiceImpl类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 @Service public class ArticleServiceImpl implements ArticleService { @Autowired private ArticleMapper articleMapper; @Override public List<ArticleDTO> getArticleList() { // 查询所有文章 List<Article> articles = ArticleRepository.searchQuery(); Map<String, ArticleResDto> articleMap = new HashMap<>(); List<ArticleResDto> rootArticles = new ArrayList<>(); // 遍历所有文章,将其转换为ArticleResDto对象,并存储在articleMap中 // 这一步很重要,否则下一步for循环可能无法找到父节点导致数据丢失 for (Article article : articles) { ArticleResDto articleResDto = new ArticleResDto(); //将文章属性复制到文章DTO对象中对应属性中(两边属性字段必须相同,不相同的可以单独通过set方法赋值) BeanUtils.copyProperties(article, articleResDto); articleMap.put(article.getCode(), articleResDto); } // 遍历所有文章,将其转换为ArticleResDto对象,并存储在rootArticles中 for (Article article : articles) { // 从articleMap中获取对应的ArticleResDto对象 ArticleResDto articleResDto = articleMap.get(article.getCode()); // 如果该文章的parent为0,则将其作为根节点存储在rootArticles中 if (article.getParent().equals("0")) { rootArticles.add(articleResDto); } else { // 如果该文章的parent不为0,则将其作为子节点存储在对应的父节点的children中 ArticleResDto parentarticle = articleMap.get(article.getParent()); if (parentarticle != null) { // 如果父节点的children为null,则创建一个新的List对象 if (parentarticle.getChildren() == null) { parentarticle.setChildren(new ArrayList<>()); } parentarticle.getChildren().add(articleResDto); } } } return rootArticles; } // 返回顶级文章列表 /** * 输出结果: * [ * { * "id": 1, * "title": "文章1", * "content": "文章1的内容", * "children": [ * { * "id": 2, * "title": "文章2", * "content": "文章2的内容", * "children": [] * } * ] * } * ] */ return articleDTOs; } BeanUtils.copyProperties(article, articleDTO);将文章属性复制到文章DTO对象中对应属性中 ...

2025-03-11 · 2 min · 298 words

Spring Data JPA

第一步: maven中添加JPA依赖 1 2 3 4 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 第二步(可选): 安装IDEA插件 JPA Buddy,可以自动生成Entity实体类和Repository仓库接口 第三步: 创建数据表,比如: 1 2 3 4 5 6 7 8 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `created_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; 第四步: 创建数据表对应实体类 项目下边创建entity软件包(文件夹) 方法1(推荐):通过JPA Buddy插件创建,在entity上右键→新建→来自数据库的JPA实体,下边选择对应的数据表和字段,点击确认,就可以自动在entity下边创建对应的实体类了 ...

2025-03-10 · 12 min · 2400 words

Springboot:Redis

摘要 Redis 主要支持以下几种数据类型: string(字符串): 基本的数据存储单元,可以存储字符串、整数或者浮点数。 hash(哈希):一个键值对集合,可以存储多个字段。 list(列表):一个简单的列表,可以存储一系列的字符串元素。 set(集合):一个无序集合,可以存储不重复的字符串元素。 zset(sorted set:有序集合): 类似于集合,但是每个元素都有一个分数(score)与之关联。 位图(Bitmaps):基于字符串类型,可以对每个位进行操作。 超日志(HyperLogLogs):用于基数统计,可以估算集合中的唯一元素数量。 地理空间(Geospatial):用于存储地理位置信息。 发布/订阅(Pub/Sub):一种消息通信模式,允许客户端订阅消息通道,并接收发布到该通道的消息。 流(Streams):用于消息队列和日志存储,支持消息的持久化和时间排序。 模块(Modules):Redis 支持动态加载模块,可以扩展 Redis 的功能。 String(字符串) string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。 key value name “zhangsan” ege “15” 常用命令: SET key value:设置键的值,重复设置会覆盖原来的值。 GET key:获取键的值。 INCR key:将键的值加 1。 DECR key:将键的值减 1。 APPEND key value:将值追加到键的值之后。 Hash(哈希) hash 类型是一个键值对集合,是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。比如存储用户的 id、姓名、年龄、性别等信息。文章的 id、标题、内容、作者等信息等。每个哈希最多可以存储 2^32 - 1 个键值对。 key field value user1 name “zhangsan” ege “15” 常用命令: ...

2025-03-06 · 9 min · 1913 words

Springboot:过滤器

1、权限过滤器 项目中创建PermissionFilter类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package com.example.demo.config; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; // 权限过滤器 @WebFilter(urlPatterns = "/*") public class PermissionFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 将 ServletRequest 和 ServletResponse 转换为 HttpServletRequest 和 HttpServletResponse // 这样可以使用 HTTP 协议特有的方法 HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 模拟从请求中获取用户角色 // 这里假设用户角色已经在会话中,并用于后续的权限检查 String userRole = (String) httpRequest.getSession().getAttribute("userRole"); // 模拟需要 ADMIN 角色才能访问的路径 // 如果请求的路径以 "/admin/" 开头,检查用户角色是否为 ADMIN // 如果不是 ADMIN 角色,返回 403 错误,表示用户没有访问权限 if (httpRequest.getRequestURI().startsWith("/admin/")) { if (!"ADMIN".equals(userRole)) { httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "You don't have permission to access this resource."); return; } } // 如果用户有权限或者请求的资源不需要权限,继续执行链中的下一个过滤器或目标资源 chain.doFilter(request, response); } }

2025-03-05 · 1 min · 147 words

Springboot:拦截器

在请求被处理前,执行一些公共逻辑,例如检查用户是否认证、是否有权限访问受保护的资源、日志记录等; 可以在请求被处理前,对请求的数据进行预处理,还可以对返回的结果进行统一处理。 1、Cors跨域处理 在项目中创建config文件包,然后创建WebConfig类,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.example.demo.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 WebConfig implements WebMvcConfigurer { /** * 添加跨域资源共享(CORS)映射配置 * 该方法用于配置允许从哪些域对资源进行跨域请求 * * @param registry CorsRegistry对象,用于注册CORS映射 */ @Override public void addCorsMappings(CorsRegistry registry) { // 配置跨域请求的映射路径,"/**"表示匹配所有路径 registry.addMapping("/**") // 配置允许跨域请求的源,此处为本地开发环境地址 .allowedOrigins("http://localhost:5173") // 允许在请求中携带凭证(如Cookies) .allowCredentials(true) // 配置允许的请求头,"*"表示允许所有请求头 .allowedHeaders("*") // 配置允许的HTTP方法,此处允许GET、POST和DELETE请求 .allowedMethods("GET", "POST", "DELETE"); } } 2、登录校验 1、创建拦截器 定义一个类并实现HandlerInterceptor接口。 ...

2025-03-05 · 3 min · 543 words

Springboot:项目配置

1、配置Maven 安装Maven 因为IDE自带的不太好用,加载比较慢,需要先将maven安装到本地,然后配置到IDE中。 下载地址: https://maven.apache.org/download.cgi 下载Binary zip archive到本地,解压到本地就可以用了 本地目录比如:D:\Development\Java\apache-maven-3.9.8 修改Maven仓库国内镜像 打开 maven 的配置文件( windows 机器一般在 maven 安装目录的 conf/settings.xml ) https://developer.aliyun.com/mvn/guide 在conf/settings.xml的标签中添加 mirror 子节点: 1 2 3 4 5 6 <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> 找到localRepository说明内容,下边增加一行 1 <localRepository>D:\Development\Java\maven-repository</localRepository> 修改系统环境变量 PATH中添加maven的bin目录 例如:D:\Development\Java\apache-maven-3.9.8\bin 可以在命令中查看版本:mvn -v 修改IDEA配置 打开IDEA,文件→设置→构建执行部署→构建工具→Maven Maven主路径:修改为Maven的安装路径,比如:D:\Development\Java\apache-maven-3.9.8 用户设置文件:修改为主路径下的setting文件,比如:D:\Development\Java\apache-maven-3.9.8\conf\settings.xml 本地仓库:系统默认会根据setting读取对应的localRepository地址,如果没有读取则需要手动修改 2、配置热部署 安装spring-boot-devtools依赖工具 1 2 3 4 5 6 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> 打开IDEA: ...

2025-03-05 · 1 min · 69 words

Springboot:HelloWorld

1、创建Springboot项目 使用IDEA创建Springboot项目: 生成器:选择Spring Initializr 名称自定义,位置选择合适的位置,语言选择Java,类型选择Maven,组、工作、包按需填写 JDK选择17以上,建议21(需要先安装),Java选择JDK对应的版本,打包选择Jar 点击下一步 选择Spring Web,点击Next,填写项目名称和路径,点击Next,选择Java版本,点击Next,选择依赖,点击Next,选择项目结构,点击Next,点击Finish。 选择依赖: Spring Web:用于构建Web应用程序(必选) Spring Boot DevTools:用于开发时的自动重启(可选) Lombok:用于简化Java代码(可选) Spring Boot Starter Test:用于测试Spring Boot应用程序(可选) 点击创建 2、启动项目 等Maven安装完全部依赖后,就可以启动项目了(建议先查看项目配置方法,将Maven仓库切换到阿里云镜像) 打开项目中src/main/java/com/example/demo目录下的DemoApplication.java文件,点击class左侧的绿色箭头,就可以启动项目了,也可以使用快捷键Shift+F10启动项目,或者点击IDEA上方的绿色箭头启动项目。 打开浏览器:http://localhost:8080/ 看到如下结果,说明项目创建成功。 1 2 3 4 5 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Aug 08 12:08:16 CST 2024 There was an unexpected error (type=Not Found, status=404). 3、创建Controller 在项目目录下,创建controller目录,创建HelloController.java文件,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloWorldController { @GetMapping("/hello") public String hello() { return "Hello World!"; } } 打开浏览器:http://localhost:8080/hello 就可以看到:Hello World! ...

2025-03-05 · 1 min · 103 words