Spring Boot 数据访问与数据库集成

Spring Boot 数据访问与数据库集成

Spring Boot 数据访问与数据库集成

在这里插入图片描述
18.1 学习目标与重点提示

学习目标:掌握Spring Boot数据访问与数据库集成的核心概念与使用方法,包括Spring Boot数据访问的基本方法、Spring Boot与MySQL的集成、Spring Boot与H2的集成、Spring Boot与MyBatis的集成、Spring Boot与JPA的集成、Spring Boot的事务管理、Spring Boot的实际应用场景,学会在实际开发中处理数据库访问问题。
重点:Spring Boot数据访问的基本方法Spring Boot与MySQL的集成Spring Boot与H2的集成Spring Boot与MyBatis的集成Spring Boot与JPA的集成Spring Boot的事务管理Spring Boot的实际应用场景

18.2 Spring Boot数据访问概述

Spring Boot数据访问是指使用Spring Boot进行数据库操作的方法。

18.2.1 数据访问的定义

定义:数据访问是指使用Spring Boot进行数据库操作的方法。
作用

  • 实现数据库的增删改查。
  • 实现事务管理。
  • 实现数据的持久化。

✅ 结论:数据访问是指使用Spring Boot进行数据库操作的方法,作用是实现数据库的增删改查、事务管理、数据的持久化。

18.2.2 数据访问的常用组件

定义:数据访问的常用组件是指Spring Boot提供的数据访问组件。
组件

  • JdbcTemplate:用于JDBC操作。
  • JPA:用于JPA操作。
  • MyBatis:用于MyBatis操作。
  • Hibernate:用于Hibernate操作。

✅ 结论:数据访问的常用组件包括JdbcTemplate、JPA、MyBatis、Hibernate。

18.3 Spring Boot与MySQL的集成

Spring Boot与MySQL的集成是最常用的数据访问方法之一。

18.3.1 集成MySQL的步骤

定义:集成MySQL的步骤是指使用Spring Boot与MySQL集成的方法。
步骤

  1. 在pom.xml文件中添加MySQL依赖。
  2. 在application.properties或application.yml文件中配置MySQL连接信息。
  3. 创建实体类。
  4. 创建Repository接口。
  5. 创建控制器类。
  6. 测试应用。

示例
pom.xml文件中的MySQL依赖:

<dependencies><!-- Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Data JPA依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

application.properties文件中的MySQL连接信息:

# 服务器端口 server.port=8080 # 数据库连接信息 spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=123456 # JPA配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true 

实体类:

