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

程序员崩溃瞬间:这4道链表题不会,面试直接凉凉?速补!!

程序员崩溃瞬间:这4道链表题不会,面试直接凉凉?速补!!

坚持用清晰易懂的图解+多语言代码,让每道题变得简单! 🌟 🚀呆头个人主页详情 🌱呆头个人Gitee代码仓库 📌 呆头详细专栏系列 座右铭:“不患无位,患所以立。” 👨‍💻 程序员崩溃瞬间:这4道链表题不会,面试直接凉凉?速补!! * 前言 * 目录 * 1.移除链表元素 * 方法思路 * 代码实现 * 代码解释 * 2.反转链表 * 方法思路 * 代码实现 * 代码解释 * 3.查找链表中间结点 * 方法思路 * 代码实现 * 代码解释 * 4.合并两个有序链表 * 方法思路 * 代码实现 * 代码解释 * 为什么不需要循环就能连接所有剩余节点? 前言 🚀 你好,欢迎来到《编程闯关记》! 这里是算法与数据结构的实战基地,也是你从“暴力解法”到“最优解”的进化场。 🔍 专栏初衷: * 用清晰的图解 + 多语言代码(Python/

By Ne0inhk
详解数据结构之跳表

详解数据结构之跳表

目录 跳表的定义 跳表的演化过程 跳表的优化思路 跳表如何保证效率 跳表的时间复杂度 跳表的空间复杂度 跳表的查找 跳表的插入 跳表的删除 跳表的模拟实现 跳表与平衡搜索树及哈希表的对比 跳表的定义 跳表是由William Pugh(音译为威廉·普)发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》,跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。 跳表的演化过程 对于单链表来说,即使数据是已经排好序的,想要查询其中的一个数据,只能从头开始遍历链表,这样效率很低,时间复杂度很高,是 O(n),如下图所示。 那我们有没有什么办法来提高查询的效率呢?我们可以为链表建立一个“索引”,这样查找起来就会更快,如下图所示,我们在原始链表的基础上,每两个结点提取一个结点建立索引,我们把抽取出来的结点叫作索引层或者索引,down

By Ne0inhk
【算法】【动态规划】斐波那契数模型

【算法】【动态规划】斐波那契数模型

目录 * 一、动态规划解题模版 * 二、第N个泰波那契数 * 三、⾯试题 08.01. 三步问题 * 四、746. 使⽤最⼩花费爬楼梯(easy) * 五、91.解码⽅法 一、动态规划解题模版 1. 状态表示:我们一般创建一个一维数组dp,把dp表填满,其中的某一个值就是结果。而状态表示就是指这个dp表中元素的含义; 1.1. 来源:题目要求,经验+题目要求 ,分析问题的过程中的重复子问题 2. 状态转移方程:dp[ i ] = ? 3. 初始化:保证根据状态转移方程填表时不越界 4. 填表顺序:为了填写当前状态的时候,所需要的状态已经计算过了 5. 返回值:题目要求 + 状态表示

By Ne0inhk
Transformer实战(9)——Transformer分词算法详解

Transformer实战(9)——Transformer分词算法详解

Transformer实战(9)——Transformer分词算法详解 * 0. 前言 * 1. 子词分词算法 * 2. 加载预训练分词器 * 3. 常见字词分词算法 * 3.1 字节对编码 * 3.2 WordPiece * 3.3 SentencePiece * 4. 使用 tokenizers 库训练分词器 * 4.1 训练 BPE * 4.2 训练 WordPiece * 4.3 空分词管道 * 小结 * 系列链接 0. 前言 在自然语言处理领域,高效准确的分词算法是构建强大语言模型的基础。随着 Transformer 架构的广泛应用,子词分词算法已成为处理多语言文本和稀有词汇的关键技术。本文将从理论到实践,全面解析现代自然语言处理 (Natural Language Processing,

By Ne0inhk