当前位置: 首页 > article >正文

MyBatis 框架使用与 Spring 集成时的使用

MyBatis

创建项目mybatis项目,首先需要使用maven导入mybatis库

poml.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><groupId>cn.arorms</groupId><artifactId>MybatisDemo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies></project>
your-project/
├── src/main/java/
│   └── com/yourcompany/yourproject/
│       ├── config/             // 配置相关
│       │   └── MyBatisConfig.java  // Spring 配置类,用于集成 MyBatis
│       ├── dao/                // 数据访问对象 (DAO) 或 Mapper 接口
│       │   └── UserMapper.java
│       ├── entity/             // 实体类 (Entities)
│       │   └── User.java
│       ├── service/            // 业务逻辑层 (Services)
│       │   └── UserService.java
│       │   └── UserServiceImpl.java
│       ├── controller/         // 控制器 (Controllers)
│       │   └── UserController.java
│       └── App.java            // Spring Boot 启动类 (如果使用 Spring Boot)
├── src/main/resources/
│   ├── application.properties  // Spring Boot 配置文件
│   ├── mybatis-config.xml      // MyBatis 全局配置文件
│   └── mapper/               // MyBatis 映射文件
│       └── UserMapper.xml
└── pom.xml                     // Maven 项目配置文件 (如果使用 Maven)# 或 build.gradle             // Gradle 项目配置文件 (如果使用 Gradle)

编写mybatis设置

resources\mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

resources\mapper\flightMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.arorms.mapper.FlightMapper"><select id="getByFlightAll" resultType="cn.arorms.entity.FlightEntity">SELECT id,flight_id as flightId,company,departure_airport as departureAirport,arrive_airport as arrivalAirport,departure_time as departureTime,arrive_time as arrivalTime,model,is_delete as isDeleteFROM flight;</select>
</mapper>

resultMap

    <select id="getByFlightAll" resultType="cn.arorms.entity.FlightEntity">SELECT id,flight_id as flightId,company,departure_airport as departureAirport,arrive_airport as arrivalAirport,departure_time as departureTime,arrive_time as arrivalTime,model,is_delete as isDeleteFROM flight;</select>

定义数据库表中字段名称与类中成员属性名称,创建关联映射。

src\main\resources\mapper\flightMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.arorms.mapper.FlightMapper"><!-- SQL语句更改 --><resultMap id="flightEntityMap" type="cn.arorms.entity.FlightEntity"><id column="id" property="id"></id><result column="flight_id" property="flightId"></result><result column="company" property="company"></result><result column="departure_airport" property="departureAirport"></result><result column="arrive_airport" property="arrivalAirport"></result><result column="departure_time" property="departureTime"></result><result column="arrive_time" property="arrivalTime"></result><result column="model" property="model"></result><result column="is_delete" property="isDelete"></result></resultMap><!-- 创建关系映射 --><select id="getByFlightAll" resultType="cn.arorms.entity.FlightEntity">SELECT id,flight_id as flightId,company,departure_airport as departureAirport,arrive_airport as arrivalAirport,departure_time as departureTime,arrive_time as arrivalTime,model,is_delete as isDeleteFROM flight;</select><select id="getByFlightAll" resultMap="flightEntityMap">SELECT * FROM flight;</select>
</mapper>

Spring Boot Starter MyBatis

Spring Boot Starter MyBatis 是由 MyBatis 社区为 Spring Boot 提供的集成库,简化了 MyBatis 与 Spring Boot 的结合。它通过自动配置功能,减少了手动配置 SqlSessionFactory 和 Mapper 的工作,支持注解和 XML 两种方式定义 SQL。你只需要添加依赖、配置数据源和 Mapper,就能快速上手。

如果你想用注解方式替代 XML 文件来定义 SQL 操作,Spring Boot Starter MyBatis 完全支持这种方式。注解方式更简洁,适合简单的 CRUD 操作,尤其当你不想维护额外的 XML 文件时。

一、注解方式的特点

  • 使用 MyBatis 提供的注解(如 @Select@Insert@Update@Delete)直接在 Mapper 接口中定义 SQL。
  • 不需要 UserMapper.xml 文件,配置中也无需指定 mybatis.mapper-locations
  • 适合简单查询,复杂查询仍推荐 XML。

