Spring Boot整合MyBatis+MySQL+Redis单表CRUD教程

Spring Boot整合MyBatis+MySQL+Redis单表CRUD教程

环境准备

1. Redis安装(Windows)

# 下载Redis for Windows
# 访问: https://github.com/tporadowski/redis/releases
# 下载Redis-x64-5.0.14.1.msi并安装# 启动Redis服务
redis-server# 测试连接
redis-cli
ping  # 应该返回PONG

2. 项目创建

使用IDEA创建Spring Boot项目,或访问 https://start.spring.io/

项目依赖配置

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version><relativePath/></parent><groupId>com.example</groupId><artifactId>user-crud</artifactId><version>0.0.1-SNAPSHOT</version><name>user-crud</name><properties><java.version>11</java.version></properties><dependencies><!-- Spring Boot 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.2.2</version></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- JSON处理 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><!-- Lombok(可选,简化代码) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

数据库准备

创建数据库和表

-- 创建数据库
CREATE DATABASE user_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE user_management;-- 创建用户表
CREATE TABLE users (id BIGINT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL,phone VARCHAR(20),age INT,created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);-- 插入测试数据
INSERT INTO users (username, email, phone, age) VALUES
('zhangsan', 'zhangsan@example.com', '13800138001', 25),
('lisi', 'lisi@example.com', '13800138002', 30),
('wangwu', 'wangwu@example.com', '13800138003', 28);

配置文件

application.yml

server:port: 8080spring:# 数据源配置datasource:url: jdbc:mysql://localhost:3306/user_management?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: your_password  # 替换为你的MySQL密码driver-class-name: com.mysql.cj.jdbc.Driver# Redis配置redis:host: localhostport: 6379timeout: 3000jedis:pool:max-active: 20max-idle: 10min-idle: 0# MyBatis配置
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.usercrud.entityconfiguration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 日志配置
logging:level:com.example.usercrud.mapper: debug

代码实现

1. 实体类

// src/main/java/com/example/usercrud/entity/User.java
package com.example.usercrud.entity;import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;@Data
public class User implements Serializable {private Long id;private String username;private String email;private String phone;private Integer age;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createdTime;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updatedTime;
}

2. Mapper接口

// src/main/java/com/example/usercrud/mapper/UserMapper.java
package com.example.usercrud.mapper;import com.example.usercrud.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;@Mapper
public interface UserMapper {// 插入用户int insert(User user);// 根据ID删除用户int deleteById(@Param("id") Long id);// 更新用户int update(User user);// 根据ID查询用户User selectById(@Param("id") Long id);// 查询所有用户List<User> selectAll();// 根据用户名查询User selectByUsername(@Param("username") String username);// 分页查询List<User> selectByPage(@Param("offset") int offset, @Param("size") int size);// 统计总数long count();
}

3. Mapper XML

