Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)

news2024/10/3 19:13:57

Spring Boot + MyBatis 项目中常用注解详解

在现代Java开发中,Spring BootMyBatis是两大热门框架,广泛应用于构建高效、可维护的企业级应用。两者结合使用,可以充分发挥各自的优势,提高开发效率和代码质量。在这个过程中,注解(Annotations)起到了关键作用。本文将详细、全面地讲解在Spring Boot + MyBatis项目中常用的注解及其含义和作用,并通过分类整理,帮助开发者更好地理解和运用这些工具。

目录

  • Spring Boot + MyBatis 项目中常用注解详解
    • Spring Boot 常用注解
      • 核心注解
        • @SpringBootApplication
      • 组件标识注解
        • @RestController
        • @Controller
        • @Service
        • @Repository
        • @Component
      • 依赖注入注解
        • @Autowired
        • @Qualifier
        • @Inject
      • 配置注解
        • @Configuration
        • @Bean
        • @Value
        • @ConfigurationProperties
      • 事务管理注解
        • @Transactional
      • Web层注解
        • 请求映射注解
          • @RequestMapping
          • @GetMapping
          • @PostMapping
          • @PutMapping
          • @DeleteMapping
        • 参数绑定注解
          • @PathVariable
          • @RequestParam
          • @RequestBody
          • @ResponseBody
    • MyBatis 常用注解
      • Mapper接口注解
        • @Mapper
      • SQL操作注解
        • @Select
        • @Insert
        • @Update
        • @Delete
      • 参数绑定注解
        • @Param
      • 结果映射注解
        • @Results 和 @Result
      • 关联映射注解
        • @One 和 @Many
    • 综合示例
      • 项目结构
      • 1. 主类
      • 2. 实体类
      • 3. Mapper 接口
      • 4. 服务类
      • 5. 控制器类
      • 6. 配置文件
    • 总结
    • 附录:常用注解对照表


Spring Boot 常用注解

Spring Boot 提供了丰富的注解来简化开发过程。以下将这些注解按照功能进行分类,便于理解和应用。

核心注解

@SpringBootApplication

含义与作用@SpringBootApplication 是一个复合注解,包含了 @Configuration@EnableAutoConfiguration@ComponentScan。用于标注主类,启用Spring Boot的自动配置和组件扫描功能。

示例

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

组件标识注解

这些注解用于标识不同层次的组件,便于Spring进行自动扫描和管理。

@RestController

含义与作用@RestController@Controller@ResponseBody 的组合注解,用于标识控制器类,适用于构建RESTful Web服务。所有方法返回的对象会自动序列化为JSON或XML。

示例

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/users")
    public List<User> getAllUsers() {
        // 返回用户列表
    }
}
@Controller

含义与作用@Controller 用于标识控制器类,通常与视图解析器(如Thymeleaf)配合使用,适用于传统的MVC模式。

示例

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("message", "Hello World");
        return "home";
    }
}
@Service

含义与作用@Service 用于标识业务逻辑层的组件,增强代码的可读性和可维护性。它也是一个 @Component,因此会被Spring扫描和管理。

示例

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}
@Repository

含义与作用@Repository 用于标识数据访问层的组件,通常与持久化技术(如JPA、MyBatis)结合使用。它还提供了异常转换功能,将持久层异常转换为Spring的统一异常。

示例

@Repository
public class UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> findAll() {
        // 查询数据库
    }
}
@Component

含义与作用@Component 是一个通用的Spring管理的组件注解,用于标识任何Spring管理的Bean。其他注解(如 @Service@Repository@Controller)都是 @Component 的特化。

示例

@Component
public class Utility {

    public void performTask() {
        // 执行任务
    }
}

依赖注入注解

这些注解用于实现Spring的依赖注入机制,简化Bean的管理和使用。

@Autowired

含义与作用@Autowired 用于自动装配Bean,可以应用于构造函数、字段或Setter方法。Spring会根据类型自动注入匹配的Bean。

示例

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    // 或者通过构造函数注入
    // private final OrderRepository orderRepository;
    //
    // @Autowired
    // public OrderService(OrderRepository orderRepository) {
    //     this.orderRepository = orderRepository;
    // }
}
@Qualifier

含义与作用@Qualifier@Autowired 一起使用,用于在多个Bean候选者中指定要注入的具体Bean。

示例

@Service
public class PaymentService {

    @Autowired
    @Qualifier("creditCardPayment")
    private PaymentProcessor paymentProcessor;
}
@Inject

