全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口
1.创建user文件夹 作为增删改查的根包
路径 src/main/java/com.example.demo/user
2.文件夹里文件作用介绍
1.User(实体类)
package com.example.demo.user;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode等方法
@NoArgsConstructor
@AllArgsConstructor
@TableName("user") // 指定该实体类对应的数据库表名为"user"
public class User {@TableId(type = IdType.AUTO) // 主键设置为自增private Integer id; // 主键字段,对应数据库中的"id"列@TableField("name") // 明确字段与数据库列的映射关系private String name; // 用户名字段,对应数据库中的"name"列@TableField("age")private Integer age; // 年龄字段,对应数据库中的"age"列@TableField("description")private String description; // 用户描述字段,对应数据库中的"description"列
}
2.condition
UserQueryCondition
UserQueryCondition
类的主要作用是作为查询用户时的条件类,用于封装查询条件。它通常用于在接收查询参数时,将这些参数封装成对象传递给服务层或数据库查询层,以实现查询操作。具体来说,它的功能包括:
封装查询参数:
current
:当前的页码,默认为1。用于分页查询时指定查询结果的页码。pageSize
:每页显示的数据条数,默认为10。用于分页查询时指定每页要显示的记录数。name
:用户的名称,用于按名称进行模糊或精确查询。age
:用户的年龄,用于按年龄查询。description
:用户的描述信息,作为查询条件之一,用于按用户描述筛选数据。提供数据传输对象(DTO)功能:
- 该类可以在控制器层接受前端传来的查询条件参数,也可以作为参数传递给服务层或数据访问层,从而避免在方法中传递过多参数,使代码更加简洁。
分页功能:
- 通过
current
和pageSize
这两个字段,配合分页逻辑,能够实现用户信息的分页查询。开发者可以通过这两个字段计算出需要查询的具体范围(如数据库的LIMIT
子句中的offset
和limit
),从而提高查询性能,防止一次性返回大量数据。简化条件查询:
- 通过封装成类对象,所有查询条件可以一次性通过该类对象传递,不需要在方法中传递多个单独的查询参数,简化了方法调用的参数列表。
package com.example.demo.user.condition;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserQueryCondition {private int current = 1; // 当前页码,默认值为1private int pageSize = 10; // 每页显示数量,默认值为10private String name;private Integer age;private String description;
}
@Data
、@NoArgsConstructor
和@AllArgsConstructor
是 Lombok 提供的注解,用于简化 Java 类的编写。它们的作用分别如下:
@Data
:
- 自动生成该类的常用方法,如:
getters
(获取属性值的方法)setters
(设置属性值的方法)toString()
(生成该类的字符串表示)equals()
和hashCode()
(用于比较和集合操作)- 这个注解为类提供了所有必要的工具方法,大大简化了开发时的样板代码。
@NoArgsConstructor
:
- 自动生成一个无参构造方法(没有参数的构造器)。
- 这个构造方法可以在不传递任何参数的情况下创建该类的实例。
- 使用场景:当需要先创建一个空对象,然后逐步设置其属性时(比如通过 setter 方法)。
@AllArgsConstructor
:
- 自动生成一个包含所有字段的有参构造方法。
- 这个构造方法会根据类中的所有字段生成参数,方便在创建对象时一次性初始化所有属性。
- 使用场景:当想直接在实例化对象时就传递所有字段的值。
3.response
1.UserCRUDResponse
作用和上面的condition差不多,不多赘述
package com.example.demo.user.response;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserCUDResponse {private String message; // 响应信息(如成功或失败消息)private boolean success;
}
2.UserQueryResponse
package com.example.demo.user.response;import com.example.demo.user.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserQueryResponse {private List<User> data; // 用户数据列表private long total; // 总记录数private String message; // 响应信息(如成功或失败消息)private boolean success;
}
4.UserMapper
UserMapper
接口的作用是作为用户数据表的数据库操作接口,使用 MyBatis-Plus 提供的BaseMapper
接口,来对User
实体类对应的数据库表进行基本的 CRUD(创建、读取、更新、删除)操作。这个接口通过继承BaseMapper<User>
,不需要开发者自己编写 SQL,就可以轻松实现对User
数据的数据库操作。具体功能如下:
继承
BaseMapper
提供的通用 CRUD 功能:
- MyBatis-Plus 中的
BaseMapper<T>
是一个通用的 Mapper 接口,封装了常见的数据库操作方法。通过继承BaseMapper<User>
,UserMapper
自动获得以下基本方法:
insert(T entity)
:插入一条记录。deleteById(Serializable id)
:根据主键 ID 删除一条记录。updateById(T entity)
:根据主键 ID 更新记录。selectById(Serializable id)
:根据主键 ID 查询一条记录。selectList(Wrapper<T> queryWrapper)
:查询多条记录。这些方法的 SQL 语句已经由 MyBatis-Plus 自动生成并执行,开发者不需要自己写。
与数据库交互:
- 通过
@Mapper
注解,MyBatis 会在程序启动时扫描该接口,将它注册为 MyBatis 的 Mapper,并生成相应的代理对象,处理与数据库的交互。具体来说,它会将UserMapper
接口的方法调用,映射为对应的 SQL 语句,并将 SQL 结果映射为User
对象。可以扩展自定义 SQL 操作:
- 虽然
BaseMapper
提供了常见的 CRUD 方法,但如果项目中需要进行更复杂的查询或自定义 SQL 操作,UserMapper
还可以通过定义接口方法并配合 XML 文件或注解,编写自定义 SQL。例如,可以使用@Select
、@Insert
等注解直接在接口中编写 SQL,或在 XML 文件中定义复杂的查询逻辑。
package com.example.demo.user;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {
}
5.UserServiceImpl
UserServiceImpl
是UserService
接口的具体实现类,它负责实际执行用户相关的业务逻辑操作。它通过调用数据访问层(如UserMapper
)来实现UserService
接口定义的方法,处理具体的增删改查等业务逻辑。主要作用:
实现业务逻辑:
UserServiceImpl
实现了UserService
接口中定义的各个方法,负责用户的实际操作,比如查询用户、添加用户、删除用户、更新用户等业务逻辑。调用数据访问层:
- 通过注入
UserMapper
,UserServiceImpl
调用 MyBatis-Plus 提供的数据访问层方法,与数据库进行交互,完成对用户数据的操作。UserMapper
提供了基本的 CRUD 操作,而UserServiceImpl
可以将这些操作结合业务逻辑进行封装。为控制层提供服务:
- 控制器层(
UserController
)会调用UserServiceImpl
中的方法来执行具体的业务操作。控制层只负责处理 HTTP 请求,而具体的业务逻辑由UserServiceImpl
处理,控制层和数据访问层通过服务层(UserServiceImpl
)解耦。
package com.example.demo.user;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.user.condition.UserQueryCondition;
import com.example.demo.user.response.UserCUDResponse;
import com.example.demo.user.response.UserQueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic UserQueryResponse getAllUsersWithCount(UserQueryCondition condition) {IPage<User> userPage = new Page<>(condition.getCurrent(), condition.getPageSize());QueryWrapper<User> queryWrapper = new QueryWrapper<>();// 根据条件构建查询Optional.ofNullable(condition.getName()).ifPresent(name -> queryWrapper.like("name", name));Optional.ofNullable(condition.getAge()).ifPresent(age -> queryWrapper.eq("age", age));Optional.ofNullable(condition.getDescription()).ifPresent(description -> queryWrapper.like("description", description));// 执行分页查询userPage = userMapper.selectPage(userPage, queryWrapper);// 返回结果return new UserQueryResponse(userPage.getRecords(), userPage.getTotal(), "查询成功", true);}@Overridepublic UserCUDResponse addUser(User user) {try {int result = userMapper.insert(user);if (result > 0) {return new UserCUDResponse( "新增成功", true);} else {return new UserCUDResponse("新增失败,未插入任何记录", false);}} catch (Exception e) {// 捕获异常并返回错误信息return new UserCUDResponse("新增失败,错误信息:" + e.getMessage(), false);}}@Overridepublic UserCUDResponse deleteUserById(Long id) {// 使用MyBatis Plus的deleteById方法删除用户int rows = userMapper.deleteById(id); // 返回受影响的行数if (rows > 0) {// 删除成功返回信息return new UserCUDResponse("删除成功", true);} else {// 删除失败返回信息return new UserCUDResponse( "删除失败,用户不存在", false);}}@Overridepublic UserCUDResponse updateUserById(User user) {// 使用MyBatis Plus的updateById方法更新用户int result = userMapper.updateById(user); // 返回受影响的行数if (result > 0) {return new UserCUDResponse("用户信息更新成功", true);} else {return new UserCUDResponse("用户信息更新失败", false);}}
}
config/MybatisPlusConfig
里面配置了分页插件
package com.example.demo.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {// 配置 MyBatis-Plus 分页插件@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
6.UserService
UserService
是一个服务层接口,定义了与用户相关的业务逻辑操作。它抽象出了一些对用户信息的常见操作,比如查询、添加、删除和更新等,供UserController
等其他层调用。具体来说,它定义了业务方法的签名,而具体的实现通常会在一个类中实现这些接口方法(比如UserServiceImpl
)。主要作用:
抽象业务逻辑:
UserService
是对用户相关的业务逻辑操作的抽象,不直接操作数据库,而是通过调用数据访问层(比如UserMapper
)来实现业务逻辑。它将业务层与持久层解耦。为控制层提供接口:
UserController
可以调用UserService
中定义的方法,将具体的业务操作(如用户的增删改查)委托给服务层。控制器只负责处理请求和响应,而业务逻辑则在服务层处理。接口定义:
UserService
只是定义了方法签名,而具体的业务逻辑如何执行,通常会在其实现类中进行处理。通过定义接口,可以有多个实现类,并在不同情况下选择不同的实现方式。方法解析:
getAllUsersWithCount(UserQueryCondition condition)
:
- 根据查询条件
UserQueryCondition
,获取所有用户数据和总记录数。该方法返回UserQueryResponse
对象,通常包含用户列表和总记录数,用于分页查询。
addUser(User user)
:
- 该方法负责添加新用户。接收
User
对象作为参数,返回UserCUDResponse
,表示操作的结果(例如操作是否成功、用户的ID等)。
deleteUserById(Long id)
:
- 根据用户 ID 删除用户。接受一个
id
参数,调用底层的删除逻辑,返回UserCUDResponse
表示删除操作的结果。
updateUserById(User user)
:
- 该方法用于根据用户 ID 更新用户信息。接受一个
User
对象(通常包含用户 ID 和需要更新的字段),返回UserCUDResponse
表示更新操作的结果。
package com.example.demo.user;import com.example.demo.user.condition.UserQueryCondition;
import com.example.demo.user.response.UserCUDResponse;
import com.example.demo.user.response.UserQueryResponse;public interface UserService {UserQueryResponse getAllUsersWithCount(UserQueryCondition condition);UserCUDResponse addUser(User user); // 新增方法UserCUDResponse deleteUserById(Long id);UserCUDResponse updateUserById(User user); // 通过用户 ID 修改用户信息}
7.UserController
UserController
是一个 Spring Boot 的控制器类,负责处理与用户相关的 HTTP 请求。它作为应用程序的入口之一,接收来自客户端的请求,并将请求委托给相应的服务层进行处理。下面是UserController
的主要作用:主要功能:
处理 HTTP 请求:
UserController
定义了多个处理方法(例如getAllUsers
、addUser
、deleteUserById
和updateUserById
),用于响应不同的 HTTP 请求类型(GET、POST、DELETE、PUT)。接收和解析请求参数:
- 控制器可以接收客户端传来的请求参数(如查询条件、用户数据等),并通过注解(如
@RequestBody
、@PathVariable
和@Validated
)进行解析和验证。调用服务层:
- 控制器负责调用服务层(如
UserService
)的方法来执行业务逻辑。例如,当接收到添加用户的请求时,控制器会调用UserService
的addUser
方法来执行具体的添加操作。构建响应:
- 控制器将服务层返回的结果(如用户数据、操作结果等)构建成 HTTP 响应返回给客户端。这可能包括状态码、响应体等。
统一接口前缀:
- 通过
@RequestMapping("/api/user")
,控制器定义了一个统一的接口前缀,使得所有与用户相关的 API 都以/api/user
开头,方便管理和使用。
package com.example.demo.user;import com.example.demo.user.condition.UserQueryCondition;
import com.example.demo.user.response.UserCUDResponse;
import com.example.demo.user.response.UserQueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/user") // 统一接口前缀
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic UserQueryResponse getAllUsers(@Validated UserQueryCondition condition // 使用 UserQueryCondition 作为查询条件) {// 直接传入查询条件到服务层return userService.getAllUsersWithCount(condition);}@PostMapping // 使用 POST 请求添加用户public UserCUDResponse addUser(@RequestBody User user) {return userService.addUser(user);}// 删除用户接口,根据用户ID删除@DeleteMapping("/{id}")public UserCUDResponse deleteUser(@PathVariable Long id) {return userService.deleteUserById(id);}@PutMappingpublic UserCUDResponse updateUser(@RequestBody User user) {// 调用Service层的修改方法return userService.updateUserById(user);}
}
相关文章:

全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口
1.创建user文件夹 作为增删改查的根包 路径 src/main/java/com.example.demo/user 2.文件夹里文件作用介绍 1.User(实体类) package com.example.demo.user; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.IdType; impo…...

计算机组成原理==初识二进制运算
计算机组成原理 计算机算术概要 计算机算术是计算机组成原理中的一个重要部分,它涉及在计算机硬件中执行基本数学运算的方法和技术。计算机算术不仅包括简单的加减乘除运算,还包括更复杂的操作如浮点运算、位运算等。 1. 基本概念 数制:计…...

【machine learning-十-grading descent梯度下降实现】
grading descent 梯度下降参数更新方法 --导数和学习率 从导数项直观理解梯度下降 grading descent 算法就是更新参数,今天来学习下如何更新w和b 梯度下降 还是以线性回归的均方差损失函数如下为例: 损失函数的可视化图如下 : 横轴和纵轴分…...

python网络游戏
import socket import threading 客户端处理函数 def handle_client(client_socket, client_address): print(“[INFO] New connection from: {}”.format(client_address)) # 接收客户端消息并回复 while True:data client_socket.recv(1024).decode(utf-8)if not data:br…...

使用Charles抓包Android App数据
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 抓包环境准备 1. 下载安装charles charles下载地址:https://www.charlesproxy.com/latest-release/download.do 2. SSL代理设置 3. http代理和…...

通信工程学习:什么是VM虚拟机
VM:虚拟机 VM虚拟机(Virtual Machine)是一种通过软件模拟的计算机系统,它能够在物理计算机上模拟并运行多个独立的虚拟计算机系统。以下是关于VM虚拟机的详细解释: 一、VM虚拟机的定义与原理 定义: VM虚拟…...

C#环境搭建和入门教程--vs2022之下
目录 1.环境搭建 2.先让程序跑起来 3.C#代码结构 4.变量,输入输出介绍 5.内容输入和类型转换 1.环境搭建 我们的这个c#基础学习主要就是在这个vs2022上面进行的,我们的这个c/c使用的都是这个平台 我们首先检查一下我们的这个环境是不是完全的配置了…...

自定义类型
前言:不知不觉又过了一个礼拜。时间过的还真是快呀。好了废话不多说,今天我们来学习C语言中的结构体,联合体,枚举。 我们都知道C语言中数据类型大致被分为基本类型,自定义类型,指针类型,空类型…...

数仓项目环境搭建
目录 一、安装CentOS 1.1、修改映射关系: 1.2、免密登录: 1.3、关闭防⽕墙: 1.4、修改linux的安全机制: 1.5、修改yum源: 二、安装JDK 2.1、创建文件夹: 2.2、解压安装: 2.3、配置环境变量: 2.4、刷新环境变量: 2.5、验证: 三、安装Hadoop[伪分布式] 3.1、安装hd…...

Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook
文章目录 一 、计算属性1. 简写2. 完整写法 二、监视watch1. 监视【ref】定义的【基本类型】数据2. 监视【ref】定义的【对象类型】数据3. 监视【reactive】定义的【对象类型】数据4. 监视【ref】或【reactive】定义的【对象类型】数据中的某个属性5. 监视多个数据总结 三、wat…...

栈:只允许在一端进行插入或删除操作的线性表
一、重要术语: 栈顶、栈底、空栈 二、线性表的基本操作 三、栈的相关操作: 把线性表中的list改成stack insert改成 push delete 改成 pop 总结:“后进先出” 四、顺序栈: 缺点:栈的大小不可变 1.定义: …...

spring boot 热部署
热部署的主要作用是在服务器运行的时候可以在不关闭服务器的情况下修改代码 可以很大的提高开发效率 热部署的步骤很简单 首先,需要在 pom.xml 文件中引入热部署需要的依赖 <dependency><groupId>org.springframework.boot</groupId><artif…...

携手阿里云CEN:共创SD-WAN融合广域网
在9月19日举行的阿里云云栖大会上,犀思云作为SD-WAN领域的杰出代表及阿里云的SD-WAN重要合作伙伴,携手阿里云共同推出了创新的企业上云方案——Fusion WAN智连阿里云解决方案。这一创新方案不仅彰显了犀思云在SD-WAN技术领域的深厚积累,更体现…...

kettle从入门到精通 第八十七课 ETL之kettle kettle文件上传
1、kettle本身文件上传功能不是很友好,甚至是不能直接使用,需要调整文件上传接口才可以正常接收到文件,本次讲解内容主要是通过自定义插件解决这个问题。 2、通过springboot 编写简单demo,模拟文件上传,接口支持三个参…...

Algo-Lab 2 Stack Queue ADT
Lab 2: Stack & Queue ADT Part 1 这里只说一下最小栈的思路,我们可以在定义一个栈,来同步存储当前情况下的占的最小值。最小栈第一时间的想法可能是设定一个变量,每次push进来栈中的元素进行对比,保持最小值,…...

MySQL索引详解
前言 在数据库管理中,索引是提高数据检索速度的重要工具。MySQL作为流行的关系型数据库管理系统,提供了多种类型的索引来优化查询性能。本文将深入探讨MySQL索引的工作原理、类型、创建方法以及最佳实践。 索引简介 MySQL中的索引是一种数据库对象&am…...

fastadmin 根据选择数据来传参给selectpage输入框
文章目录 js代码php代码:完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…...

【算法】堆与优先级队列
【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)最后一块石头的重量 .1- 题目解析 .2- 代码编写 2)数据流中的第 K 大元素 .1- 题目解析 .2- 代码编写 3)前K个高频单词 .1- 题目解析 .2- 代码编写 4…...