<!-- src/main/resources/mapper/UserMapper.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.usercrud.mapper.UserMapper"><!-- 结果映射 --><resultMap id="UserResultMap" type="User"><id property="id" column="id"/><result property="username" column="username"/><result property="email" column="email"/><result property="phone" column="phone"/><result property="age" column="age"/><result property="createdTime" column="created_time"/><result property="updatedTime" column="updated_time"/></resultMap><!-- 基础列 --><sql id="Base_Column_List">id, username, email, phone, age, created_time, updated_time</sql><!-- 插入 --><insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">INSERT INTO users (username, email, phone, age)VALUES (#{username}, #{email}, #{phone}, #{age})</insert><!-- 删除 --><delete id="deleteById">DELETE FROM users WHERE id = #{id}</delete><!-- 更新 --><update id="update" parameterType="User">UPDATE users SET username = #{username},email = #{email},phone = #{phone},age = #{age}WHERE id = #{id}</update><!-- 根据ID查询 --><select id="selectById" resultMap="UserResultMap">SELECT <include refid="Base_Column_List"/>FROM usersWHERE id = #{id}</select><!-- 查询所有 --><select id="selectAll" resultMap="UserResultMap">SELECT <include refid="Base_Column_List"/>FROM usersORDER BY created_time DESC</select><!-- 根据用户名查询 --><select id="selectByUsername" resultMap="UserResultMap">SELECT <include refid="Base_Column_List"/>FROM usersWHERE username = #{username}</select><!-- 分页查询 --><select id="selectByPage" resultMap="UserResultMap">SELECT <include refid="Base_Column_List"/>FROM usersORDER BY created_time DESCLIMIT #{offset}, #{size}</select><!-- 统计总数 --><select id="count" resultType="long">SELECT COUNT(*) FROM users</select></mapper>

4. Service服务层

// src/main/java/com/example/usercrud/service/UserService.java
package com.example.usercrud.service;import com.example.usercrud.entity.User;
import java.util.List;public interface UserService {// 创建用户User createUser(User user);// 删除用户boolean deleteUser(Long id);// 更新用户User updateUser(User user);// 根据ID查询用户User getUserById(Long id);// 查询所有用户List<User> getAllUsers();// 分页查询用户List<User> getUsersByPage(int page, int size);// 统计用户总数long getUserCount();
}
// src/main/java/com/example/usercrud/service/impl/UserServiceImpl.java
package com.example.usercrud.service.impl;import com.example.usercrud.entity.User;
import com.example.usercrud.mapper.UserMapper;
import com.example.usercrud.service.UserService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.TimeUnit;@Slf4j
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate ObjectMapper objectMapper;private static final String USER_CACHE_PREFIX = "user:";private static final String USER_LIST_CACHE_KEY = "user:list";private static final int CACHE_EXPIRE_HOURS = 2;@Overridepublic User createUser(User user) {try {int result = userMapper.insert(user);if (result > 0) {// 清除列表缓存stringRedisTemplate.delete(USER_LIST_CACHE_KEY);log.info("用户创建成功,ID: {}", user.getId());return user;}} catch (Exception e) {log.error("创建用户失败", e);throw new RuntimeException("创建用户失败");}return null;}@Overridepublic boolean deleteUser(Long id) {try {int result = userMapper.deleteById(id);if (result > 0) {// 删除缓存stringRedisTemplate.delete(USER_CACHE_PREFIX + id);stringRedisTemplate.delete(USER_LIST_CACHE_KEY);log.info("用户删除成功,ID: {}", id);return true;}} catch (Exception e) {log.error("删除用户失败,ID: {}", id, e);throw new RuntimeException("删除用户失败");}return false;}@Overridepublic User updateUser(User user) {try {int result = userMapper.update(user);if (result > 0) {// 更新缓存String cacheKey = USER_CACHE_PREFIX + user.getId();String userJson = objectMapper.writeValueAsString(user);stringRedisTemplate.opsForValue().set(cacheKey, userJson, CACHE_EXPIRE_HOURS, TimeUnit.HOURS);// 清除列表缓存stringRedisTemplate.delete(USER_LIST_CACHE_KEY);log.info("用户更新成功,ID: {}", user.getId());return user;}} catch (Exception e) {log.error("更新用户失败,ID: {}", user.getId(), e);throw new RuntimeException("更新用户失败");}return null;}@Overridepublic User getUserById(Long id) {String cacheKey = USER_CACHE_PREFIX + id;try {// 先从缓存获取String userJson = stringRedisTemplate.opsForValue().get(cacheKey);if (userJson != null) {log.info("从缓存获取用户,ID: {}", id);return objectMapper.readValue(userJson, User.class);}// 缓存未命中,从数据库查询User user = userMapper.selectById(id);if (user != null) {// 写入缓存userJson = objectMapper.writeValueAsString(user);stringRedisTemplate.opsForValue().set(cacheKey, userJson, CACHE_EXPIRE_HOURS, TimeUnit.HOURS);log.info("从数据库获取用户并缓存,ID: {}", id);}return user;} catch (Exception e) {log.error("获取用户失败,ID: {}", id, e);// 缓存异常时直接查数据库return userMapper.selectById(id);}}@Overridepublic List<User> getAllUsers() {try {// 先从缓存获取String listJson = stringRedisTemplate.opsForValue().get(USER_LIST_CACHE_KEY);if (listJson != null) {log.info("从缓存获取用户列表");return objectMapper.readValue(listJson, objectMapper.getTypeFactory().constructCollectionType(List.class, User.class));}// 缓存未命中,从数据库查询List<User> users = userMapper.selectAll();if (!users.isEmpty()) {// 写入缓存listJson = objectMapper.writeValueAsString(users);stringRedisTemplate.opsForValue().set(USER_LIST_CACHE_KEY, listJson, CACHE_EXPIRE_HOURS, TimeUnit.HOURS);log.info("从数据库获取用户列表并缓存,数量: {}", users.size());}return users;} catch (Exception e) {log.error("获取用户列表失败", e);// 缓存异常时直接查数据库return userMapper.selectAll();}}@Overridepublic List<User> getUsersByPage(int page, int size) {int offset = (page - 1) * size;return userMapper.selectByPage(offset, size);}@Overridepublic long getUserCount() {return userMapper.count();}
}

5. Controller控制器

// src/main/java/com/example/usercrud/controller/UserController.java
package com.example.usercrud.controller;import com.example.usercrud.entity.User;
import com.example.usercrud.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;/*** 创建用户*/@PostMappingpublic ResponseEntity<Map<String, Object>> createUser(@RequestBody User user) {Map<String, Object> response = new HashMap<>();try {User createdUser = userService.createUser(user);if (createdUser != null) {response.put("success", true);response.put("message", "用户创建成功");response.put("data", createdUser);return ResponseEntity.ok(response);} else {response.put("success", false);response.put("message", "用户创建失败");return ResponseEntity.badRequest().body(response);}} catch (Exception e) {log.error("创建用户异常", e);response.put("success", false);response.put("message", "系统异常:" + e.getMessage());return ResponseEntity.internalServerError().body(response);}}/*** 删除用户*/@DeleteMapping("/{id}")public ResponseEntity<Map<String, Object>> deleteUser(@PathVariable Long id) {Map<String, Object> response = new HashMap<>();try {boolean deleted = userService.deleteUser(id);if (deleted) {response.put("success", true);response.put("message", "用户删除成功");return ResponseEntity.ok(response);} else {response.put("success", false);response.put("message", "用户删除失败,用户不存在");return ResponseEntity.badRequest().body(response);}} catch (Exception e) {log.error("删除用户异常", e);response.put("success", false);response.put("message", "系统异常:" + e.getMessage());return ResponseEntity.internalServerError().body(response);}}/*** 更新用户*/@PutMapping("/{id}")public ResponseEntity<Map<String, Object>> updateUser(@PathVariable Long id, @RequestBody User user) {Map<String, Object> response = new HashMap<>();try {user.setId(id);User updatedUser = userService.updateUser(user);if (updatedUser != null) {response.put("success", true);response.put("message", "用户更新成功");response.put("data", updatedUser);return ResponseEntity.ok(response);} else {response.put("success", false);response.put("message", "用户更新失败");return ResponseEntity.badRequest().body(response);}} catch (Exception e) {log.error("更新用户异常", e);response.put("success", false);response.put("message", "系统异常:" + e.getMessage());return ResponseEntity.internalServerError().body(response);}}/*** 根据ID查询用户*/@GetMapping("/{id}")public ResponseEntity<Map<String, Object>> getUserById(@PathVariable Long id) {Map<String, Object> response = new HashMap<>();try {User user = userService.getUserById(id);if (user != null) {response.put("success", true);response.put("data", user);return ResponseEntity.ok(response);} else {response.put("success", false);response.put("message", "用户不存在");return ResponseEntity.notFound().build();}} catch (Exception e) {log.error("查询用户异常", e);response.put("success", false);response.put("message", "系统异常:" + e.getMessage());return ResponseEntity.internalServerError().body(response);}}/*** 查询所有用户*/@GetMappingpublic ResponseEntity<Map<String, Object>> getAllUsers() {Map<String, Object> response = new HashMap<>();try {List<User> users = userService.getAllUsers();response.put("success", true);response.put("data", users);response.put("total", users.size());return ResponseEntity.ok(response);} catch (Exception e) {log.error("查询用户列表异常", e);response.put("success", false);response.put("message", "系统异常:" + e.getMessage());return ResponseEntity.internalServerError().body(response);}}/*** 分页查询用户*/@GetMapping("/page")public ResponseEntity<Map<String, Object>> getUsersByPage(@RequestParam(defaultValue = "1") int page,@RequestParam(defaultValue = "10") int size) {Map<String, Object> response = new HashMap<>();try {List<User> users = userService.getUsersByPage(page, size);long total = userService.getUserCount();response.put("success", true);response.put("data", users);response.put("page", page);response.put("size", size);response.put("total", total);response.put("totalPages", (total + size - 1) / size);return ResponseEntity.ok(response);} catch (Exception e) {log.error("分页查询用户异常", e);response.put("success", false);response.put("message", "系统异常:" + e.getMessage());return ResponseEntity.internalServerError().body(response);}}
}

6. 主启动类

// src/main/java/com/example/usercrud/UserCrudApplication.java
package com.example.usercrud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class UserCrudApplication {public static void main(String[] args) {SpringApplication.run(UserCrudApplication.class, args);}
}

7. Redis配置类

// src/main/java/com/example/usercrud/config/RedisConfig.java
package com.example.usercrud.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// JSON序列化配置Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// String序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}@Beanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {return new StringRedisTemplate(connectionFactory);}@Beanpublic ObjectMapper objectMapper() {return new ObjectMapper();}
}

API测试

使用Postman或IDEA HTTP Client测试

### 1. 创建用户
POST http://localhost:8080/api/users
Content-Type: application/json{"username": "testuser","email": "test@example.com","phone": "13800138000","age": 25
}### 2. 查询所有用户
GET http://localhost:8080/api/users### 3. 根据ID查询用户
GET http://localhost:8080/api/users/1### 4. 更新用户
PUT http://localhost:8080/api/users/1
Content-Type: application/json{"username": "updateduser","email": "updated@example.com","phone": "13800138001","age": 30
}### 5. 分页查询
GET http://localhost:8080/api/users/page?page=1&size=5### 6. 删除用户
DELETE http://localhost:8080/api/users/1

运行项目

  1. 确保MySQL和Redis服务已启动
  2. 修改application.yml中的数据库密码
  3. 运行主启动类UserCrudApplication
  4. 访问 http://localhost:8080/api/users 测试接口

功能特点

  • ✅ 完整的CRUD操作
  • ✅ MyBatis XML配置
  • ✅ Redis缓存集成
  • ✅ 统一返回格式
  • ✅ 异常处理
  • ✅ 分页查询
  • ✅ 日志记录

学习要点

  1. Spring Boot自动配置:理解starter的作用
  2. MyBatis映射:XML配置与注解的使用
  3. Redis缓存策略:缓存更新和失效机制
  4. RESTful API设计:HTTP方法的正确使用
  5. 异常处理:统一的错误处理机制

这个项目提供了一个完整的单表CRUD服务示例,适合初学者学习和实践。

我来为你提供一个完整的Spring Boot整合MyBatis、MySQL、Redis开发单表CRUD服务的教程。我为你创建了一个完整的Spring Boot整合MyBatis、MySQL、Redis开发单表CRUD服务的教程。这个教程特别适合初学者,包含了:

主要内容:

  1. 环境准备 - Redis安装指导(Windows版本)

  2. 项目配置 - 完整的Maven依赖和配置文件

  3. 数据库设计 - 用户表结构和测试数据

  4. 完整代码实现

    • 实体类(User)
    • Mapper接口和XML映射
    • Service服务层(集成Redis缓存)
    • Controller控制器(RESTful API)
    • 配置类

核心功能:

  • 完整CRUD操作:创建、读取、更新、删除
  • Redis缓存:自动缓存用户数据,提高查询性能
  • 分页查询:支持分页获取用户列表
  • 异常处理:统一的错误处理机制
  • RESTful API:符合REST规范的接口设计

学习要点:

  1. MyBatis集成:XML配置方式,适合复杂SQL
  2. Redis缓存策略:查询缓存、更新时清除缓存
  3. Spring Boot自动配置:理解starter依赖的便利性
  4. 分层架构:Controller → Service → Mapper的标准结构

快速开始:

  1. 按教程安装Redis
  2. 创建MySQL数据库和表
  3. 修改application.yml中的数据库密码
  4. 复制代码到对应目录
  5. 运行项目,使用Postman测试API

这个项目提供了企业级开发的基础框架,你可以在此基础上扩展更多功能。有什么问题随时问我!

我来为你提供一个完整的Spring Boot整合MyBatis、MySQL、Redis开发单表CRUD服务的教程。我为你创建了一个完整的Spring Boot整合MyBatis、MySQL、Redis开发单表CRUD服务的教程。这个教程特别适合初学者,包含了:

主要内容:

  1. 环境准备 - Redis安装指导(Windows版本)

  2. 项目配置 - 完整的Maven依赖和配置文件

  3. 数据库设计 - 用户表结构和测试数据

  4. 完整代码实现

    • 实体类(User)
    • Mapper接口和XML映射
    • Service服务层(集成Redis缓存)
    • Controller控制器(RESTful API)
    • 配置类

核心功能:

  • 完整CRUD操作:创建、读取、更新、删除
  • Redis缓存:自动缓存用户数据,提高查询性能
  • 分页查询:支持分页获取用户列表
  • 异常处理:统一的错误处理机制
  • RESTful API:符合REST规范的接口设计

学习要点:

  1. MyBatis集成:XML配置方式,适合复杂SQL
  2. Redis缓存策略:查询缓存、更新时清除缓存
  3. Spring Boot自动配置:理解starter依赖的便利性
  4. 分层架构:Controller → Service → Mapper的标准结构

快速开始:

  1. 按教程安装Redis
  2. 创建MySQL数据库和表
  3. 修改application.yml中的数据库密码
  4. 复制代码到对应目录
  5. 运行项目,使用Postman测试API

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

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

相关文章

linux学习第30天(线程同步和锁)

线程同步协同步调&#xff0c;对公共区域数据按序访问。防止数据混乱&#xff0c;产生与时间有关的错误。数据混乱的原因资源共享(独享资源则不会)调度随机(意味着数据访问会出现竞争)线程间缺乏必要同步机制锁的使用建议锁&#xff01;对公共数据进行保护。所有线程【应该】在…

JavaScript中的系统对话框:alert、confirm、prompt

JavaScript中的系统对话框&#xff1a;alert、confirm、prompt 在Web开发的世界里&#xff0c;JavaScript始终扮演着“桥梁”的角色——它连接用户与网页&#xff0c;让静态的页面焕发活力。而在这座桥梁上&#xff0c;系统对话框&#xff08;System Dialogs&#xff09;是最基…

圆幂定理深度探究——奥数专题讲义

圆幂定理深度探究——奥数专题讲义 开篇语&#xff1a;几何中的"隐藏等式" 在平面几何的星空中&#xff0c;圆与直线的交点仿佛散落的珍珠&#xff0c;而连接这些珍珠的线段之间&#xff0c;藏着一组令人惊叹的等量关系。当我们用直尺测量、用逻辑推导时&#xff0c;…

一文看懂显示接口:HDMI / DP / VGA / USB-C 有什么区别?怎么选?

刚买的新显示器&#xff0c;插上线却发现画面糊成马赛克&#xff1f;游戏打到关键时刻突然黑屏&#xff1f;4K电影看着看着就卡顿&#xff1f;别急&#xff01;这些问题很可能都是"接口没选对"惹的祸&#xff01;今天我们就来彻底搞懂HDMI、DP、VGA、USB-C这些常见的…

【ARM嵌入式汇编基础】- 操作系统基础(二)

操作系统基础(二) 文章目录 操作系统基础(二)6、线程7、进程内存管理8、内存页9、内存保护10、匿名内存和内存映射内存11、内存映射文件和模块6、线程 程序首次启动时,会创建一个新进程,并为该程序分配一个线程。该初始线程负责初始化进程并最终调用程序中的主函数。多线…

C#调用Matlab生成的DLL

C#调用Matlab生成的DLL 1.Matlab生成DLL文件1.1准备脚本文件1.2.输出DLL文件2.Winform项目中调用DLL2.1.创建Winform项目2.2.添加引用2.3.调用DLL2.3.1. 方法12.3.2. 方法22.4.配置CPU3.运行测试4.缺点1.Matlab生成DLL文件 1.1准备脚本文件 在Matlab环境下创建脚本文件calcul…

Julia爬取数据能力及应用场景

Julia 是一种高性能编程语言&#xff0c;特别适合数值计算和数据分析。然而&#xff0c;关于数据爬取&#xff08;即网络爬虫&#xff09;方面&#xff0c;我们需要明确以下几点&#xff1a;虽然它是一门通用编程语言&#xff0c;但它的强项不在于网络爬取&#xff08;Web Scra…

Java03 二维数组|方法

一、声明数组和初始化&#xff08;掌握&#xff09;数据类型[] 数组名 ; 数据类型 数组名[] ;静态初始化数据类型[] 数组名 {元素1,元素2,元素3};动态初始化数据类型[] 数组名 new 数据类型[5]; 数组名[0] 元素1;二、数组的内存结构&#xff08;掌握&#xff09;package…

1. JVM介绍和运行流程

1. jvm是什么JVM&#xff08;Java Virtual Machine&#xff09;是 Java 程序的运行环境&#xff0c;它是 Java 技术的核心组成部分&#xff0c;负责执行编译后的 Java 字节码&#xff08;.class文件&#xff09;。jvm 说白了就是虚拟机&#xff0c;一个专门运行java字节码文件的…

Spring Cloud Gateway 的路由和断言是什么关系?

1. 基本概念 路由是 Spring Cloud Gateway 的基本组成单元。它定义了从客户端接收到的请求应该被转发到哪个目标服务。一个完整的路由通常包含以下几个要素&#xff1a; ID (id)&#xff1a;路由的唯一标识符。目标 URI (uri)&#xff1a;请求最终要被转发到的后端服务地址。断…

线程属性设置全攻略

目录 一、线程属性的概念 二、线程属性的核心函数 1. 初始化与销毁线程属性对象 2. 常用属性设置函数 三、线程属性的设置示例 1. 设置线程为分离状态 2. 设置线程栈大小 3. 设置线程调度策略和优先级 四、线程属性的关键注意事项 1. 分离状态&#xff08;Detached S…

苍穹外卖-day06

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 学习目标 能够使用HttpClient发送HTTP请求并解析响应结果 了解微信小程序开发过程 掌握微信登录的流程并实现功能代码 了解商品浏览功能需求 功能实现&#xff1a;微信登录、商品浏览 1. H…

安卓定制功能

未解决的定制功能 1.创建自定义分区 2.通过服务启动应用进程 3.应用白名单 4.网络白名单 5.应用锁 6.默认launcher 7.多主页动态切换 8.禁止状态栏下拉/锁屏页面禁止下拉状态栏&#xff08;两种一起&#xff09; 9.导航栏动态打开关闭 10.固件默认是手势还是导航栏 11.状态栏动…

【项目】GraphRAG基于知识图谱的检索增强技术-实战入门

GraphRAG—基于知识图谱的检索增强技术&#xff08;一&#xff09;GraphRAG入门介绍&#xff08;二&#xff09;GraphRAG基本原理回顾&#xff08;三&#xff09;GraphRAG运行流程3.1 索引&#xff08;Indexing&#xff09;过程3.2 查询&#xff08;Query&#xff09;过程3.3 P…

Zookeeper添加SASL安全认证 修复方案

#作者&#xff1a;任少近 文章目录1修复背景2 修复方案说明3 配置流程3.1停止zookeeper服务3.2Zookeeper添加SASL参数3.3配置jaas密码文件3.4 添加启动参数3.5启动zookeeper服务3.6访问测试4 Kafka连接zookeeper服务端配置4.1未配置身份认证4.2停止kafka服务4.3配置身份认证4.4…

AI进化论07:第二次AI寒冬——AI“改头换面”,从“AI”变成“机器学习”

书接上回&#xff0c;上回咱们聊了神经网络在第一次寒冬中的“蛰伏”与“萌动”。但别高兴太早&#xff0c;AI很快就迎来了它的第二次“寒冬”&#xff08;大概从20世纪80年代末到90年代中期&#xff09;。这次寒冬啊&#xff0c;比第一次还“冷”&#xff0c;还“漫长”。AI这…

基于开源AI智能名片链动2+1模式与S2B2C商城小程序的渠道选择策略研究

摘要&#xff1a;在数字化商业环境下&#xff0c;品牌与产品的渠道选择对其市场推广和运营成功至关重要。本文聚焦于如何依据自身品牌和产品特性&#xff0c;结合开源AI智能名片链动21模式与S2B2C商城小程序&#xff0c;运用科学的渠道选择方法&#xff0c;慎重挑选1 - 2个适宜…

开源 C# .net mvc 开发(八)IIS Express轻量化Web服务器的配置和使用

文章的目的为了记录.net mvc学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发文件系统&#xff0c;临时进行学习开发&#xff0c;系统上线3年未出没有大问题。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接: 开源 C# .net mvc 开…

PostgreSQL安装及简单应用

下载地址&#xff1a;EDB: Open-Source, Enterprise Postgres Database Management 安装 注意&#xff1a;端口号默认是5432 配置dbeaver应用&#xff0c;创建数据库和表 -- 创建模式&#xff08;如果不存在&#xff09; CREATE SCHEMA IF NOT EXISTS bbbase;-- 创建序列&…

wedo智能车库-----第31节(免费分享图纸)

夸克网盘&#xff1a;https://pan.quark.cn/s/10302f7bbae0 高清图纸源文件&#xff0c;需要的请自取