importjavax.persistence.*;@Entity@Table(name ="product")publicclassProduct{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString productId;privateString productName;privatedouble price;privateint sales;publicProduct(){}publicProduct(String productId,String productName,double price,int sales){this.productId = productId;this.productName = productName;this.price = price;this.sales = sales;}// Getter和Setter方法publicLonggetId(){return id;}publicvoidsetId(Long id){this.id = id;}publicStringgetProductId(){return productId;}publicvoidsetProductId(String productId){this.productId = productId;}publicStringgetProductName(){return productName;}publicvoidsetProductName(String productName){this.productName = productName;}publicdoublegetPrice(){return price;}publicvoidsetPrice(double price){this.price = price;}publicintgetSales(){return sales;}publicvoidsetSales(int sales){this.sales = sales;}@OverridepublicStringtoString(){return"Product{"+"id="+ id +",+ productId +'\''+",+ productName +'\''+", price="+ price +", sales="+ sales +'}';}}

Repository接口:

importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.stereotype.Repository;importjava.util.List;@RepositorypublicinterfaceProductRepositoryextendsJpaRepository<Product,Long>{List<Product>findBySalesGreaterThan(int sales);}

控制器类:

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;@RestController@RequestMapping("/api/products")publicclassProductController{@AutowiredprivateProductRepository productRepository;@GetMapping("/")publicList<Product>getAllProducts(){return productRepository.findAll();}@PostMapping("/")publicProductaddProduct(@RequestBodyProduct product){return productRepository.save(product);}@GetMapping("/top-selling")publicList<Product>getTopSellingProducts(@RequestParamint topN){List<Product> products = productRepository.findBySalesGreaterThan(0); products.sort((p1, p2)-> p2.getSales()- p1.getSales());if(products.size()> topN){return products.subList(0, topN);}return products;}}

测试类:

importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importjava.util.List;importstaticorg.junit.jupiter.api.Assertions.assertEquals;@SpringBootTestclassProductApplicationTests{@AutowiredprivateProductController productController;@TestvoidcontextLoads(){}@TestvoidtestGetAllProducts(){List<Product> products = productController.getAllProducts();assertEquals(5, products.size());}@TestvoidtestAddProduct(){Product product =newProduct("P006","平板",2000.0,70);Product addedProduct = productController.addProduct(product);assertEquals("P006", addedProduct.getProductId());}@TestvoidtestGetTopSellingProducts(){List<Product> topSellingProducts = productController.getTopSellingProducts(3);assertEquals(3, topSellingProducts.size());assertEquals("P004", topSellingProducts.get(0).getProductId());assertEquals("P005", topSellingProducts.get(1).getProductId());assertEquals("P001", topSellingProducts.get(2).getProductId());}}

✅ 结论:集成MySQL的步骤包括添加MySQL依赖、配置MySQL连接信息、创建实体类、创建Repository接口、创建控制器类、测试应用。

18.4 Spring Boot与H2的集成

Spring Boot与H2的集成是用于开发和测试的常用方法之一。

18.4.1 集成H2的步骤

定义:集成H2的步骤是指使用Spring Boot与H2集成的方法。
步骤

  1. 在pom.xml文件中添加H2依赖。
  2. 在application.properties或application.yml文件中配置H2连接信息。
  3. 创建实体类。
  4. 创建Repository接口。
  5. 创建控制器类。
  6. 测试应用。

示例
pom.xml文件中的H2依赖:

<dependencies><!-- Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Data JPA依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- H2数据库依赖 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

application.properties文件中的H2连接信息:

# 服务器端口 server.port=8080 # 数据库连接信息 spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password # JPA配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true # H2数据库控制台 spring.h2.console.enabled=true spring.h2.console.path=/h2-console 

实体类、Repository接口、控制器类、测试类与集成MySQL的示例相同。

✅ 结论:集成H2的步骤包括添加H2依赖、配置H2连接信息、创建实体类、创建Repository接口、创建控制器类、测试应用。

18.5 Spring Boot与MyBatis的集成

Spring Boot与MyBatis的集成是常用的数据访问方法之一。

18.5.1 集成MyBatis的步骤

定义:集成MyBatis的步骤是指使用Spring Boot与MyBatis集成的方法。
步骤

  1. 在pom.xml文件中添加MyBatis依赖。
  2. 在application.properties或application.yml文件中配置MyBatis连接信息。
  3. 创建实体类。
  4. 创建Mapper接口。
  5. 创建Mapper XML文件。
  6. 创建控制器类。
  7. 测试应用。

示例
pom.xml文件中的MyBatis依赖:

<dependencies><!-- Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency><!-- MySQL依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

application.properties文件中的MyBatis连接信息:

# 服务器端口 server.port=8080 # 数据库连接信息 spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=123456 # MyBatis配置 mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.example.demo.entity 

实体类:

publicclassProduct{privateLong id;privateString productId;privateString productName;privatedouble price;privateint sales;publicProduct(){}publicProduct(String productId,String productName,double price,int sales){this.productId = productId;this.productName = productName;this.price = price;this.sales = sales;}// Getter和Setter方法publicLonggetId(){return id;}publicvoidsetId(Long id){this.id = id;}publicStringgetProductId(){return productId;}publicvoidsetProductId(String productId){this.productId = productId;}publicStringgetProductName(){return productName;}publicvoidsetProductName(String productName){this.productName = productName;}publicdoublegetPrice(){return price;}publicvoidsetPrice(double price){this.price = price;}publicintgetSales(){return sales;}publicvoidsetSales(int sales){this.sales = sales;}@OverridepublicStringtoString(){return"Product{"+"id="+ id +",+ productId +'\''+",+ productName +'\''+", price="+ price +", sales="+ sales +'}';}}

Mapper接口:

importorg.apache.ibatis.annotations.Mapper;importjava.util.List;@MapperpublicinterfaceProductMapper{List<Product>findAll();intinsert(Product product);List<Product>findBySalesGreaterThan(int sales);}

Mapper XML文件(src/main/resources/mapper/ProductMapper.xml):

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.example.demo.mapper.ProductMapper"><resultMapid="ProductResultMap"type="com.example.demo.entity.Product"><idproperty="id"column="id"/><resultproperty="productId"column="product_id"/><resultproperty="productName"column="product_name"/><resultproperty="price"column="price"/><resultproperty="sales"column="sales"/></resultMap><selectid="findAll"resultMap="ProductResultMap"> SELECT * FROM product </select><insertid="insert"parameterType="com.example.demo.entity.Product"> INSERT INTO product (product_id, product_name, price, sales) VALUES (#{productId}, #{productName}, #{price}, #{sales}) </insert><selectid="findBySalesGreaterThan"parameterType="int"resultMap="ProductResultMap"> SELECT * FROM product WHERE sales > #{sales} </select></mapper>

控制器类:

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;@RestController@RequestMapping("/api/products")publicclassProductController{@AutowiredprivateProductMapper productMapper;@GetMapping("/")publicList<Product>getAllProducts(){return productMapper.findAll();}@PostMapping("/")publicintaddProduct(@RequestBodyProduct product){return productMapper.insert(product);}@GetMapping("/top-selling")publicList<Product>getTopSellingProducts(@RequestParamint topN){List<Product> products = productMapper.findBySalesGreaterThan(0); products.sort((p1, p2)-> p2.getSales()- p1.getSales());if(products.size()> topN){return products.subList(0, topN);}return products;}}

测试类:

importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importjava.util.List;importstaticorg.junit.jupiter.api.Assertions.assertEquals;@SpringBootTestclassProductApplicationTests{@AutowiredprivateProductController productController;@TestvoidcontextLoads(){}@TestvoidtestGetAllProducts(){List<Product> products = productController.getAllProducts();assertEquals(5, products.size());}@TestvoidtestAddProduct(){Product product =newProduct("P006","平板",2000.0,70);int count = productController.addProduct(product);assertEquals(1, count);}@TestvoidtestGetTopSellingProducts(){List<Product> topSellingProducts = productController.getTopSellingProducts(3);assertEquals(3, topSellingProducts.size());assertEquals("P004", topSellingProducts.get(0).getProductId());assertEquals("P005", topSellingProducts.get(1).getProductId());assertEquals("P001", topSellingProducts.get(2).getProductId());}}

✅ 结论:集成MyBatis的步骤包括添加MyBatis依赖、配置MyBatis连接信息、创建实体类、创建Mapper接口、创建Mapper XML文件、创建控制器类、测试应用。

18.6 Spring Boot与JPA的集成

Spring Boot与JPA的集成是常用的数据访问方法之一。

18.6.1 集成JPA的步骤

定义:集成JPA的步骤是指使用Spring Boot与JPA集成的方法。
步骤

  1. 在pom.xml文件中添加JPA依赖。
  2. 在application.properties或application.yml文件中配置JPA连接信息。
  3. 创建实体类。
  4. 创建Repository接口。
  5. 创建控制器类。
  6. 测试应用。

示例
pom.xml文件中的JPA依赖:

<dependencies><!-- Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Data JPA依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

application.properties文件中的JPA连接信息:

# 服务器端口 server.port=8080 # 数据库连接信息 spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=123456 # JPA配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true 

实体类、Repository接口、控制器类、测试类与集成MySQL的示例相同。

✅ 结论:集成JPA的步骤包括添加JPA依赖、配置JPA连接信息、创建实体类、创建Repository接口、创建控制器类、测试应用。

18.7 Spring Boot的事务管理

Spring Boot的事务管理是数据访问的重要组件。

18.7.1 事务管理的定义

定义:事务管理是指使用Spring Boot进行事务处理的方法。
作用

  • 保证数据的一致性。
  • 保证数据的完整性。
  • 保证数据的原子性。

常用注解

  • @Transactional:标记方法或类为事务方法。

示例

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importjava.util.List;@ServicepublicclassProductService{@AutowiredprivateProductRepository productRepository;@TransactionalpublicvoidaddProduct(Product product){ productRepository.save(product);}@TransactionalpublicvoidupdateProduct(Product product){ productRepository.save(product);}@TransactionalpublicvoiddeleteProduct(Long id){ productRepository.deleteById(id);}@Transactional(readOnly =true)publicList<Product>getAllProducts(){return productRepository.findAll();}@Transactional(readOnly =true)publicList<Product>getTopSellingProducts(int topN){List<Product> products = productRepository.findBySalesGreaterThan(0); products.sort((p1, p2)-> p2.getSales()- p1.getSales());if(products.size()> topN){return products.subList(0, topN);}return products;}}

✅ 结论:事务管理是指使用Spring Boot进行事务处理的方法,常用注解包括@Transactional。

18.8 Spring Boot的实际应用场景

在实际开发中,Spring Boot数据访问与数据库集成的应用场景非常广泛,如:

  • 实现商品的展示与购买。
  • 实现订单的管理。
  • 实现用户的管理。
  • 实现博客的发布与管理。

示例

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.stereotype.Repository;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importorg.springframework.web.bind.annotation.*;importjavax.persistence.*;importjava.util.List;// 产品类@Entity@Table(name ="product")publicclassProduct{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString productId;privateString productName;privatedouble price;privateint sales;publicProduct(){}publicProduct(String productId,String productName,double price,int sales){this.productId = productId;this.productName = productName;this.price = price;this.sales = sales;}// Getter和Setter方法publicLonggetId(){return id;}publicvoidsetId(Long id){this.id = id;}publicStringgetProductId(){return productId;}publicvoidsetProductId(String productId){this.productId = productId;}publicStringgetProductName(){return productName;}publicvoidsetProductName(String productName){this.productName = productName;}publicdoublegetPrice(){return price;}publicvoidsetPrice(double price){this.price = price;}publicintgetSales(){return sales;}publicvoidsetSales(int sales){this.sales = sales;}@OverridepublicStringtoString(){return"Product{"+"id="+ id +",+ productId +'\''+",+ productName +'\''+", price="+ price +", sales="+ sales +'}';}}// 产品Repository@RepositorypublicinterfaceProductRepositoryextendsJpaRepository<Product,Long>{List<Product>findBySalesGreaterThan(int sales);}// 产品Service@ServicepublicclassProductService{@AutowiredprivateProductRepository productRepository;@TransactionalpublicvoidaddProduct(Product product){ productRepository.save(product);}@TransactionalpublicvoidupdateProduct(Product product){ productRepository.save(product);}@TransactionalpublicvoiddeleteProduct(Long id){ productRepository.deleteById(id);}@Transactional(readOnly =true)publicList<Product>getAllProducts(){return productRepository.findAll();}@Transactional(readOnly =true)publicList<Product>getTopSellingProducts(int topN){List<Product> products = productRepository.findBySalesGreaterThan(0); products.sort((p1, p2)-> p2.getSales()- p1.getSales());if(products.size()> topN){return products.subList(0, topN);}return products;}}// 产品控制器@RestController@RequestMapping("/api/products")publicclassProductController{@AutowiredprivateProductService productService;@GetMapping("/")publicList<Product>getAllProducts(){return productService.getAllProducts();}@PostMapping("/")publicvoidaddProduct(@RequestBodyProduct product){ productService.addProduct(product);}@PutMapping("/{id}")publicvoidupdateProduct(@PathVariableLong id,@RequestBodyProduct product){ product.setId(id); productService.updateProduct(product);}@DeleteMapping("/{id}")publicvoiddeleteProduct(@PathVariableLong id){ productService.deleteProduct(id);}@GetMapping("/top-selling")publicList<Product>getTopSellingProducts(@RequestParamint topN){return productService.getTopSellingProducts(topN);}}// 应用启动类@SpringBootApplicationpublicclassProductApplication{publicstaticvoidmain(String[] args){SpringApplication.run(ProductApplication.class, args);}@AutowiredprivateProductService productService;publicvoidrun(String... args){// 初始化数据 productService.addProduct(newProduct("P001","手机",1000.0,100)); productService.addProduct(newProduct("P002","电脑",5000.0,50)); productService.addProduct(newProduct("P003","电视",3000.0,80)); productService.addProduct(newProduct("P004","手表",500.0,200)); productService.addProduct(newProduct("P005","耳机",300.0,150));}}// 测试类@SpringBootTestclassProductApplicationTests{@AutowiredprivateProductController productController;@TestvoidcontextLoads(){}@TestvoidtestGetAllProducts(){List<Product> products = productController.getAllProducts();assertEquals(5, products.size());}@TestvoidtestAddProduct(){Product product =newProduct("P006","平板",2000.0,70); productController.addProduct(product);List<Product> products = productController.getAllProducts();assertEquals(6, products.size());}@TestvoidtestUpdateProduct(){Product product =newProduct("P001","手机",1500.0,120); productController.updateProduct(1L, product);List<Product> products = productController.getAllProducts();assertEquals(1500.0, products.get(0).getPrice());}@TestvoidtestDeleteProduct(){ productController.deleteProduct(2L);List<Product> products = productController.getAllProducts();assertEquals(4, products.size());}@TestvoidtestGetTopSellingProducts(){List<Product> topSellingProducts = productController.getTopSellingProducts(3);assertEquals(3, topSellingProducts.size());assertEquals("P004", topSellingProducts.get(0).getProductId());assertEquals("P005", topSellingProducts.get(1).getProductId());assertEquals("P001", topSellingProducts.get(2).getProductId());}}

输出结果

访问http://localhost:8080/api/products/top-selling?topN=3:

[{"id":4,"productId":"P004","productName":"手表","price":500.0,"sales":200},{"id":5,"productId":"P005","productName":"耳机","price":300.0,"sales":150},{"id":1,"productId":"P001","productName":"手机","price":1500.0,"sales":120}]

访问http://localhost:8080/api/products/:

[{"id":1,"productId":"P001","productName":"手机","price":1500.0,"sales":120},{"id":3,"productId":"P003","productName":"电视","price":3000.0,"sales":80},{"id":4,"productId":"P004","productName":"手表","price":500.0,"sales":200},{"id":5,"productId":"P005","productName":"耳机","price":300.0,"sales":150},{"id":6,"productId":"P006","productName":"平板","price":2000.0,"sales":70}]

✅ 结论:在实际开发中,Spring Boot数据访问与数据库集成的应用场景非常广泛,需要根据实际问题选择合适的数据访问方法。

总结

本章我们学习了Spring Boot数据访问与数据库集成,包括Spring Boot数据访问的基本方法、Spring Boot与MySQL的集成、Spring Boot与H2的集成、Spring Boot与MyBatis的集成、Spring Boot与JPA的集成、Spring Boot的事务管理、Spring Boot的实际应用场景,学会了在实际开发中处理数据库访问问题。其中,Spring Boot数据访问的基本方法、Spring Boot与MySQL的集成、Spring Boot与H2的集成、Spring Boot与MyBatis的集成、Spring Boot与JPA的集成、Spring Boot的事务管理、Spring Boot的实际应用场景是本章的重点内容。从下一章开始,我们将学习Spring Boot的其他组件、微服务等内容。

Read more

Spring Boot/Spring MVC核心注解深度解析

Spring Boot/Spring MVC核心注解深度解析

—知识点专栏— 本文将对Spring Boot和Spring MVC框架中最核心、最高频使用的15个注解进行深度剖析。我们将从请求路由映射(@RequestMapping系列)入手,详细讲解数据绑定、参数传递(@RequestBody, @RequestParam等)的机制,进而探讨RESTful架构中的控制器(@RestController)和组件管理(@Service, @Autowired)的精髓。通过丰富的代码示例和图表,帮助开发者全面掌握这些注解,并迅速提升Spring应用的开发效率和代码质量。 📌 目录 * 一、Spring/Spring MVC注解的核心作用 * 二、请求映射与RESTful API注解系列 * 2.1. @RequestMapping: 路由映射的基石 * 2.2. @GetMapping, @PostMapping, @PutMapping, @DeleteMapping: HTTP方法快捷注解 * 2.3. @RestController 与 @Controller 的区别 * 三、请求参数绑定与数据处理注解

By Ne0inhk
掌控消息全链路(3)——RabbitMQ/Spring-AMQP高级特性详解之TTL、死信和延迟

掌控消息全链路(3)——RabbitMQ/Spring-AMQP高级特性详解之TTL、死信和延迟

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE 》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶 》《计算机网络 》《Java工程师核心能力体系构建》天行健,君子以自强不息。 Java JDK版本:Oracle OpenJDK 17.0.9 SpringBoot版本:3.5.9 * Spring Web * Lombok * Spring for RabbitMQ RabbitMQ version:3.12.1 RabbitMQ实现延迟队列的插件:rabbitmq_delayed_message_exchange-3.12.0(已免费上传至我的资源) 1.TTL TTL(Time-To-Live)是RabbitMQ中控制消息或队列生命周期的机制,用于在指定时间后自动删除消息或队列,避免资源堆积消息TTL:为单条消息设置过期时间队列TTL:

By Ne0inhk
山东大学《Web数据管理》期末复习宝典【万字解析!】

山东大学《Web数据管理》期末复习宝典【万字解析!】

🌈 个人主页:十二月的猫-ZEEKLOG博客 🔥 系列专栏:🏀山东大学期末速通专用_十二月的猫的博客-ZEEKLOG博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光  目录 1. 第二章 网络爬虫 1.1 爬虫基础知识 1.2 爬虫分类 1.3 开源工具 Nutch 2. 第三章 网页分析 2.1 正则表达式 2.2 DOM模型 2.3 Beautiful Soup工具 2.4 Scrapy框架 2.5 不同爬虫工具比较 2.6 元搜索引擎 3. 第四章 爬虫与网站的博弈 3.1 Robot协议 3.

By Ne0inhk
2G 内存云服务器部署 Spring Boot + MySQL 实战:从踩坑到上线

2G 内存云服务器部署 Spring Boot + MySQL 实战:从踩坑到上线

2G 内存云服务器部署 Spring Boot + MySQL 实战:从踩坑到上线 前言 最近把自己的全栈博客项目部署到了腾讯云的入门级服务器(2核2G),过程中踩了不少坑。本文记录完整的部署过程和问题排查思路,希望对同样在小规格服务器上部署 Java 项目的同学有所帮助。 项目技术栈: * 后端:Java 17 + Spring Boot 3.2.3 + Spring Security + JPA * 数据库:MySQL 8.0 * 前端:Flutter Web * 反向代理:Nginx 1.26 * 容器:Docker 28.4 服务器配置: * 腾讯云轻量应用服务器 * 2 核 CPU / 2GB 内存 / 50GB

By Ne0inhk