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
英文地址,請注明出處:http://en.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;需要的請自取