含义与作用@Inject 是JSR-330规范的注解,与 @Autowired 类似,用于实现依赖注入。功能上与 @Autowired 基本相同,但不支持 required 属性。

示例

@Service
public class NotificationService {

    @Inject
    private EmailService emailService;
}

配置注解

用于定义和管理应用的配置和Bean。

@Configuration

含义与作用@Configuration 用于标识配置类,类似于传统的XML配置文件。可以在配置类中定义Bean,并进行依赖注入的配置。

示例

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
@Bean

含义与作用@Bean 用于在 @Configuration 类中定义Bean,Spring会管理这些Bean的生命周期和依赖。

示例

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        // 配置数据源
    }
}
@Value

含义与作用@Value 用于注入配置文件中的属性值,可以注入到字段、方法参数或构造函数参数中。

示例

@Component
public class AppProperties {

    @Value("${app.name}")
    private String appName;

    @Value("${app.version}")
    private String appVersion;
}
@ConfigurationProperties

含义与作用@ConfigurationProperties 用于将配置文件中的属性映射到一个Java对象中,适用于大量相关属性的绑定。

示例

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private String name;
    private String version;

    // getters and setters
}

事务管理注解

用于声明事务管理,确保数据一致性和完整性。

@Transactional

含义与作用@Transactional 用于声明事务管理,适用于需要事务控制的方法或类。可以指定事务的传播行为、隔离级别、回滚规则等。

示例

@Service
public class PaymentService {

    @Transactional
    public void processPayment(Order order) {
        // 执行支付逻辑
    }
}

Web层注解

用于处理Web请求和响应,简化控制器的开发。

请求映射注解

这些注解用于定义HTTP请求的路径和方法,简化路由配置。

@RequestMapping

含义与作用@RequestMapping 用于定义请求的URL路径和HTTP方法,适用于类级别和方法级别。它是一个通用的映射注解,可以通过 method 属性指定具体的HTTP方法。

示例

@RestController
@RequestMapping("/api")
public class UserController {

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public List<User> getAllUsers() {
        // 返回用户列表
    }
}
@GetMapping

含义与作用@GetMapping@RequestMapping 的快捷方式,用于处理HTTP GET请求。适用于方法级别,简化代码。

示例

@GetMapping("/users")
public List<User> getAllUsers() {
    // 返回用户列表
}
@PostMapping

含义与作用@PostMapping@RequestMapping 的快捷方式,用于处理HTTP POST请求。适用于方法级别,简化代码。

示例

@PostMapping("/users")
public ResponseEntity<Void> createUser(@RequestBody User user) {
    // 创建用户
}
@PutMapping

含义与作用@PutMapping@RequestMapping 的快捷方式,用于处理HTTP PUT请求。适用于方法级别,简化代码。

示例

@PutMapping("/users/{id}")
public ResponseEntity<Void> updateUser(@PathVariable Long id, @RequestBody User user) {
    // 更新用户
}
@DeleteMapping

含义与作用@DeleteMapping@RequestMapping 的快捷方式,用于处理HTTP DELETE请求。适用于方法级别,简化代码。

示例

@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
    // 删除用户
}
参数绑定注解

这些注解用于将HTTP请求中的参数绑定到控制器方法的参数上。

@PathVariable

含义与作用@PathVariable 用于绑定URL路径中的变量到方法参数,常用于RESTful API中的资源标识。

示例

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    // 根据ID获取用户
}
@RequestParam

含义与作用@RequestParam 用于绑定HTTP请求中的参数到方法参数,适用于查询参数或表单参数。

示例

@GetMapping("/search")
public List<User> searchUsers(@RequestParam String name, @RequestParam int age) {
    // 根据姓名和年龄搜索用户
}
@RequestBody

含义与作用@RequestBody 用于将HTTP请求体中的JSON或XML数据绑定到方法参数,常用于处理POST和PUT请求中的数据。

示例

@PostMapping("/users")
public ResponseEntity<Void> createUser(@RequestBody User user) {
    // 创建用户
}
@ResponseBody

含义与作用@ResponseBody 用于将方法返回的对象序列化为JSON或XML并写入HTTP响应体,通常与 @Controller 一起使用。@RestController 已经包含了 @ResponseBody 的功能。

示例

@Controller
public class UserController {

    @GetMapping("/users")
    @ResponseBody
    public List<User> getAllUsers() {
        // 返回用户列表
    }
}

MyBatis 常用注解

