SSM(Spring+SpringMVC+MyBatis)框架集成

来源:https://www.cnblogs.com/one-xiaoqiang/archive/2023/10/01/17738624.html
-Advertisement-
Play Games

進行SSM(Spring+SpringMVC+MyBatis)集成的主要原因是為了提高開發效率和代碼可維護性。SSM是一套非常流行的Java Web開發框架,它集成了Spring框架、SpringMVC框架和MyBatis框架,各自發揮優勢,形成了一個完整的開發框架。 ...


引言

  • 進行SSM(Spring+SpringMVC+MyBatis)集成的主要原因是為了提高開發效率和代碼可維護性。SSM是一套非常流行的Java Web開發框架,它集成了Spring框架、SpringMVC框架和MyBatis框架,各自發揮優勢,形成了一個完整的開發框架。
  • 首先,使用Spring框架可以實現組件的解耦和依賴註入,通過配置文件進行Bean的管理和控制反轉(IoC),從而提供了良好的擴展性和靈活性。Spring提供了事務管理、AOP(面向切麵編程)等功能,使得開發者可以更加方便地進行業務邏輯的編寫和管理。
  • 其次,SpringMVC框架是一種基於MVC(Model-View-Controller)模式的Web框架,它通過DispatcherServlet來統一管理請求和響應。SpringMVC提供了請求處理的註解方式,可以簡化開發流程,同時具備良好的可擴展性和靈活性。開發者可以通過配置文件進行路由、參數綁定、數據校驗等操作,從而編寫出結構清晰、易於維護的代碼。
  • 最後,MyBatis是一款優秀的持久層框架,它通過XML文件或註解來實現資料庫操作的映射,具有簡單易用、性能高效等特點。MyBatis提供了豐富的CRUD(增刪改查)操作和事務管理功能,開發者可以靈活地編寫資料庫相關的代碼。

綜上所述,SSM集成可以充分發揮各個框架的優勢,提供了一種高效、靈活、易於維護的開發方式,使得Java Web開發更加方便和高效。通過SSM的集成,開發者可以快速搭建起一個穩定可靠的Web應用,並且在後續的開發和維護過程中,能夠更加方便地處理業務需求和資料庫操作。

創建資料庫表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
 
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
SET FOREIGN_KEY_CHECKS = 1;

在IEDA中創建Maven Web項目

選擇File ---> New ---> Project

選擇Maven模板

填寫項目的基本信息 ---> Next

配置自己的Maven環境 ---> Finish

修改pom.xml配置,添加Maven依賴

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring.version>5.3.6</spring.version>
  </properties>

  <dependencies>
    <!-- 添加springmvc依賴 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.18</version>
    </dependency>

    <!-- JSTL 依賴包-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
      <scope>runtime</scope>
    </dependency>

    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

    <!--數據校驗依賴包-->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.1.Final</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.16.Final</version>
    </dependency>

    <!--文件上傳依賴包-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>

    <!-- 添加jackson配置 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.11.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.11.4</version>
    </dependency>

    <!-- MyBatis依賴 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.5</version>
    </dependency>

    <!-- 資料庫驅動依賴(根據你使用的資料庫選擇) -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>

    <!-- 日誌整合 slf4j門面設計模式與 log4j或log4j2一起使用-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <!-- 日誌-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

創建IoC 容器 springmvc.xml文件

在src/main/resources文件夾下創建 springmvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--開啟SpringMVC註解驅動-->
    <mvc:annotation-driven />

    <!-- springmvc容器(也就是一個spring容器)會掃描指定包中的組件,將其註冊到springmvc容器中 -->
    <context:component-scan base-package="com.qrj"/>

    <!-- 配置允許訪問靜態資源 -->
    <mvc:default-servlet-handler />

    <!-- 配置全局 CORS -->
    <mvc:cors>
        <mvc:mapping path="/**" />
    </mvc:cors>
</beans>

創建資料庫配置文件database.properties

在src/main/resources文件夾下創建database.properties文件

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/spring_mybatis?useSSL=false
db.username=root
db.password=123456

創建Spring IoC容器spring-config.xml文件

在src/main/resources文件夾下創建spring-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://mybatis.org/schema/mybatis-spring
           http://mybatis.org/schema/mybatis-spring.xsd">

    <!-- 自動掃描註解 -->
    <context:component-scan base-package="com.qrj"/>

    <!-- 引入資料庫配置文件-->
    <context:property-placeholder location="classpath:database.properties"/>

    <!-- 配置數據源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean>

    <!-- MyBatis 掃描 mapper -->
    <mybatis:scan base-package="com.qrj.dao"/>

    <!-- 配置SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--設置entity實體類路徑-->
        <property name="typeAliasesPackage" value="com.qrj.entity" />
        <!--設置mapper映射文件路徑-->
        <property name="mapperLocations" value="classpath*:mapper/*.xml" />
    </bean>
