Spring Boot SQL數據庫功能詳解

Spring Boot自動配置與數據源管理

數據源自動配置機制

當在Spring Boot項目中添加數據庫驅動依賴(如org.postgresql:postgresql)后,應用啟動時自動配置系統會嘗試創建DataSource實現。開發者只需提供基礎連接信息:

  • 數據庫URL格式:jdbc:<引擎>://<服務器>:<端口>/<數據庫>[/|?<附加參數>]
  • 數據庫用戶名和密碼
  • 數據庫驅動類名(可選)
// 典型配置示例(application.properties)
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=admin
spring.datasource.password=secret

若未顯式配置這些參數,Spring Boot會根據classpath中的驅動自動配置嵌入式數據庫(如H2)。

連接池管理策略

Spring Boot默認采用以下連接池選擇邏輯:

  1. 優先使用HikariCP(當檢測到spring-boot-starter-jdbcspring-boot-starter-data-jpa依賴時)
  2. 其次嘗試Tomcat JDBC連接池
  3. 最后使用Commons DBCP2

開發者可通過配置切換連接池實現:

# 使用Tomcat連接池
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

應用服務器集成

在Tomcat、WebSphere等應用服務器部署時,可通過JNDI獲取數據源:

# JNDI配置示例
spring.datasource.jndi-name=java:comp/env/jdbc/MyDataSource

嵌入式數據庫支持

當未顯式配置數據源時,Spring Boot自動激活嵌入式數據庫支持:

  • 自動檢測H2、HSQL、Derby等嵌入式數據庫
  • 默認執行schema.sqldata.sql初始化腳本
  • 提供H2控制臺訪問(開發環境)
# H2控制臺配置
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

多數據源配置策略

當存在多個數據庫驅動時,配置優先級規則:

  1. 顯式配置的參數具有最高優先級
  2. 根據spring.datasource.*屬性動態選擇
  3. 默認使用第一個檢測到的嵌入式數據庫
# 多數據源場景下的顯式指定
spring.datasource.driver-class-name=org.postgresql.Driver

Docker Compose集成

Spring Boot 3.1+新增對Docker Compose的原生支持:

  • 自動讀取docker-compose.yaml文件
  • 根據服務類型配置對應數據源
  • 僅開發環境生效(developmentOnly作用域)
// build.gradle配置
dependencies {developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}

這種機制顯著簡化了開發環境的數據庫配置流程,實現基礎設施即代碼的實踐。

Spring框架數據訪問核心功能

事務管理抽象層

Spring提供完整的事務管理抽象,支持以下關鍵特性:

  • 統一編程模型:跨JTA、JDBC、Hibernate和JPA等不同API保持一致的編程方式
  • 聲明式事務:通過@Transactional注解實現基于AOP的事務控制
  • 隔離級別配置:支持READ_UNCOMMITTED到SERIALIZABLE各級別配置
  • 與數據訪問層深度集成:完美配合Spring的DAO抽象層
// 聲明式事務示例
@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferMoney(Account from, Account to, BigDecimal amount) {accountRepository.debit(from, amount);accountRepository.credit(to, amount);
}

DAO支持機制

Spring的DAO抽象提供以下核心價值:

  • 技術無關的訪問方式:統一JDBC、Hibernate和JPA的操作接口
  • 異常轉換系統:將技術特定異常(如SQLException)轉換為Spring的DataAccessException體系
  • @Repository注解:標記DAO組件并啟用異常轉換
@Repository
public class UserRepository implements SimpleRepository {private final JdbcTemplate jdbcTemplate;@Override@Transactionalpublic User save(User user) {// 數據庫操作代碼}
}

JDBC增強支持

Spring JDBC顯著簡化傳統JDBC操作:

JdbcTemplate核心功能
  • 自動處理連接生命周期
  • 異常處理和類型轉換
  • 批處理操作支持
  • 命名參數支持(NamedParameterJdbcTemplate)
public class ProductRepository {private final JdbcTemplate jdbc;public List findByCategory(String category) {return jdbc.query("SELECT * FROM products WHERE category = ?",new BeanPropertyRowMapper<>(Product.class),category);}
}
嵌入式數據庫支持

自動初始化H2、HSQL等嵌入式數據庫:

# 初始化配置
spring.sql.init.mode=always
spring.sql.init.platform=h2
spring.datasource.generate-unique-name=false

配套SQL腳本示例(schema.sql):

CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,price DECIMAL(10,2) CHECK (price > 0)
);