MyBatis 是一个优秀的持久层框架,通过映射语句将数据库操作与Java方法关联。MyBatis提供了一系列注解,简化了XML映射文件的使用。

Mapper接口注解

@Mapper

含义与作用@Mapper 用于标识MyBatis的Mapper接口,Spring会自动扫描并生成代理对象。通常与 @MapperScan 配合使用。

示例

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(@Param("id") Long id);
}

SQL操作注解

这些注解用于定义具体的SQL语句,关联到Mapper接口的方法上,实现数据库的CRUD操作。

@Select

含义与作用@Select 用于标注查询语句,关联到接口的方法上,实现数据库的查询操作。

示例

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> getAllUsers();
}
@Insert

含义与作用@Insert 用于标注插入语句,关联到接口的方法上,实现数据库的插入操作。

示例

@Mapper
public interface UserMapper {

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);
}
@Update

含义与作用@Update 用于标注更新语句,关联到接口的方法上,实现数据库的更新操作。

示例

@Mapper
public interface UserMapper {

    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);
}
@Delete

含义与作用@Delete 用于标注删除语句,关联到接口的方法上,实现数据库的删除操作。

示例

@Mapper
public interface UserMapper {

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(@Param("id") Long id);
}

参数绑定注解

@Param

含义与作用@Param 用于给方法参数命名,以便在SQL语句中引用。特别适用于有多个参数的方法。

示例

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
    List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") int age);
}

结果映射注解

这些注解用于定义查询结果与Java对象属性的映射关系,适用于字段名与属性名不一致的情况。

@Results 和 @Result

含义与作用@Results@Result 用于定义查询结果与Java对象属性的映射关系,适用于字段名与属性名不一致的情况。

示例

@Mapper
public interface UserMapper {

    @Select("SELECT id, user_name, email_address FROM users WHERE id = #{id}")
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "name", column = "user_name"),
        @Result(property = "email", column = "email_address")
    })
    User getUserById(@Param("id") Long id);
}

关联映射注解

用于定义对象之间的一对一或一对多关系,适用于复杂的对象关系映射。

@One 和 @Many

含义与作用@One@Many 用于定义一对一和一对多的关联关系,适用于复杂的对象关系映射。

示例

@Mapper
public interface OrderMapper {

    @Select("SELECT * FROM orders WHERE id = #{id}")
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "user", column = "user_id", 
                one = @One(select = "com.example.mapper.UserMapper.getUserById"))
    })
    Order getOrderById(@Param("id") Long id);
}

综合示例

为了更好地理解上述注解的应用,下面通过一个简单的用户管理系统示例,展示Spring Boot与MyBatis如何协同工作。

项目结构

src
├── main
│   ├── java
│   │   └── com.example.demo
│   │       ├── DemoApplication.java
│   │       ├── controller
│   │       │   └── UserController.java
│   │       ├── service
│   │       │   └── UserService.java
│   │       ├── mapper
│   │       │   └── UserMapper.java
│   │       └── model
│   │           └── User.java
│   └── resources
│       └── application.properties

1. 主类

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

说明@MapperScan 指定MyBatis的Mapper接口扫描路径,确保@Mapper接口能够被正确识别和代理。

2. 实体类

public class User {
    private Long id;
    private String name;
    private String email;

    // getters and setters
}

3. Mapper 接口

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> getAllUsers();

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(@Param("id") Long id);

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);

    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(@Param("id") Long id);
}

4. 服务类

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }

    public User getUserById(Long id) {
        return userMapper.getUserById(id);
    }

    public void createUser(User user) {
        userMapper.insertUser(user);
    }

    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    public void deleteUser(Long id) {
        userMapper.deleteUser(id);
    }
}

5. 控制器类

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    // 获取所有用户
    @GetMapping
    public List<User> listUsers() {
        return userService.getAllUsers();
    }

    // 根据ID获取用户
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.getUserById(id);
        if(user != null){
            return ResponseEntity.ok(user);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    // 创建用户
    @PostMapping
    public ResponseEntity<Void> createUser(@RequestBody User user) {
        userService.createUser(user);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    // 更新用户
    @PutMapping("/{id}")
    public ResponseEntity<Void> updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        userService.updateUser(user);
        return ResponseEntity.ok().build();
    }

    // 删除用户
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return ResponseEntity.noContent().build();
    }
}

6. 配置文件

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.configuration.map-underscore-to-camel-case=true

# 显示SQL语句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