二、构建和编写过程

1. 项目依赖和配置
  • POM 文件:保持不变,前述依赖已足够。

  • application.properties

    • 删除 mybatis.mapper-locations,因为不再使用 XML。

    • 保留其他配置:

      spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
      spring.datasource.username=root
      spring.datasource.password=yourpassword
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      mybatis.type-aliases-package=com.example.demo.model
      mybatis.configuration.map-underscore-to-camel-case=true
      
2. 项目结构
  • 删除 resources/mapper/UserMapper.xml,所有 SQL 移到 Mapper 接口中。

  • 其他结构不变:

    com.example.demo
    ├── model
    │   └── User.java
    ├── mapper
    │   └── UserMapper.java
    ├── service
    │   └── UserService.java
    ├── controller
    │   └── UserController.java
    ├── DemoApplication.java
    └── resources└── application.properties
    
3. 编写代码
3.1 实体类 (User.java)

保持不变:

package com.example.demo.model;import lombok.Data;@Data
public class User {private Long id;private String name;private String email;
}
3.2 Mapper 接口 (UserMapper.java)

使用注解定义 SQL:

package com.example.demo.mapper;import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;
import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT id, name, email FROM users")List<User> findAll();@Select("SELECT id, name, email FROM users WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")  // 自增主键回填void insert(User user);@Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")void update(User user);@Delete("DELETE FROM users WHERE id = #{id}")void delete(Long id);
}
  • 注解说明
    • @Select:查询语句。
    • @Insert:插入语句,@Options 用于处理自增主键。
    • @Update:更新语句。
    • @Delete:删除语句。
    • 参数使用 #{} 绑定,字段名与实体类属性一致(驼峰映射已启用)。
3.3 服务层 (UserService.java)

不变,仍调用 Mapper 接口:

package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {private final UserMapper userMapper;public UserService(UserMapper userMapper) {this.userMapper = userMapper;}public List<User> getAllUsers() {return userMapper.findAll();}public User getUserById(Long id) {return userMapper.findById(id);}public void createUser(User user) {userMapper.insert(user);}public void updateUser(User user) {userMapper.update(user);}public void deleteUser(Long id) {userMapper.delete(id);}
}
3.4 控制器 (UserController.java)

不变,仍提供 REST API:

package com.example.demo.controller;import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMappingpublic List<User> getAll() {return userService.getAllUsers();}@GetMapping("/{id}")public User getById(@PathVariable Long id) {return userService.getUserById(id);}@PostMappingpublic void create(@RequestBody User user) {userService.createUser(user);}@PutMapping("/{id}")public void update(@PathVariable Long id, @RequestBody User user) {user.setId(id);userService.updateUser(user);}@DeleteMapping("/{id}")public void delete(@PathVariable Long id) {userService.deleteUser(id);}
}
3.5 主应用类 (DemoApplication.java)

不变,仍需扫描 Mapper:

package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

4. 运行和测试
  • 启动:运行 DemoApplication.javamvn spring-boot:run
  • 测试:与 XML 方式相同,使用 Postman:
    • GET http://localhost:8080/users
    • GET http://localhost:8080/users/1
    • POST http://localhost:8080/users{"name": "Alice", "email": "alice@example.com"}
    • PUT http://localhost:8080/users/1
    • DELETE http://localhost:8080/users/1

三、注解方式的优缺点

  • 优点
    • 代码更集中,无需维护 XML 文件。
    • 适合简单 CRUD,开发效率高。
  • 缺点
    • 复杂查询(多表联查、动态 SQL)编写困难,注解支持有限。
    • SQL 可读性不如 XML。

解决复杂查询

  • 使用 @SelectProvider 或混合 XML:

    @SelectProvider(type = UserSqlProvider.class, method = "getDynamicSql")
    List<User> findByCondition(String condition);
    
    • 但通常建议复杂逻辑仍用 XML。