R2DBC響應式支持

對于響應式編程場景,Spring提供R2DBC集成:

@Repository
public class ReactiveUserRepository {private final DatabaseClient databaseClient;public Flux findAll() {return databaseClient.sql("SELECT * FROM users").map(row -> new User(row.get("id", Integer.class),row.get("name", String.class))).all();}
}

關鍵組件包括:

  • DatabaseClient:響應式操作入口
  • ConnectionFactory:連接工廠抽象
  • 響應式事務管理

ORM集成支持

Spring對主流ORM框架提供深度集成:

JPA/Hibernate支持
@Entity
public class Employee {@Id @GeneratedValueprivate Long id;private String name;@ManyToOneprivate Department department;
}@Repository
public interface EmployeeRepository extends JpaRepository {List findByDepartmentName(String deptName);
}
對象-XML映射

支持JAXB和Spring OXM進行對象與XML轉換:

@Bean
Marshaller jaxbMarshaller() {Jaxb2Marshaller marshaller = new Jaxb2Marshaller();marshaller.setPackagesToScan("com.example.model");return marshaller;
}

最佳實踐建議

  1. 連接池配置:生產環境務必調整連接池參數

    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.connection-timeout=30000
    
  2. 事務邊界:服務層應作為事務邊界,而非DAO層

  3. 異常處理:統一使用Spring的異常體系,避免捕獲特定技術異常

  4. 測試策略:利用嵌入式數據庫進行集成測試

    @DataJdbcTest
    class UserRepositoryTests {@Autowiredprivate UserRepository repository;@Testvoid shouldSaveUser() {User saved = repository.save(new User("test"));assertThat(saved.getId()).isNotNull();}
    }
    

這套數據訪問抽象使開發者能夠基于統一的編程模型構建企業級應用,同時保持對各底層技術的完整控制力。Spring Boot在此基礎上通過自動配置和默認設置進一步簡化了開發流程。

用戶應用JDBC實戰

項目結構改造

build.gradle中添加關鍵依賴:

dependencies {implementation 'org.springframework.boot:spring-boot-starter-jdbc'runtimeOnly 'com.h2database:h2'runtimeOnly 'org.postgresql:postgresql'
}

這種配置允許應用在開發時使用H2內存數據庫,生產環境切換至PostgreSQL。Spring Boot會根據classpath中的驅動自動選擇數據源實現。

記錄類型應用

采用Java 14的Record特性定義不可變用戶模型:

@Builder
public record User(Integer id,String email,String name,String password,boolean active,String gravatarUrl,@Singular("role") List userRole
) {// 緊湊構造函數包含驗證邏輯public User {Objects.requireNonNull(email);Pattern.compile("^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$").matcher(email).matches();// 密碼強度驗證...}
}

相比Lombok的@Data注解,Record類型提供:

  • 自動生成的equals()/hashCode()/toString()
  • 不可變特性保證線程安全
  • 緊湊構造函數實現驗證邏輯

行映射實現

通過RowMapper接口實現結果集到對象的轉換:

public class UserRowMapper implements RowMapper {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {Array array = rs.getArray("user_role");String[] roles = (String[])array.getArray();return User.builder().id(rs.getInt("id")).email(rs.getString("email")).name(rs.getString("name")).password(rs.getString("password")).userRole(Arrays.stream(roles).map(UserRole::valueOf).collect(Collectors.toList())).build();}
}

該實現處理了PostgreSQL數組類型到Java集合的轉換。

JdbcTemplate操作

倉庫類中封裝核心CRUD操作:

@Repository
public class UserRepository implements SimpleRepository {private final JdbcTemplate jdbcTemplate;public User save(User user) {KeyHolder keyHolder = new GeneratedKeyHolder();jdbcTemplate.update(conn -> {PreparedStatement ps = conn.prepareStatement("INSERT INTO users (...) VALUES (...)",Statement.RETURN_GENERATED_KEYS);// 參數綁定...return ps;}, keyHolder);return user.withId(keyHolder.getKey().intValue());}public Optional findById(Integer id) {return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",new UserRowMapper(),id));}
}

關鍵操作模式:

  • update():執行DML語句并處理生成鍵
  • queryForObject():精確查詢單條記錄
  • query():處理結果集的多行映射

數據庫初始化

通過schema.sql定義表結構:

CREATE TABLE USERS(ID           SERIAL PRIMARY KEY,EMAIL        VARCHAR(255) UNIQUE NOT NULL,USER_ROLE    VARCHAR(5)[] NOT NULL DEFAULT ARRAY['INFO']
);

Spring Boot自動執行該腳本,支持多數據庫方言版本:

  • schema-h2.sql:H2專用語法
  • schema-postgresql.sql:PostgreSQL專用語法

測試驗證

集成測試驗證持久層功能:

@SpringBootTest
class UserRepositoryTest {@Autowired UserRepository repository;@Testvoid shouldSaveAndRetrieveUser() {User saved = repository.save(testUser);assertThat(repository.findById(saved.id())).isPresent().get().extracting(User::email).isEqualTo("test@example.com");}
}

測試時自動使用H2內存數據庫,無需外部依賴。

數據庫初始化與測試策略

SQL腳本自動執行機制

Spring Boot通過特定命名的SQL文件實現數據庫結構初始化,需遵循以下規則:

  • schema.sql:包含DDL語句(CREATE/DROP等)
  • data.sql:包含DML語句(INSERT/UPDATE等)
  • 多數據庫支持:schema-{platform}.sql(如schema-h2.sql
/* schema-postgresql.sql示例 */
CREATE TABLE USERS(ID           SERIAL PRIMARY KEY,EMAIL        VARCHAR(255) UNIQUE NOT NULL,USER_ROLE    VARCHAR[] NOT NULL
);

初始化行為通過以下屬性控制:

# 強制初始化(生產環境慎用)
spring.sql.init.mode=always
# 指定數據庫平臺
spring.sql.init.platform=postgresql

多環境數據庫適配

針對不同數據庫引擎的差異化處理:

H2內存數據庫配置
# 啟用H2控制臺
spring.h2.console.enabled=true
# 固定數據庫名稱
spring.datasource.name=test-db
spring.datasource.generate-unique-name=false
PostgreSQL生產配置
# 連接參數
spring.datasource.url=jdbc:postgresql://localhost:5432/test-db
spring.datasource.username=postgres
spring.datasource.password=postgres
# 驅動顯式指定
spring.datasource.driver-class-name=org.postgresql.Driver

測試環境策略

單元測試采用H2內存數據庫實現自動化測試:

測試類示例
@SpringBootTest
class UsersHttpRequestTests {@Autowired TestRestTemplate restTemplate;@Testvoid shouldReturnUserCollection() {Collection users = restTemplate.getForObject("/users", Collection.class);assertThat(users).hasSizeGreaterThan(1);}
}
測試配置特點
  • 自動檢測classpath中的H2驅動
  • 無需顯式配置連接參數
  • 每次測試獨立數據庫實例

Docker Compose集成

Spring Boot 3.1+提供開發時自動啟動數據庫服務的能力:

compose文件定義
services:postgres:image: postgresenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: test-dbports:- 5432:5432
依賴配置
dependencies {developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}

運行時自動執行:

  1. 解析docker-compose.yaml
  2. 啟動PostgreSQL容器
  3. 根據服務類型配置DataSource

初始化流程對比

場景行為模式典型應用環境
嵌入式數據庫自動執行schema.sql/data.sql開發/測試
外部數據庫+init模式強制初始化腳本執行預生產環境
Docker Compose容器啟動后執行平臺特定SQL腳本本地開發

關鍵注意事項:

  1. 生產環境應禁用自動初始化(spring.sql.init.mode=never
  2. 多數據源場景需手動管理初始化順序
  3. 腳本中的方言語法需與目標數據庫匹配

MyRetro看板應用進階

復雜關系映射實現

在MyRetro應用中,RetroBoard與Card形成一對多關系,通過JDBC實現時需要特殊處理:

// RetroBoard實體類定義
@Builder
@Data
public class RetroBoard {private UUID id;private String name;private Map cards = new HashMap<>();
}// 數據庫表結構SQL
CREATE TABLE RETRO_BOARD(ID UUID PRIMARY KEY,NAME VARCHAR(255)
);
CREATE TABLE CARD(ID UUID PRIMARY KEY,CARD_TYPE VARCHAR(5),COMMENT VARCHAR(255),RETRO_BOARD_ID UUID REFERENCES RETRO_BOARD(ID)
);

UUID主鍵策略

PostgreSQL通過uuid-ossp擴展實現UUID生成:

-- 啟用UUID擴展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";-- DDL中使用UUID生成
CREATE TABLE RETRO_BOARD(ID UUID DEFAULT uuid_generate_v4() PRIMARY KEY
);

Java層與數據庫的UUID轉換處理:

// RowMapper中的UUID處理
public RetroBoard mapRow(ResultSet rs, int rowNum) throws SQLException {RetroBoard board = new RetroBoard();board.setId(UUID.fromString(rs.getString("id")));// 其他字段處理...
}

事務管理實踐

多表操作通過@Transactional保證原子性:

@Repository
public class RetroBoardRepository {@Transactionalpublic RetroBoard save(RetroBoard board) {// 保存主表jdbcTemplate.update("INSERT INTO RETRO_BOARD..."); // 保存關聯卡片board.getCards().values().forEach(card -> {jdbcTemplate.update("INSERT INTO CARD...");});return board;}@Transactionalpublic void deleteById(UUID id) {// 先刪除子表記錄jdbcTemplate.update("DELETE FROM CARD...");// 再刪除主表記錄jdbcTemplate.update("DELETE FROM RETRO_BOARD...");}
}

Docker Compose開發集成

Spring Boot 3.1+的Docker Compose自動配置:

  1. compose文件定義
services:postgres:image: postgres:latestenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: test-dbports:- "5432:5432"
  1. Gradle依賴
dependencies {developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}
  1. 自動行為
  • 應用啟動時自動執行docker compose up
  • 根據服務類型配置DataSource
  • 開發結束后自動清理容器(默認行為)

復雜查詢處理

關聯查詢結果的行映射技巧:

public class RetroBoardRowMapper implements RowMapper {@Overridepublic RetroBoard mapRow(ResultSet rs, int rowNum) throws SQLException {RetroBoard board = new RetroBoard();board.setId(UUID.fromString(rs.getString("id")));Map cards = new HashMap<>();do {Card card = new Card();card.setId(UUID.fromString(rs.getString("card_id")));// 其他字段填充...cards.put(card.getId(), card);} while (rs.next() && board.getId().equals(UUID.fromString(rs.getString("id"))));board.setCards(cards);return board;}
}

性能優化要點

  1. 批量操作
jdbcTemplate.batchUpdate("INSERT INTO CARD(ID, CARD_TYPE, COMMENT) VALUES (?,?,?)",new BatchPreparedStatementSetter() {// 實現批量參數設置}
);
  1. 連接池配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
  1. 索引優化
CREATE INDEX idx_card_retro_board_id ON CARD(RETRO_BOARD_ID);

Spring Boot數據訪問核心架構解析

自動配置機制深度剖析

Spring Boot的數據訪問自動配置建立在條件化裝配基礎上,通過DataSourceAutoConfigurationJdbcTemplateAutoConfiguration等自動配置類實現智能裝配。核心裝配邏輯包括:

  1. 數據源檢測:掃描classpath中的數據庫驅動

    • JDBC驅動存在時自動配置DataSource
    • 無顯式配置時激活嵌入式數據庫
  2. 連接池選擇:按以下順序嘗試初始化

    // 連接池選擇算法
    if(HikariCP可用) return new HikariDataSource();
    else if(TomcatCP可用) return new TomcatDataSource();
    else if(DBCP2可用) return new BasicDataSource();
    
  3. JNDI回退:當檢測到應用服務器環境時

    spring.datasource.jndi-name=java:comp/env/jdbc/MyDS
    

多數據源處理策略

企業級應用常需訪問多個數據源,Spring Boot通過抽象提供優雅解決方案:

@Configuration
public class MultiDataSourceConfig {@Bean@Primary@ConfigurationProperties("app.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties("app.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}
}

配套屬性配置:

# 主數據源
app.datasource.primary.url=jdbc:mysql://localhost:3306/primary
app.datasource.primary.username=admin# 次要數據源
app.datasource.secondary.url=jdbc:postgresql://localhost:5432/secondary
app.datasource.secondary.driver-class-name=org.postgresql.Driver

事務管理最佳實踐

Spring的聲明式事務管理通過AOP實現,關鍵配置維度包括:

  1. 傳播行為

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void processPayment() {// 始終開啟新事務
    }
    
  2. 隔離級別

    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void auditOperation() {// 最高隔離級別
    }
    
  3. 超時控制

    @Transactional(timeout = 30) // 30秒超時
    public void batchImport() {// 批量操作
    }
    

性能優化關鍵點

  1. 連接池調優參數

    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.minimum-idle=5
    spring.datasource.hikari.idle-timeout=30000
    
  2. JdbcTemplate批量操作

    jdbcTemplate.batchUpdate("INSERT INTO users (name) VALUES (?)",new BatchPreparedStatementSetter() {public void setValues(PreparedStatement ps, int i) {ps.setString(1, names.get(i));}public int getBatchSize() {return names.size();}}
    );
    
  3. SQL日志監控

    logging.level.org.springframework.jdbc=DEBUG
    logging.level.org.springframework.transaction=TRACE
    

安全加固方案

  1. 密碼加密存儲

    @Bean
    public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
    }
    
  2. SQL注入防護

    • 始終使用參數化查詢
    // 錯誤示范
    jdbcTemplate.query("SELECT * FROM users WHERE name = '"+name+"'");// 正確做法
    jdbcTemplate.query("SELECT * FROM users WHERE name = ?", name);
    
  3. 連接加密

    spring.datasource.url=jdbc:postgresql://localhost/test?ssl=true
    spring.datasource.hikari.data-source-properties.sslMode=REQUIRE
    

監控與健康檢查

Spring Actuator提供數據源健康指標:

management.endpoint.health.show-details=always

自定義健康檢查:

@Component
public class DatabaseHealthIndicator implements HealthIndicator {private final JdbcTemplate jdbcTemplate;public Health health() {try {jdbcTemplate.queryForObject("SELECT 1", Integer.class);return Health.up().build();} catch(Exception e) {return Health.down().withDetail("error", e.getMessage()).build();}}
}

跨數據庫兼容方案

  1. 方言抽象層

    @Bean
    public Dialect databaseDialect(DataSource dataSource) {String productName = dataSource.getConnection().getMetaData().getDatabaseProductName();return switch(productName) {case "PostgreSQL" -> new PostgreSQLDialect();case "MySQL" -> new MySQLDialect();default -> new StandardDialect();};
    }
    
  2. 條件化SQL腳本

    /* schema.sql */
    CREATE TABLE IF NOT EXISTS users (id ${auto_increment_type} PRIMARY KEY
    );
    
  3. 測試容器集成

    @Testcontainers
    @SpringBootTest
    class IntegrationTest {@Containerstatic PostgreSQLContainer postgres = new PostgreSQLContainer<>();@DynamicPropertySourcestatic void configure(DynamicPropertyRegistry registry) {registry.add("spring.datasource.url", postgres::getJdbcUrl);}
    }
    

這套架構設計使Spring Boot應用能夠適應從嵌入式開發環境到分布式生產集群的各種部署場景,同時保持優異的性能表現和可維護性。開發者可根據實際需求靈活組合這些功能模塊,構建符合企業標準的數據訪問層。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86704.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java每日精進 6.11【消息隊列】

1.內存級Spring_Event 1.1 控制器層&#xff1a;StringTextController /*** 字符串文本管理控制器* 提供通過消息隊列異步獲取文本信息的接口*/ RestController RequestMapping("/api/string-text") public class StringTextController {Resourceprivate StringTex…

【凌智視覺模塊】rv1106 部署 ppocrv4 檢測模型 rknn 推理

PP-OCRv4 文本框檢測 1. 模型介紹 如有需要可以前往我們的倉庫進行查看 凌智視覺模塊 PP-OCRv4在PP-OCRv3的基礎上進一步升級。整體的框架圖保持了與PP-OCRv3相同的pipeline&#xff0c;針對檢測模型和識別模型進行了數據、網絡結構、訓練策略等多個模塊的優化。 從算法改…

uniapp Vue2 獲取電量的獨家方法:繞過官方插件限制

在使用 uniapp 進行跨平臺應用開發時&#xff0c;獲取設備電量信息是一個常見的需求。然而&#xff0c;uniapp 官方提供的uni.getBatteryInfo方法存在一定的局限性&#xff0c;它不僅需要下載插件&#xff0c;而且目前僅支持 Vue3&#xff0c;這讓使用 Vue2 進行開發的開發者陷…

Go語言中的if else控制語句

if else是Go語言中最基礎也最常用的條件控制語句&#xff0c;用于根據條件執行不同的代碼塊。下面我將詳細介紹Go語言中if else的各種用法和特性。 1. 基本語法 1.1. 最簡單的if語句 if 條件表達式 {// 條件為true時執行的代碼 } 示例&#xff1a; if x > 10 {fmt.Prin…

[Spring]-AOP

AOP場景 AOP: Aspect Oriented Programming (面向切面編程) OOP: Object Oriented Programming (面向對象編程) 場景設計 設計: 編寫一個計算器接口和實現類&#xff0c;提供加減乘除四則運算 需求: 在加減乘除運算的時候需要記錄操作日志(運算前參數、運算后結果)實現方案:…

Web3 借貸與清算機制全解析:鏈上金融的運行邏輯

Web3 借貸與清算機制全解析&#xff1a;鏈上金融的運行邏輯 超額抵押借款 例如&#xff0c;借款人用ETH為抵押借入DAI&#xff1b;借款人的ETH的價值一定是要超過DAI的價值&#xff1b;借款人可以任意自由的使用自己借出的DAI 穩定幣 第一步&#xff1a;借款人需要去提供一定…

RK3588開發筆記-GNSS-RTK模塊調試

目錄 前言 一、什么是GNSS/RTK 二、硬件連接 三、內核配置 四、模塊調試 五、ntripclient使用 總結 前言 在RK3588平臺上集成高精度定位功能是許多工業級應用的需求。本文記錄了我調試GNSS-RTK模塊的全過程,包含硬件連接、驅動移植、數據解析和精度優化等關鍵環節,希望對…

Vue.js $emit的介紹和簡單使用

前言 在 Vue.js 開發中&#xff0c;組件化是核心思想之一。但組件間的通信是一個重要課題&#xff0c;特別是子組件向父組件傳遞數據的場景。Vue 提供了多種通信方式&#xff0c;而$emit正是實現子→父通信的關鍵方法。本文將深入解析$emit的原理、使用場景及最佳實踐。 一、$e…

【Linux 學習計劃】-- 簡易版shell編寫

目錄 思路 創建自己的命令行 獲取用戶命令 分割命令 檢查是否是內建命令 cd命令實現 進程程序替換執行程序 總代碼 結語 思路 int main() {while (1){// 1. 自己的命令行PrintCommandLine();// 2. 獲取用戶命令char command[SIZE];int n GetUserCommand(command, si…

一個完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (二)

&#x1f4c4; 本地 Windows 部署 Logstash 連接本地 Elasticsearch 指南 ? 目標 在本地 Windows 上安裝并運行 Logstash配置 Logstash 將數據發送至本地 Elasticsearch測試數據采集與 ES 存儲流程 &#x1f9f0; 前提條件 軟件版本要求安裝說明Java17Oracle JDK 下載 或 O…

Java使用Selenium反爬蟲優化方案

當我們爬取大站的時候&#xff0c;就得需要對抗反爬蟲機制的場景&#xff0c;因為項目要求使用Java和Selenium。Selenium通常用于模擬用戶操作&#xff0c;但效率較低&#xff0c;所以需要我們結合其他技術來實現高效。 在 Java 中使用 Selenium 進行高效反爬蟲對抗時&#xff…

狀態管理方案對比與決策

1. 狀態管理的基本概念 現代前端應用隨著功能復雜度提升&#xff0c;狀態管理已成為架構設計的核心挑戰。狀態管理本質上解決的是數據的存儲、變更追蹤和響應式更新問題&#xff0c;以確保UI與底層數據保持同步。 核心挑戰: 狀態共享與組件通信可預測的狀態變更性能優化與重…

Fetch與Axios:區別、聯系、優缺點及使用差異

Fetch與Axios&#xff1a;區別、聯系、優缺點及使用差異 文章目錄 Fetch與Axios&#xff1a;區別、聯系、優缺點及使用差異一、聯系二、區別1. 瀏覽器支持與兼容性2. 響應處理3. 請求攔截和響應攔截4. 錯誤處理 三、優缺點1. Fetch API優點缺點 2. Axios優點缺點 四、使用上的差…

【Docker】快速入門與項目部署實戰

我們在部署一個項目時&#xff0c;會出現一系列問題比如&#xff1a; 命令太多了&#xff0c;記不住軟件安裝包名字復雜&#xff0c;不知道去哪里找安裝和部署步驟復雜&#xff0c;容易出錯 其實上述問題不僅僅是新手&#xff0c;即便是運維在安裝、部署的時候一樣會覺得麻煩…

Java面試題尚硅谷版第1季

1、寫出如下代碼運行結果 1.1、 使用局部變量表和操作數棧解題 1.2、使用前置和后置遞增解題 2、寫一個單例模式 2.1、考察知識點 2.2、單例模式實現 3、類加載和初始化順序 package classload;public class Father {private int i test();private static int j method();st…

關于Qt阻斷樣式繼承的解決辦法

引言 在使用 Qt 開發桌面應用時&#xff0c;借助樣式表&#xff08;StyleSheet&#xff09;來統一定義界面風格是非常常見的做法。通常&#xff0c;你會在主程序中通過 qApp->setStyleSheet(...) 或者直接給某個父控件設置樣式表&#xff0c;讓所有的子控件都采用相同的配色…

鼠標右鍵添加新建某種文件的方法

場景 我經常用到.emmx&#xff0c;.eddx文件&#xff0c;電腦上裝的是wpsX億圖&#xff08;因為有wps會員&#xff09;&#xff0c;沒有開億圖會員。 然后問題就是&#xff0c;思維導圖和流程圖我都能正常開&#xff0c;正常編輯&#xff0c;但鼠標右鍵沒有新建這兩個文件的按…

Inxpect安全雷達傳感器與控制器:動態檢測 + 抗干擾技術重構工業安全防護體系

Inxpect 推出工業安全領域新型智能傳感器與控制器&#xff0c;其核心產品為雷達掃描儀&#xff0c;具備動態調整檢測區域、抗干擾能力強等特點&#xff0c;可精準檢測危險區域人員進入或存在情況&#xff0c;適用于移動機器人等場景。 Inxpect安全雷達傳感器核心功能 動態檢測…

【AI學習】李廣密與階躍星辰首席科學家張祥雨對談:多模態發展的歷史和未來

仔細閱讀了文章《專訪張祥雨&#xff1a;多模態推理和自主學習是未來的 2 個 「GPT-4」 時刻》 https://mp.weixin.qq.com/s/892QuRPH9uP6zN6dS-HZMw 非常贊嘆的一篇文章&#xff0c;說清楚了NLP、CV發展中的許多重大問題&#xff0c;讀來醍醐灌頂&#xff01;這樣的文章&…

C++中std::deque詳解和實戰工程代碼示例

C中std::deque詳解和實戰工程代碼示例 std::deque&#xff08;雙端隊列&#xff09;是 C 標準庫中的一個序列容器&#xff0c;與 std::vector 類似&#xff0c;但它支持從頭部和尾部高效地插入和刪除元素。它底層采用分段連續空間實現&#xff0c;兼具靈活性與性能。 一、基本…