</beans>

創建logback.xml日誌配置文件

在src/main/resources文件夾下創建logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>

    <property name="log.path" value="F:\\logback.log" />

    <!--日誌輸出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- 日誌輸出到文件 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
        </rollingPolicy>

        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- 根日誌輸出級別-->
    <root level="debug">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

    <!-- 指定包日誌輸出級別-->
    <logger name="com.qrj.util" level="info" />

</configuration>

修改web.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <!-- 配置Spring容器載入配置文件路徑 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-config.xml</param-value>
  </context-param>
  <!-- 監聽器(spring文件相關的監聽器)-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!-- contextConfigLocation 用來指定springmvc配置文件的位置,文件名稱不一定要叫springmvc,大家可以隨意起名 -->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- load-on-startup:表示web容器啟動的時,當前對象創建的順序,值越小初始化越早,大於等於0 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 設置 CharacterEncodingFilter 過濾器,這個類會對request和response設置字元集編碼,解決中文亂碼問題(優先順序最高)        -->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

創建UserEntity實體類

在src/main/java目錄下創建com.qrj.entity包,在包下麵創建UserEntity實體類。

package com.qrj.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author: qrj
 * @description 用戶實體類
 * @Date: 2023/9/19 14:51
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
    private Integer id;
    private String name;
    private Integer age;
    private String gender;
}

創建UserDto參數類

在src/main/java目錄下創建com.qrj.dto包,在包下麵創建UserDto參數類。

package com.qrj.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author: qrj
 * @description 用戶參數
 * @Date: 2023/9/19 14:52
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
    private Integer id;
    private String name;
    private Integer age;
    private String gender;
}

創建UserMapper介面

在src/main/java目錄下創建com.qrj.dao包,在包下麵創建UserMapper介面。

package com.qrj.dao;

import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;

import java.util.List;

/**
 * @author: qrj
 * @description 用戶映射介面
 * @Date: 2023/9/19 14:52
 */
public interface UserMapper {
    void insert(UserDto user);

    List<UserEntity> getList();
}

創建UserMapper.xml映射文件

註意這裡創建的UserMapper映射文件要和之前創建的UserMapper介面文件相對應。