你说得对,MyBatis 的注解方式在处理复杂查询(如动态 SQL、多表联查、条件分支等)时确实不如 XML 灵活,但通过 @SelectProvider(以及类似的 @InsertProvider@UpdateProvider@DeleteProvider 可以很好地解决这个问题。Provider 机制允许你在 Java 代码中动态生成 SQL,从而结合注解的简洁性和动态 SQL 的灵活性,非常适合复杂场景。

下面我会基于之前的项目,详细讲解如何使用 Provider 来处理复杂查询,并提供完整的代码示例和笔记式指导。假设我们需要实现一个动态条件查询用户(例如根据名字或邮箱模糊搜索),我会展示全过程。


一、Provider 机制简介

  • @SelectProvider 等注解允许你指定一个类和方法,由该方法动态返回 SQL 语句。
  • 优点
    • 动态生成 SQL,支持条件分支、循环等逻辑。
    • 保持注解方式,避免 XML。
  • 适用场景:复杂查询、动态条件、多表操作。

二、修改后的项目实现

1. 项目依赖和配置
  • POM 文件:无需改动,前述依赖已足够。

  • application.properties:保持不变:

    spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=yourpassword
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    mybatis.type-aliases-package=com.example.demo.model
    mybatis.configuration.map-underscore-to-camel-case=true
    
2. 项目结构

新增一个 Provider 类,其他保持不变:

com.example.demo
├── model
│   └── User.java
├── mapper
│   ├── UserMapper.java
│   └── UserSqlProvider.java  # 新增,提供动态 SQL
├── service
│   └── UserService.java
├── controller
│   └── UserController.java
├── DemoApplication.java
└── resources└── application.properties
3. 编写代码
3.1 实体类 (User.java)

不变:

package com.example.demo.model;import lombok.Data;@Data
public class User {private Long id;private String name;private String email;
}
3.2 新增 Provider 类 (UserSqlProvider.java)

这个类负责动态生成 SQL:

package com.example.demo.mapper;public class UserSqlProvider {// 动态查询用户的 SQLpublic String findByCondition(String name, String email) {StringBuilder sql = new StringBuilder("SELECT id, name, email FROM users WHERE 1=1");// 动态添加条件if (name != null && !name.trim().isEmpty()) {sql.append(" AND name LIKE CONCAT('%', #{name}, '%')");}if (email != null && !email.trim().isEmpty()) {sql.append(" AND email LIKE CONCAT('%', #{email}, '%')");}return sql.toString();}
}
  • 说明
    • 使用 StringBuilder 构建 SQL。
    • WHERE 1=1 避免后续条件拼接时需要判断是否加 WHERE
    • #{name}#{email} 是 MyBatis 参数占位符,与方法参数对应。
3.3 Mapper 接口 (UserMapper.java)

添加使用 @SelectProvider 的方法,其他方法保持简单注解:

package com.example.demo.mapper;import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;
import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT id, name, email FROM users")List<User> findAll();@Select("SELECT id, name, email FROM users WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(User user);@Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")void update(User user);@Delete("DELETE FROM users WHERE id = #{id}")void delete(Long id);// 新增动态查询方法@SelectProvider(type = UserSqlProvider.class, method = "findByCondition")List<User> findByCondition(@Param("name") String name, @Param("email") String email);
}
  • 注解说明
    • @SelectProvider 指定 UserSqlProvider 类的 findByCondition 方法生成 SQL。
    • @Param 为参数命名,确保 Provider 方法能正确获取。
3.4 服务层 (UserService.java)

新增动态查询方法:

package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {private final UserMapper userMapper;public UserService(UserMapper userMapper) {this.userMapper = userMapper;}public List<User> getAllUsers() {return userMapper.findAll();}public User getUserById(Long id) {return userMapper.findById(id);}public void createUser(User user) {userMapper.insert(user);}public void updateUser(User user) {userMapper.update(user);}public void deleteUser(Long id) {userMapper.delete(id);}// 新增动态查询public List<User> searchUsers(String name, String email) {return userMapper.findByCondition(name, email);}
}
3.5 控制器 (UserController.java)

新增搜索接口:

package com.example.demo.controller;import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMappingpublic List<User> getAll() {return userService.getAllUsers();}@GetMapping("/{id}")public User getById(@PathVariable Long id) {return userService.getUserById(id);}@PostMappingpublic void create(@RequestBody User user) {userService.createUser(user);}@PutMapping("/{id}")public void update(@PathVariable Long id, @RequestBody User user) {user.setId(id);userService.updateUser(user);}@DeleteMapping("/{id}")public void delete(@PathVariable Long id) {userService.deleteUser(id);}// 新增搜索接口@GetMapping("/search")public List<User> search(@RequestParam(required = false) String name,@RequestParam(required = false) String email) {return userService.searchUsers(name, email);}
}
3.6 主应用类 (DemoApplication.java)