说明

  • map-underscore-to-camel-case=true:自动将数据库下划线命名转换为Java的驼峰命名。
  • log-impl:设置MyBatis的日志实现,这里使用标准输出日志。

总结

在Spring Boot + MyBatis项目中,注解的使用极大地简化了配置和开发流程。通过合理运用各种注解,可以实现代码的高内聚低耦合,提升项目的可维护性和扩展性。本文按照功能对Spring Boot和MyBatis中的常用注解进行了分类讲解,并通过一个综合示例展示了它们的实际应用。希望能帮助开发者在实际项目中更好地理解和运用这些注解,构建高效、稳定的应用系统。


附录:常用注解对照表

注解类别注解名称作用
核心注解@SpringBootApplication标注主类,启用自动配置和组件扫描
组件标识注解@RestController标识REST控制器,返回JSON/XML数据
@Controller标识MVC控制器,返回视图
@Service标识业务逻辑层组件
@Repository标识数据访问层组件,提供异常转换
@Component通用组件注解
依赖注入注解@Autowired自动装配Bean
@Qualifier指定注入的具体Bean
@Inject实现依赖注入(JSR-330规范)
配置注解@Configuration标识配置类
@Bean定义Bean
@Value注入配置属性值
@ConfigurationProperties绑定配置属性到Java对象
事务管理注解@Transactional声明事务管理
Web层注解@RequestMapping定义请求路径和方法
@GetMapping处理GET请求
@PostMapping处理POST请求
@PutMapping处理PUT请求
@DeleteMapping处理DELETE请求
@PathVariable绑定URL路径变量到方法参数
@RequestParam绑定请求参数到方法参数
@RequestBody绑定请求体到方法参数
@ResponseBody将方法返回值序列化到响应体
MyBatis注解@Mapper标识Mapper接口
@Select定义SELECT语句
@Insert定义INSERT语句
@Update定义UPDATE语句
@Delete定义DELETE语句
@Param命名方法参数
@Results定义结果集映射
@Result定义单个结果映射
@One定义一对一关联
@Many定义一对多关联

通过对这些注解的深入理解和正确使用,可以有效提升Spring Boot + MyBatis项目的开发效率和代码质量。


摊牌了,不装了,整理不易,我想要你手中的赞和关注🌼🌼🌼

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO v11实时目标检测3:训练数据集格式说明

一、Yolov11简介 YOLOv11 是 YOLO 系列的最新版本&#xff0c;它不仅在目标检测方面表现出色&#xff0c;还引入了对象分割和多目标跟踪的功能。本文将介绍如何使用 YOLOv11 进行人流统计、车流统计以及跟踪的实际应用。 二、Yolo v11训练数据集格式说明 2.1 数据组织&#…

SAT分离轴定理的c++/python实现

分离轴定理的c/python实现 现在要对BEV模型检查出来的车辆做NMS&#xff0c;把3d框的平面属性获取到后&#xff0c;配合旋转角度投影到地面就是2D图形。 开始碰撞检测&#xff0c;判断是否重叠&#xff0c;保留置信度高的框就行。 原理 分离轴定理&#xff08;Separating A…