Java基础尚硅谷85-面向对象特征一:封装性
曾国藩说,基础不牢,很难走得远。 所以时时回顾一下Java基础,打好地基,让自己走得更稳,更远。 今天这节课,学到对自己有点价值的东西是: 为什么要封装?保护数据安全。只对外暴露极少…...

828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问
一、Flexus云服务器X实例简介 1.1 概述 华为云Flexus X实例是华为云推出的一款创新云服务器产品,它主要面向中小企业和开发者,旨在解决传统云服务中的痛点,提供更加灵活、高效的云服务体验。 华为深刻洞察了中小企业和开发者在云服务应用中遇…...

828华为云征文|华为云Flexus云服务器X实例部署Xnote笔记应用
828华为云征文|华为云Flexus云服务器X实例部署Xnote笔记应用 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Note Mark 介绍2.1 Xnote简介2.2 Xnote特点2.3 主要使用场景 三、本次实…...

手写数字识别案例分析(torch,深度学习入门)
在人工智能和机器学习的广阔领域中,手写数字识别是一个经典的入门级问题,它不仅能够帮助我们理解深度学习的基本原理,还能作为实践编程和模型训练的良好起点。本文将带您踏上手写数字识别的深度学习之旅,从数据集介绍、模型构建到…...

应用密码学第一次作业(9.23)
一、Please briefly describe the objectives of information and network security,such as confidentiality, integrity, availability , authenticity , and accountability The objectives of information and network security include: Confidentiality: Protecting se…...