不变:

package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

4. 运行和测试
  • 启动:运行 DemoApplication.javamvn spring-boot:run
  • 测试动态查询
    • GET http://localhost:8080/users/search?name=Alice:搜索名字含 “Alice” 的用户。
    • GET http://localhost:8080/users/search?email=example.com:搜索邮箱含 “example.com” 的用户。
    • GET http://localhost:8080/users/search?name=Alice&email=example.com:组合条件搜索。
    • (留空参数则返回所有用户,因为 WHERE 1=1)。

三、Provider 的更多用法

  1. 复杂条件

    • UserSqlProvider 中添加更多逻辑:

      public String findByCondition(String name, String email, Integer limit) {StringBuilder sql = new StringBuilder("SELECT id, name, email FROM users WHERE 1=1");if (name != null && !name.trim().isEmpty()) {sql.append(" AND name LIKE CONCAT('%', #{name}, '%')");}if (email != null && !email.trim().isEmpty()) {sql.append(" AND email LIKE CONCAT('%', #{email}, '%')");}if (limit != null && limit > 0) {sql.append(" LIMIT #{limit}");}return sql.toString();
      }
      
    • Mapper 接口:

      @SelectProvider(type = UserSqlProvider.class, method = "findByCondition")
      List<User> findByCondition(@Param("name") String name, @Param("email") String email, @Param("limit") Integer limit);
      
  2. 多表联查

    • 示例:

      public String findUserWithOrders(Long userId) {return "SELECT u.id, u.name, u.email, o.order_id " +"FROM users u LEFT JOIN orders o ON u.id = o.user_id " +"WHERE u.id = #{userId}";
      }
      
  3. 防止 SQL 注入

    • Provider 中只拼接 SQL 结构,参数仍用 #{} 绑定,避免直接拼接值。

相关文章:

MyBatis 框架使用与 Spring 集成时的使用

MyBatis 创建项目mybatis项目&#xff0c;首先需要使用maven导入mybatis库 poml.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…...

OpenGL Chan视频学习-7 Writing a Shader inOpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再整理具体函数了&#xff0c;网站直接翻译会更直观也会…...

顶会新方向:卡尔曼滤波+目标检测

卡尔曼虑波&#xff0b;目标检测创新结合&#xff0c;新作准确率突破100%! 一个有前景且好发论文的方向:卡尔曼滤波&#xff0b;目标检测! 这种创新结合&#xff0c;得到学术界的广泛认可&#xff0c;多篇成果陆续登上顶会顶刊。例如无人机竞速系统 Swift&#xff0c;登上nat…...

数据库相关问题

1.保留字 1.1错误案例&#xff08;2025/5/27&#xff09; 报错&#xff1a; java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near condition, sell…...

一起学数据结构和算法(二)| 数组(线性结构)

数组&#xff08;Array&#xff09; 数组是最基础的数据结构&#xff0c;在内存中连续存储&#xff0c;支持随机访问。适用于需要频繁按索引访问元素的场景。 简介 数组是一种线性结构&#xff0c;将相同类型的元素存储在连续的内存空间中。每个元素通过其索引值&#xff08;数…...

Linux基本指令篇 —— touch指令

touch是Linux和Unix系统中一个非常基础但实用的命令&#xff0c;主要用于操作文件的时间戳和创建空文件。下面我将详细介绍这个命令的用法和功能。 目录 一、基本功能 1. 创建空文件 2. 同时创建多个文件 3. 创建带有空格的文件名&#xff08;需要使用引号&#xff09; 二、…...

【后端高阶面经:消息队列篇】23、Kafka延迟消息:实现高并发场景下的延迟任务处理

一、延迟消息的核心价值与Kafka的局限性 在分布式系统中,延迟消息是实现异步延迟任务的核心能力,广泛应用于订单超时取消、库存自动释放、消息重试等场景。 然而,Apache Kafka作为高吞吐的分布式消息队列,原生并不支持延迟消息功能,需通过业务层或中间层逻辑实现。 1.1…...