(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

目录 前言 实现效果 支持方向变换 修改默认效果 如何修改 总结 前言 我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动&#xff0c;本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。 实现效果 上图是我们希望实现的效果&#xff0c;我们可以自发地控…

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统 前言 本章节适合有一定基础的 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 具体请联系作者 项目结构 项目流程图 技术栈 项目结构 项目路由 4. 项目模型 项目初始化 初始化项目文…

归并排序【C语言版-笔记】

目录 一、概念二、排序流程理解三、代码实现3.1主调函数3.2 merge函数 四、性能分析 一、概念 归并是一种算法思想&#xff0c;是将两个或两个一上的有序表合并成一个长度较大的有序表。若一开始无序表中有n个元素&#xff0c;可以把n个元素看作n个有序表&#xff0c;把它们两…

Java中数据转换以及字符串的“+”操作

隐式转换&#xff08;自动类型转换&#xff09; 较小范围的数据类型转成较大范围的数据类型 强制转换&#xff08;显式转换&#xff09; 将数据范围大的数据类型转换为数据范围小的数据类型 基本数据类型之间的转换 当需要将一个较大的数据类型&#xff08;如float或double…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程&#xff0c;代码共享&#xff0c;不作写入操作时&#xff0c;数据也是共享的&#xff0c;当任意一方试图写入&#xff0c;便通过写时拷…

影刀RPA实战:excel相关图片操作指令解

1.实战目标 excel是工作中必不缺少的工具&#xff0c;今天我们继续使用影刀RPA来实现excel操作的便利性&#xff0c;让影刀自动化来帮我们完成工作。 2.单元格填充图片 2.1 指令说明 功能&#xff1a;向 Excel 单元格插入本地图片或网络图片&#xff0c;支持Office和WPS&…

波阻抗,是电场矢量的模值/磁场矢量的模值

波阻抗是电场复振幅除以磁场复振幅&#xff0c;最后只与介质με有关 所以磁场可用电场强度表示&#xff08;利用波阻抗&#xff09; 问题&#xff0c;复振幅是矢量&#xff0c;波阻抗的定义是复振幅的比值&#xff1f;答案&#xff1a;不是&#xff0c;很明显&#xff0c;波阻…

Web3 游戏周报(9.22 - 9.28)

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【9.22-9.28】Web3 游戏行业动态&#xff1a; Axie Infinity 将 Fortune Slips 的冷却时间缩短至 24 小时&#xff0c;从而提高玩家的收入。 Web3 游戏开发商 Darkbright Studios…

Pikachu-Sql Inject-搜索型注入

MySQL的搜索语句&#xff1a; select * from table where column like %text%&#xff1b; 如&#xff1a;使用引号闭合左边的引号&#xff0c; or 11 把所有数据查询出来&#xff1b; # 注释掉后面的 引号等&#xff1b; test or 11# 查询出结果&#xff1a; 注入的核心点…

Cloneable接口(浅拷贝和深拷贝的区别)

前言 Object类中存在这一个clone方法&#xff0c;调用这个方法可以创建一个对象的“拷贝”。但是想要合法调用clone方法&#xff0c;必须要先实现Clonable接口&#xff0c;否则就会抛出CloneNotSupportedException异常。 1 Cloneable接口 //Cloneable接口声明 public interf…

CentOS 7文件系统

从centos7开始&#xff0c;默认的文件系统从ext4变成了XFS。随着虚拟化的应用越来越广泛&#xff0c;作为虚拟化磁盘来源的大文件&#xff08;单个文件几GB级别&#xff09;越来越常见。 1.XFS组成部分&#xff1a; XFS文件系统在数据的分布上主要划分为三部分&#xff1a;数据…

QT篇:QT介绍

一.QT概述 Qt 是一个跨平台的应用程序和用户界面框架&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;应用程序以及命令行工 具。它最初由挪威的 Trolltech &#xff08;奇趣科技&#xff09;公司开发&#xff0c;现在由 Qt Company 维护&#xff0c;2020年12月8…

如何在网格中模拟腐烂扩散:如何使用广度优先搜索(BFS)解题

问题描述 你需要在一个二维的网格中处理橘子的腐烂扩散过程&#xff0c;网格中的每个单元格可以有三种状态&#xff1a; 0&#xff1a;表示空格&#xff0c;没有橘子。1&#xff1a;表示一个新鲜的橘子。2&#xff1a;表示一个腐烂的橘子&#xff0c;它可以在 1 分钟内让上下…

模拟算法(1)_替换所有的问号

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(1)_替换所有的问号 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. …

MHA携手Atlas:打造高效读写分离解决方案,引领数据库性能飞跃

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

npm切换到淘宝镜像

1、输入以下命令后回车&#xff0c;npm切换至淘宝镜像 npm config set registry https://registry.npmmirror.com 2、输入以下命令后回车&#xff0c;检查是否切换成功 npm config get registry 若返回此信息&#xff0c;表示切换成功 3、切换后就可使用淘宝镜像加快npm包的…

C语言 | Leetcode C语言题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; int cmpfunc(const void *a, const void *b) {return (*(int *)a - *(int *)b); } //计算组合数*2 int every(int count) {if (count 1) {return 0;} else {return count * (count - 1);} } //计算每个锚点能产生的回旋镖总数 int part(in…

【嵌入式系统】第18章 脉宽调试器(PWM)

目录 18.1 结构框图 18.3 功能说明 18.3.4 PWM 信号发生器 18.3.5 死区发生器 18.3.6 中断/ADC 触发选择器 18.3.7 同步方法 18.3.8 故障条件 18.3.9 输出控制块 LES 硬件介绍&#xff08;12&#xff09;正交编码接口QEI 19.1 结构框图 19.2 信号描述 19.3 功能说明…