JSON合并工具
JSON合并工具 1. 项目概述 本项目旨在开发一个强大而灵活的JSON合并工具,能够合并多个JSON文件,处理复杂的嵌套结构,提供详细的合并报告,并实现全面的验证和错误处理机制。 2. 功能需求 2.1 基本合并功能 支持合并两个或多个…...

【网络编程】网页的显示过程
文章目录 1.URL 解析2.DNS 解析3.TCP三次握手4.服务器接收请求5.客户端接收响应 首先我们知道网页经过网络总共有应用层,传输层,网络层,数据链路层,物理层 1.URL 解析 将获得的网址解析出协议,主机名,域名…...

用nginx-rtmp-win32-master及ffmpeg模拟rtmp视频流
效果 使用nginx-rtmp-win32-master搭建RTMP服务 双击exe就可以了。切记整个目录不能有中文 README.md ,启用后本地的RTM路径: rtmp://192.168.1.186/live/xxx ffmpeg将地本地视频推RMTP F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -c c…...

使用python-pptx将PPT转换为图片:将每张幻灯片保存为单独的图片文件
哈喽,大家好,我是木头左! 本文将详细介绍如何使用python-pptx将PPT的每一张幻灯片保存为单独的图片文件。 安装python-pptx库 需要确保已经安装了python-pptx库。可以通过以下命令使用pip进行安装: pip install python-pptx导入所需库 接下来,需要导入一些必要的库,包…...

聊聊企业的低代码实践背景与成效
数字化转型的道路充满挑战是大家的普遍共识,许多企业仍未完全步入数字化的行列,它们面临的是系统的碎片化和操作的复杂性。在数字优先的今天,企业要想维持竞争力,比任何时期都更需要实施某种程度的数字化升级。如果一个组织难以提…...

zookeeper面试题
1. 什么是zookeeper zookeeper是一个开源的 分布式协调服务。他是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。 Zooke…...

Linux学习笔记13---GPIO 中断实验
中断系统是一个处理器重要的组成部分,中断系统极大的提高了 CPU 的执行效率,本章会将 I.MX6U 的一个 IO 作为输入中断,借此来讲解如何对 I.MX6U 的中断系统进行编程。 GIC 控制器简介 1、GIC 控制器总览 I.MX6U(Cortex-A)的中断控制器…...