Mac安装MongoDB数据库以及MongoDB Compass可视化连接工具

目录 一、安装 MongoDB 社区版 1、下载 MongoDB 2、配置环境变量 3、配置数据和日志目录 4、启动MongoDB服务 5、使用配置文件启动 6、验证服务运行 二、MongoDB可视化工具MongoDB Compass 一、安装 MongoDB 社区版 1、下载 MongoDB 大家可以直接在官方文档下安装Mo…...

城市地下“隐形卫士”:激光甲烷传感器如何保障燃气安全?

城市“生命线”面临的安全挑战 城市地下管网如同人体的“血管”和“神经”&#xff0c;承载着燃气、供水、电力、通信等重要功能&#xff0c;一旦发生泄漏或爆炸&#xff0c;将严重影响城市运行和居民安全。然而&#xff0c;由于管线老化、违规施工、监管困难等问题&#xff0…...

MySQL推出全新Hypergraph优化器,正式进军OLAP领域!

在刚刚过去的 MySQL Summit 2025 大会上&#xff0c;Oracle 发布了一个用于 MySQL 的全新 Hypergraph&#xff08;超图&#xff09;优化器&#xff0c;能够为复杂的多表查询生成更好的执行计划&#xff0c;从而优化查询性能。 这个功能目前只在 MySQL HeatWave 云数据库中提供&…...

飞牛fnNAS手机相册备份及AI搜图

目录 一、相册安装应用 二、手机开启自动备份 三、开始备份 四、照片检索 五、AI搜图设置 六、AI搜图测试 七、照片传递 现代的手机,已经成为我们最亲密的“伙伴”。自从手机拍照性能提升后,手机已经完全取代了简单的卡片相机,而且与入门级“单反”相机发起了挑战。在…...

消费类,小家电产品如何做Type-C PD快充快速充电

随着快充技术的快速发展现在市场上的产品接口都在逐渐转为Type-C接口&#xff0c;Type-C可以支持最大20V100W的功率。未来Type-C大概会变成最通用的接口&#xff0c;而你的产品却还是还在用其他的接口必然会被淘汰, 而要使小家电用到PD快充&#xff0c;就需要使用到Type-C快充诱…...

连接表、视图和存储过程

1. 视图 1.1. 视图的概念 视图&#xff08;View&#xff09;&#xff1a;虚拟表&#xff0c;本身不存储数据&#xff0c;而是封装了一个 SQL 查询的结果集。 用途&#xff1a; 只显示部分数据&#xff0c;提高数据访问的安全性。简化复杂查询&#xff0c;提高复用性和可维护…...

人工智能赋能教育:重塑学习生态,开启智慧未来

在科技浪潮风起云涌的当下&#xff0c;人工智能&#xff08;AI&#xff09;如同一颗璀璨的新星&#xff0c;正以前所未有的速度和深度融入社会生活的各个领域。教育&#xff0c;作为塑造未来、传承文明的核心领域&#xff0c;自然也未能置身事外。人工智能与教育的结合&#xf…...

银河麒麟V10×R²AIN SUITE:用AI重构安全,以国产化生态定义智能未来

前言 银河麒麟是由国防科技大学研发、现由麒麟软件运营的国产操作系统&#xff0c;旨在打破国外技术垄断&#xff0c;保障国家信息安全。自2002年国家“863计划”启动以来&#xff0c;历经技术迭代与生态整合&#xff0c;现为国产操作系统领军品牌。其应用覆盖党政、国防、能源…...

JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML和CSS系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff…...

15.进程间通信(一)

一、进程间通信介绍 进程间通信目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另⼀个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xf…...

AI 数据采集实战指南:基于 Bright Data 快速获取招标讯息

AI 数据采集实战指南&#xff1a;基于Bright Data快速获取招标讯息 在招标行业中&#xff0c;快速、准确地获取招标公告、项目详情、投标截止日期和其他关键招标信息&#xff0c;是投标企业提高竞标成功率的核心竞争力。然而&#xff0c;招标信息往往分散在不同的平台和网页&a…...

cursor使用mcp

问题说明 mcp就相当于给AI安装了工具包&#xff0c;它可以调用获取接口文档&#xff0c;网页&#xff0c;数据库等&#xff0c;基本上所有的mcp都是node程序&#xff0c;少数需要python环境 使用说明 使用mcp-mysql举例&#xff0c;下面是配置json "mysql": {&qu…...