在src/main/resources文件夾下創建mapper文件夾,併在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.qrj.dao.UserMapper">
    <insert id="insert" parameterType="com.qrj.entity.UserEntity" keyProperty="id" useGeneratedKeys="true">
        INSERT INTO USER ( name, age, gender )
            VALUE
            ( #{name}, #{age} , #{gender} )
    </insert>

    <select id="getList" resultType="com.qrj.entity.UserEntity">
        SELECT
            *
        FROM
            USER;
    </select>
</mapper>

創建ResultVo工具類

在src/main/java目錄下創建com.qrj.vo包,在包下麵創建ResultVo工具類。

 

package com.qrj.vo;

import lombok.Data;

import java.io.Serializable;

/**
 * @author: qrj
 * @description Ajax 請求統一響應工具類
 * @Date: 2023/9/19 14:58
 */
@Data
public class ResultVo<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    //狀態碼
    private int code;

    //狀態碼描述
    private String message;

    //數據結果,泛型,可以是列表、單個對象、數字、布爾值等
    private T data;

    public ResultVo() {
    }

    public ResultVo(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public static <T> ResultVo<T> success(T data) {
        ResultVo<T> resultVo = new ResultVo<>();
        resultVo.setCode(200);
        resultVo.setMessage("ok");
        resultVo.setData(data);
        return  resultVo;
    }
}

創建IUserService介面和UserServiceImpl實現類

在src/main/java目錄下創建com.qrj.service包,在包中創建IUserService介面

package com.qrj.service;

import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;

import java.util.List;

/**
 * @author: qrj
 * @description 用戶業務介面
 * @Date: 2023/9/19 14:54
 */
public interface IUserService {
    UserEntity insert(UserDto user);
    List<UserEntity> getList();
}

在com.qrj.service包下創建Impl包,並創建UserServiceImpl實現類

package com.qrj.service.Impl;

import com.qrj.dao.UserMapper;
import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;
import com.qrj.service.IUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author: qrj
 * @description 用戶業務實現類
 * @Date: 2023/9/19 14:57
 */
@Service //控制反轉
public class UserServiceImpl implements IUserService {
    @Resource //依賴註入
    private UserMapper userMapper;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public UserEntity insert(UserDto user) {
        userMapper.insert(user);
        UserEntity userEntity = new UserEntity();
        //BeanUtils用於拷貝對象 參數1:被拷貝的對象 參數2:拷貝對象
        BeanUtils.copyProperties(user,userEntity);
        return userEntity;
    }

    @Transactional
    @Override
    public List<UserEntity> getList() {
        List<UserEntity> list = userMapper.getList();
        return list;
    }
}

創建UserController頁面控制器

在src/main/java目錄下創建com.qrj.controller包,在包下麵創建UserController頁面控制器。

package com.qrj.controller;

import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;
import com.qrj.service.IUserService;
import com.qrj.vo.ResultVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author: qrj
 * @description 用戶頁面控制器
 * @Date: 2023/9/19 14:53
 */
@RestController
@Slf4j //lombok提供的日誌註解
public class UserController {
    @Resource //使用 @Autowired註解 IDEA不推薦
    private IUserService userService;

    @PostMapping("/user")
    public ResultVo<UserEntity> addUser(@RequestBody UserDto userDto) {
        log.debug(userDto.toString()); //列印調試日誌(接收參數)
        UserEntity result = userService.insert(userDto);
        log.debug(result.toString()); //列印調試日誌(響應數據)
        return ResultVo.success(result);
    }

    @GetMapping("/users")
    public ResultVo<List<UserEntity>> getUsers() {
        List<UserEntity> list = userService.getList();
        return ResultVo.success(list);
    }
}

啟動Tomcat,在Postman下進行介面測試

通過Restful API介面("/user")測試添加用戶功能實現

通過Restful API介面("/users")測試查找所有用戶功能實現

以上功能測試完成,至此SSM框架集成成功!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java 21引入了兩個語言核心功能: 未命名的Java類你說 新的啟動協議:該協議允許更簡單地運行Java類,並且無需太多樣板 下麵一起來看個例子。通常,我們初學Java的時候,都會寫類似下麵這樣的 Hello World 程式: public class HelloWorld { public ...
  • 【中秋國慶不斷更】HarmonyOS對通知類消息的管理與發佈通知(上) 一、 通知概述 通知簡介 應用可以通過通知介面發送通知消息,終端用戶可以通過通知欄查看通知內容,也可以點擊通知來打開應用。 通知常見的使用場景: ​ ● 顯示接收到的短消息、即時消息等。 ​ ● 顯示應用的推送消息,如廣告、版本 ...
  • WebSocket是一種在單個TCP連接上進行全雙工通信的協議。WebSocket使得客戶端和伺服器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,併進行雙向數據傳輸。 ...
  • @Styles和@Extend僅僅應用於靜態頁面的樣式復用,stateStyles可以依據組件的內部狀態的不同,快速設置不同樣式。這就是我們本章要介紹的內容stateStyles(又稱為:多態樣式)。 概述 stateStyles是屬性方法,可以根據UI內部狀態來設置樣式,類似於css偽類,但語法不 ...
  • Sentinel 簡介 Sentinel 是阿裡中間件團隊開源的,面向分散式服務架構的高可用流量防護組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統負載保護、熱點防護等多個維度來幫助開發者保障微服務的穩定性 Sentinel 提供了兩個服務組件: Sentinel 用來實現微服務系統中服務 ...
  • 開心一刻 昨晚,老婆輔導女兒寫作業 有一道形容媽媽的題,女兒寫下了:我媽媽像一個暴躁的老虎 老婆拿起題冊輕輕敲了下女兒,生氣到:有這麼形容你媽的嗎 女兒:你看你現在 老婆:我有那麼暴躁嗎,你就不能說我媽媽像一個公主,溫柔大方漂亮? 女兒:題目讓我造句,沒讓我造謠! 我:哈哈哈哈! 郵件發送 基於 J ...
  • 在Go語言中,結構體是核心的數據組織工具,提供了靈活的手段來處理複雜數據。本文深入探討了結構體的定義、類型、字面量表示和使用方法,旨在為讀者呈現Go結構體的全面視角。通過結構體,開發者可以實現更加模塊化、高效的代碼設計。這篇文章旨在為您提供關於結構體的深入理解,助您更好地利用Go語言的強大功能。 關 ...
  • 堆疊面積圖和麵積圖都是用於展示數據隨時間變化趨勢的統計圖表,但它們的特點有所不同。面積圖的特點在於它能夠直觀地展示數量之間的關係,而且不需要標註數據點,可以輕鬆地觀察數據的變化趨勢。而堆疊面積圖則更適合展示多個數據系列之間的變化趨勢,它們一層層的堆疊起來,每個數據系列的起始點是上一個數據系列的結束點 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...