小白成长之路-计算机网络(四)

文章目录 前言一、网络连接查看1.netstat2.ss3.bond绑定3.1准备好这三个文件3.2添加bond配置文件3.3关闭网络图形化服务3.4重启 4.Linux下的抓包工具Wireshark 5、web压力测试工具6、路由追踪命令 二、[练习题](https://blog.csdn.net/m0_70730767/article/details/148262716?…...

【Agent】MLGym: A New Framework and Benchmark for Advancing AI Research Agents

arxiv: https://arxiv.org/pdf/2502.14499 简介 Meta 推出的 MLGym 框架及配套基准 MLGym-Bench&#xff0c;为评估和开发LLM Agent在 AI 研究任务中的表现提供了全新工具。作为首个基于 Gym 的机器学习任务环境&#xff0c;MLGym 支持强化学习等算法对代理的训练&#xff0c…...

5.27 打卡

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torchvision from torchvision im…...

Web安全测试-文件上传绕过-DVWA

Web安全测试-文件上传绕过-DVWA 很多网站都有上传资源(图片或者文件)的功能&#xff0c;资源上传后一般会存储在服务器的一个文件夹里面&#xff0c;如果攻击者绕过了上传时候的文件类型验证&#xff0c;传了木马或者其他可执行的代码上去&#xff0c;那服务器就危险了。 我用…...

织梦dedecms arclist最新发布日期显示红色

织梦DedeCMS在当天发表的文章显示红色、添加new图标的问题&#xff0c;织梦模板网在以前的文章中已经发表过类似的文章&#xff0c;今天我们再来回顾和温习一下&#xff0c;主要增加了真正的当天显示红色&#xff0c;而不是24小时内的文章显示红色。 真正的“当天”显示红色&a…...

现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践

通过 数学计算 CSS mask 复合遮罩 实现的真正几何内凹效果&#xff1a; 背景是一张图片&#xff0c;用来证明中间的凹陷是透明的。 完整代码&#xff1a; app.js import FormPage from "./pages/formPage"; import "./App.css"; const App () > {re…...

【运维自动化-标准运维】如何实现在不同步骤间传递参数

当流程有多个步骤时&#xff0c;经常需要把前面某个个步骤处理的结果传递给下一个或后面的步骤使用&#xff08;输出作为输入&#xff09;&#xff0c;这就是跨步骤传参的场景&#xff0c;标准运维通过特有的标记符号"<SOPS_VAR>key:value</SOPS_VAR> "来…...

STM32 UART通信实战指南:从原理到项目落地

STM32串口通信实战指南&#xff1a;从零开始手把手教你 前言&#xff1a;为什么串口这么重要&#xff1f; 在嵌入式开发中&#xff0c;串口就像设备的"嘴巴"和"耳朵"。无论是给单片机下达指令、读取传感器数据&#xff0c;还是让两个模块"对话"…...

基于stm32的 永磁同步电机二电平驱动控制系统设计

基于STM32的永磁同步电机(PMSM)二电平驱动控制系统设计方案: 系统架构 永磁同步电机二电平驱动控制系统主要由以下部分组成: STM32微控制器:作为控制核心,生成PWM信号并处理反馈数据。功率驱动电路:使用IGBT或MOSFET构成三相桥式逆变器,实现二电平驱动。电流采样电路:…...

[AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)

主流大模型特色对比表 模型核心优势适用场景局限性DeepSeek- 数学/代码能力卓越&#xff08;GSM8K准确率82.3%&#xff09;1- 开源生态完善&#xff08;支持医疗/金融领域&#xff09;7- 成本极低&#xff08;API价格仅为ChatGPT的2%-3%&#xff09;5科研辅助、代码开发、数据…...

手机IP地址更换的影响与操作指南

在移动互联网时代&#xff0c;IP地址如同手机的“网络身份证”&#xff0c;其变更可能对上网体验、隐私安全及服务访问产生连锁反应。无论是为了绕过地域限制、保护隐私&#xff0c;还是解决网络冲突&#xff0c;了解IP更换的影响与正确操作方法都至关重要。本文将系统分析影响…...