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

零基础学Java——第九章:数据库编程(三)

第九章:数据库编程 - ORM框架(下)

在上一部分中,我们学习了ORM框架的基础知识和Hibernate框架。在这一部分中,我们将继续学习其他流行的ORM框架,包括MyBatis和Spring Data JPA。

1. MyBatis框架

1.1 MyBatis简介

MyBatis(前身是iBatis)是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

生活中的例子:

如果说Hibernate是一位不允许你干预的全能翻译官(它会自动将对象转换为SQL),那么MyBatis则像是一位允许你提供翻译指南的翻译官。你可以告诉MyBatis:"当我说’找出所有年龄大于18岁的用户’时,请使用这个特定的SQL语句。"这样,你既享受了ORM的便利,又保留了对SQL的控制权。

1.2 MyBatis的核心组件

1.2.1 SqlSessionFactory

SqlSessionFactory是MyBatis的核心组件,它负责创建SqlSession对象。通常,应用程序中只需要一个SqlSessionFactory实例。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
1.2.2 SqlSession

SqlSession是MyBatis的主要接口,通过它可以执行SQL命令、获取映射器和管理事务。

try (SqlSession session = sqlSessionFactory.openSession()) {// 执行SQL操作User user = session.selectOne("com.example.UserMapper.selectUser", 1);// 提交事务session.commit();
}
1.2.3 Mapper接口

Mapper接口是MyBatis中定义SQL操作的接口,通过它可以将SQL操作与Java方法关联起来。

public interface UserMapper {User selectUser(int id);List<User> selectAllUsers();void insertUser(User user);void updateUser(User user);void deleteUser(int id);
}

1.3 MyBatis配置

1.3.1 核心配置文件

MyBatis的核心配置文件包含了影响MyBatis行为的设置和属性。

<?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="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/UserMapper.xml"/></mappers>
</configuration>
1.3.2 映射文件

映射文件包含了SQL语句和结果映射的定义。

<?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="com.example.UserMapper"><select id="selectUser" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}</select><select id="selectAllUsers" resultType="com.example.User">SELECT * FROM users</select><insert id="insertUser" parameterType="com.example.User">INSERT INTO users (username, email) VALUES (#{username}, #{email})</insert><update id="updateUser" parameterType="com.example.User">UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}</update><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete>
</mapper>

1.4 MyBatis的查询方式

1.4.1 基于XML的查询
try (SqlSession session = sqlSessionFactory.openSession()) {// 使用命名空间和SQL ID执行查询User user = session.selectOne("com.example.UserMapper.selectUser", 1);
}
1.4.2 基于接口的查询
try (SqlSession session = sqlSessionFactory.openSession()) {// 获取Mapper接口UserMapper userMapper = session.getMapper(UserMapper.class);// 通过接口方法执行查询User user = userMapper.selectUser(1);
}

1.5 MyBatis的动态SQL

MyBatis提供了强大的动态SQL功能,可以根据条件动态生成SQL语句。

<select id="findUsers" resultType="com.example.User">SELECT * FROM users<where><if test="username != null">AND username LIKE #{username}</if><if test="email != null">AND email = #{email}</if></where>
</select>

1.6 MyBatis的缓存机制

MyBatis提供了两级缓存机制:一级缓存(SqlSession级别)和二级缓存(命名空间级别)。

1.6.1 一级缓存

一级缓存是SqlSession级别的缓存,默认开启。当我们使用同一个SqlSession多次执行相同的SQL语句时,只有第一次会访问数据库,后续的查询会直接从缓存中获取结果。

try (SqlSession session = sqlSessionFactory.openSession()) {// 第一次查询,会访问数据库User user1 = session.selectOne("com.example.UserMapper.selectUser", 1);// 第二次查询,直接从一级缓存获取,不会访问数据库User user2 = session.selectOne("com.example.UserMapper.selectUser", 1);
}
1.6.2 二级缓存

二级缓存是命名空间级别的缓存,可以在多个SqlSession之间共享数据。需要在映射文件中显式配置才能启用。

<!-- 在映射文件中启用二级缓存 -->
<cache/>
// 实体类需要实现Serializable接口
public class User implements Serializable {// ...
}

1.7 MyBatis与Spring的集成

MyBatis可以与Spring框架无缝集成,简化配置和使用。

<!-- 在Spring配置文件中配置MyBatis -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mydb" /><property name="username" value="root" /><property name="password" value="password" />
</bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath:com/example/*Mapper.xml" />
</bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example" />
</bean>

1.8 MyBatis最佳实践

  • 使用接口绑定:使用Mapper接口而非字符串命名空间和SQL ID,提高类型安全性
  • 合理使用动态SQL:利用动态SQL特性,减少重复代码
  • 使用ResultMap:对于复杂查询结果,使用ResultMap进行映射
  • 批量操作:对于大批量数据操作,使用批量插入、更新或删除
  • 合理配置缓存:根据应用场景合理配置和使用缓存

2. Spring Data JPA

2.1 Spring Data JPA简介

Spring Data JPA是Spring Data家族的一部分,它提供了一种简化JPA(Java Persistence API)开发的方式。Spring Data JPA通过减少数据访问层的代码量,使开发者能够更加专注于业务逻辑。

生活中的例子:

想象一下,如果Hibernate是一位需要你提供详细指令的翻译官,那么Spring Data JPA就像是一位能够理解你意图的智能助手。你只需告诉它:“我想要根据用户名查找用户”,它就能自动理解并执行这个操作,而不需要你详细说明如何执行。

2.2 Spring Data JPA的核心组件

2.2.1 Repository接口

Repository是Spring Data JPA的核心接口,它提供了一组通用的数据访问方法。

public interface UserRepository extends JpaRepository<User, Long> {// 无需实现,Spring Data JPA会自动提供基本的CRUD操作
}
2.2.2 实体类

实体类是与数据库表对应的Java类,使用JPA注解进行映射。

@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String email;// 构造函数、getter和setter方法
}

2.3 Spring Data JPA配置

2.3.1 Maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
2.3.2 Spring Boot配置
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

2.4 Spring Data JPA的查询方法

2.4.1 方法名查询

Spring Data JPA支持通过方法名自动生成查询语句。

public interface UserRepository extends JpaRepository<User, Long> {// 根据用户名查找用户User findByUsername(String username);// 根据邮箱查找用户User findByEmail(String email);// 查找用户名包含指定字符串的用户List<User> findByUsernameContaining(String username);// 查找用户名以指定字符串开头且邮箱以指定字符串结尾的用户List<User> findByUsernameStartingWithAndEmailEndingWith(String usernamePrefix, String emailSuffix);
}
2.4.2 @Query注解

对于复杂查询,可以使用@Query注解自定义查询语句。

public interface UserRepository extends JpaRepository<User, Long> {// 使用JPQL查询@Query("SELECT u FROM User u WHERE u.username = :username AND u.email = :email")User findByUsernameAndEmail(@Param("username") String username, @Param("email") String email);// 使用原生SQL查询@Query(value = "SELECT * FROM users WHERE username = ?1", nativeQuery = true)User findByUsernameNative(String username);// 更新查询@Modifying@Query("UPDATE User u SET u.email = :email WHERE u.id = :id")int updateEmail(@Param("id") Long id, @Param("email") String email);
}

2.5 Spring Data JPA的分页和排序

Spring Data JPA提供了简单的分页和排序支持。

// 在Repository接口中定义分页查询方法
public interface UserRepository extends JpaRepository<User, Long> {Page<User> findByUsernameContaining(String username, Pageable pageable);
}// 在Service中使用分页查询
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public Page<User> findUsersByUsername(String username, int page, int size) {// 创建分页请求PageRequest pageRequest = PageRequest.of(page, size, Sort.by("username").ascending());// 执行分页查询return userRepository.findByUsernameContaining(username, pageRequest);}
}

2.6 Spring Data JPA的关联关系

2.6.1 一对一关系
@Entity
public class Person {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "address_id")private Address address;// 构造函数、getter和setter方法
}@Entity
public class Address {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String street;private String city;// 构造函数、getter和setter方法
}
2.6.2 一对多关系
@Entity
public class Department {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)private List<Employee> employees = new ArrayList<>();// 构造函数、getter和setter方法
}@Entity
public class Employee {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToOne@JoinColumn(name = "department_id")private Department department;// 构造函数、getter和setter方法
}
2.6.3 多对多关系
@Entity
public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})@JoinTable(name = "student_course",joinColumns = @JoinColumn(name = "student_id"),inverseJoinColumns = @JoinColumn(name = "course_id"))private Set<Course> courses = new HashSet<>();// 构造函数、getter和setter方法
}@Entity
public class Course {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToMany(mappedBy = "courses")private Set<Student> students = new HashSet<>();// 构造函数、getter和setter方法
}

2.7 Spring Data JPA的审计功能

Spring Data JPA提供了审计功能,可以自动记录实体的创建时间、最后修改时间、创建者和最后修改者。

// 启用JPA审计
@Configuration
@EnableJpaAuditing
public class JpaConfig {@Beanpublic AuditorAware<String> auditorProvider() {return () -> Optional.of("当前用户");}
}// 在实体类中使用审计注解
@Entity
@EntityListeners(AuditingEntityListener.class)
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String email;@CreatedDateprivate LocalDateTime createdAt;@LastModifiedDateprivate LocalDateTime updatedAt;@CreatedByprivate String createdBy;@LastModifiedByprivate String updatedBy;// 构造函数、getter和setter方法
}

2.8 Spring Data JPA最佳实践

  • 使用方法名查询:对于简单查询,使用方法名查询可以减少代码量
  • 使用@Query注解:对于复杂查询,使用@Query注解自定义查询语句
  • 合理使用关联关系:根据业务需求合理设计实体之间的关联关系
  • 使用分页和排序:对于大量数据,使用分页和排序提高性能
  • 启用审计功能:使用审计功能自动记录实体的变更历史

3. ORM框架对比

3.1 Hibernate vs MyBatis

特性HibernateMyBatis
学习曲线较陡峭较平缓
SQL控制自动生成,控制较少手动编写,控制较多
性能对于简单查询较好对于复杂查询较好
灵活性较低较高
开发效率较高中等
适用场景简单CRUD操作复杂查询和存储过程

3.2 Spring Data JPA vs Hibernate

特性Spring Data JPAHibernate
学习曲线较平缓较陡峭
代码量较少较多
功能丰富度中等
灵活性中等
开发效率很高
适用场景标准CRUD操作复杂映射和查询

3.3 如何选择ORM框架

选择合适的ORM框架应考虑以下因素:

  • 项目复杂度:对于简单项目,Spring Data JPA可能是最佳选择;对于复杂项目,Hibernate或MyBatis可能更合适
  • 团队经验:考虑团队成员对各框架的熟悉程度
  • 性能要求:对于性能要求高的场景,MyBatis可能更合适
  • SQL控制:如果需要精确控制SQL,MyBatis是更好的选择
  • 开发效率:如果追求开发效率,Spring Data JPA是不错的选择

总结

在本章中,我们学习了三种主流的ORM框架:Hibernate、MyBatis和Spring Data JPA。这些框架各有特点,适用于不同的场景。

Hibernate是一个功能强大的ORM框架,它通过对象关系映射技术,使开发者能够使用面向对象的方式操作数据库,但学习曲线较陡峭。

MyBatis是一个灵活的持久层框架,它允许开发者精确控制SQL语句,适合于复杂查询和对性能要求较高的场景。

Spring Data JPA是一个简化JPA开发的框架,它通过约定大于配置的方式,大大减少了数据访问层的代码量,提高了开发效率。

在实际项目中,应根据项目需求和团队情况选择合适的ORM框架。有时候,甚至可以在同一个项目中混合使用多种框架,以发挥各自的优势。

相关文章:

零基础学Java——第九章:数据库编程(三)

第九章&#xff1a;数据库编程 - ORM框架&#xff08;下&#xff09; 在上一部分中&#xff0c;我们学习了ORM框架的基础知识和Hibernate框架。在这一部分中&#xff0c;我们将继续学习其他流行的ORM框架&#xff0c;包括MyBatis和Spring Data JPA。 1. MyBatis框架 1.1 MyB…...

Linux/AndroidOS中进程间的通信线程间的同步 - 信号量

1 概述 本文将介绍 POSIX 信号量&#xff0c;它允许进程和线程同步对共享资源的访问。有两种类型的 POSIX 信号量&#xff1a; 命名信号量&#xff1a;这种信号量拥有一个名字。通过使用相同的名字调用 sem_open()&#xff0c;不相关的进程能够访问同一个信号量。未命名信号量…...

精益数据分析(46/126):深入剖析用户生成内容(UGC)商业模式

精益数据分析&#xff08;46/126&#xff09;&#xff1a;深入剖析用户生成内容&#xff08;UGC&#xff09;商业模式 在创业与数据分析的征程中&#xff0c;每一种商业模式都蕴含着独特的价值与挑战。今天&#xff0c;我们依旧怀揣着共同进步的信念&#xff0c;深入研读《精益…...

vue +xlsx+exceljs 导出excel文档

实现功能&#xff1a;分标题行导出数据过多&#xff0c;一个sheet表里表格条数有限制&#xff0c;需要分sheet显示。 步骤1:安装插件包 npm install exceljs npm install xlsx 步骤2&#xff1a;引用包 import XLSX from xlsx; import ExcelJS from exceljs; 步骤3&am…...

Android 10.0 SharedPreferences in credential encrypted storage are not avai

1.前言 在10.0的系统rom定制化开发中,在开机的过程中,由于某些应用在开机解锁阶段就开始访问查询短信和联系人等功能,所以 会出现抛异常的情况出现,接下来分析下相关的情况,然后来解决这些问题 2.SharedPreferences in credential encrypted storage are not available …...

面试高频算法:最长回文子串

题目&#xff1a;5. 最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 回文&#xff1a;如果字符串向前和向后读都相同&#xff0c;则它满足回文性&#xff1b;子串&#xff1a;子字符串 是字符串中连续的非空字符序列。 示例 1&#xff1a; 输入&…...

RDK X5 交叉编译OSS\QT\opencv\openssl

RDK X5 交叉编译环境配置 1 资源2 使用vm安装Ubuntu22.043 安装依赖4 安装ide5 下载交叉编译工具6 编译oss库6.1 设置临时环境变量6.2 编译arm版本的openssl6.2 编译arm版本的curl6.1 下载oss源码6.1.1 创建arm-toolchain.cmake6.1.2 修改CMakeLists.txt6.1.3 编译 7 编译openc…...

Python cv2边缘检测与轮廓查找:从理论到实战

在计算机视觉领域&#xff0c;边缘检测与轮廓查找是图像分析的核心技术。本文将结合OpenCV库&#xff08;cv2模块&#xff09;&#xff0c;从理论原理到代码实战&#xff0c;系统讲解如何通过Python实现这两个关键操作。 一、基础概念解析 1.1 边缘检测的本质 边缘是图像中灰…...

5月7日星期三今日早报简报微语报早读

5月7日星期三&#xff0c;农历四月初十&#xff0c;早报#微语早读。 1、1101名优秀运动员拟保送&#xff0c;全红婵、黄雨婷、盛李豪在列&#xff1b; 2、世界羽联主席巴达玛&#xff1a;中国组织赛事的能力无与伦比&#xff1b; 3、中国首位、亚洲首位&#xff01;赵心童夺…...

智慧医院的可视化变革:可视化工具助力数字化转型

在科技飞速发展的当下&#xff0c;智慧医院已从概念逐步落地&#xff0c;深刻改变着传统医疗模式。它借助互联网、数字孪生及人工智能等前沿技术&#xff0c;在医疗服务领域掀起革新&#xff0c;涵盖面向医务人员的“智慧医疗”、面向患者的“智慧服务”以及面向医院的“智慧管…...

python+open3d选择点云上的某个点并获取其对应三维坐标

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! python+open3d选择点云上的某个点并获取其对应三维坐标 1,引言2,效果展示3,点云获取4,程序1,引言 有时候我们只想在点云上获取某个目标的具体坐标,通过程序根据…...

ROS第十三梯:RViz+Marker——自定义几何形状可视化

1)概述 在ROS(Robot Operating System)中,Marker是一种用于在RViz(Robot Visualization)中显示自定义几何形状和注释的工具。Marker是通过visualization_msgs/Marker消息类型发布的。可以在RViz中以各种形式(如点、线、文本、立方体等)显示数据。 2)主要消息格…...

Java高频面试之并发编程-13

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详解原子性、可见性、有序性 在并发编程中&#xff0c;原子性&#xff08;Atomicity&#xff09;、可见性&#xff08;…...

WSL 的 Ubuntu 子系统中启用图形化界面

sudo chmod w /home sudo apt update sudo apt install cifs-utils 1. 选择合适的 X 服务器 在 Windows 系统上&#xff0c;需要安装一个 X 服务器来处理 WSL 中 Ubuntu 的图形显示。常用的 X 服务器有 VcXsrv 和 X410&#xff0c;这里以 VcXsrv 为例&#xff1a; 从VcXsrv 官…...

项目模拟实现消息队列第二天

消息应答的模式 1.自动应答: 消费者把这个消息取走了&#xff0c;就算是应答了&#xff08;相当于没有应答) 2.手动应答: basicAck方法属于手动应答(消费者需要主动调用这个api进行应答) 小结 1.需要实现生产者,broker server&#xff0c;消费者这三个部分的 2.针对生产者和消费…...

MySQL OCP和Oracle OCP怎么选?

近期oracle 为庆祝 MySQL 数据库发布 30 周年&#xff0c;Oracle 官方推出限时福利&#xff1a;2025 年 4 月 20 日至 7 月 31 日期间&#xff0c;所有人均可免费报考 MySQL OCP&#xff08;Oracle Certified Professional&#xff09;认证考试&#xff08;具体可查看MySQL OCP…...

SR触发器为什么能够消抖

SR触发器&#xff08;Set-Reset触发器&#xff09;能够用于**消抖&#xff08;Debounce&#xff09;**&#xff0c;主要是因为它的双稳态特性和对输入信号的锁定能力。机械开关&#xff08;如按键、拨动开关&#xff09;在闭合或断开时&#xff0c;由于金属触点的弹性&#xff…...

2025ISCC练武校级赛部分题解WP

Web 战胜卞相壹 <!-- 路过的酒罐王柯洁九段说&#xff1a; --> <!-- 会叠棋子有什么用&#xff01;你得在棋盘内战胜他&#xff01;我教你个定式&#xff0c;要一直记得&#xff01;一直&#xff01; --> <!-- SGF B[ae];B[ce];B[df];B[cg];B[ag];B[ai];B[ci];…...

Microsoft Azure 在印度尼西亚区域正式上线

微软正式宣布&#xff0c;其首个落地印度尼西亚的云区域——Indonesia Central 已全面上线并正式投入使用&#xff01;这一区域精心设置了三个可用性区&#xff08;Availability Zones&#xff09;&#xff0c;每个可用性区均配备独立的电源、冷却系统以及网络设施&#xff0c;…...

day18 python聚类分析对数据集模型性能影响

聚类后的分析&#xff1a;推断簇的类型 知识点回顾&#xff1a; 推断簇含义的2个思路&#xff1a;先选特征和后选特征通过可视化图形借助ai定义簇的含义科研逻辑闭环:通过精度判断特征工程价值 作业&#xff1a;参考示例代码对心脏病数据集采取类似操作&#xff0c;并且评估特征…...

vue3的新特性

vue2 data属性和方法名散落于各个位置&#xff0c;量大了不好找 顺序变了&#xff0c;script在最前面 setup vue3中不用this&#xff0c;setup的执行时期比beforeCreate还要早&#xff0c;所以不要用this setup中写代码的特点 必须要有return&#xff0c;才能在上面使用 什么…...

NX二次开发——BlockUI 弹出另一个BlockUI对话框

最近在研究&#xff0c;装配体下自动导出BOM表格中需要用到BlockUI 弹出另一个BlockUI对话框。通过对网上资料进行整理总结&#xff0c;具体如下&#xff1a; 1、明确主对话框、子对话框1和子对话框2 使用BlockUI创建.cpp和.hpp文件&#xff0c;dlx文件内容如下所示 主对话框…...

《Overlapping Experiment Infrastructure: More, Better, Faster》论文阅读笔记

文章目录 1 背景2 三个核心概念3 Launch层&#xff1a;特性发布的专用机制4 流量分发策略和条件筛选4.1 四种流量分发类型4.2 条件筛选机制 5 工具链与监控体系6 实验设计原则7 培训参考与推荐 1 背景 谷歌&#xff08;Google&#xff09;以数据驱动著称&#xff0c;几乎所有可…...

【Machine Learning Q and AI 读书笔记】- 05 利用数据减少过拟合现象

Machine Learning Q and AI 中文译名 大模型技术30讲&#xff0c;主要总结了大模型相关的技术要点&#xff0c;结合学术和工程化&#xff0c;对LLM从业者来说&#xff0c;是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第5篇&#xff0c;对应原…...

前端面试测试题目(一)

一、Vue的双向绑定机制&#xff08;v-model底层实现原理&#xff09; Vue的双向绑定核心由 响应式系统 和 指令语法糖 共同实现&#xff0c;具体原理如下&#xff1a; 响应式系统 Vue通过数据劫持和依赖收集实现数据变化到视图的同步&#xff1a; • 数据劫持&#xff1a;在Vue…...

最优化方法Python计算:无约束优化应用——线性回归分类器

一、线性回归分类器 假设样本数据为 ( x i , y i ) (\boldsymbol{x}_i, y_i) (xi​,yi​)&#xff0c;其中 i 1 , 2 , … , m i 1, 2, \dots, m i1,2,…,m。标签 y i y_i yi​ 取值于 k k k 个整数 { 1 , 2 , … , k } \{1, 2, \dots, k\} {1,2,…,k}&#xff0c;从而构…...

【汇正自控阀门集团】签约智橙PLM,智橙助泵阀“以国代进”

签约智橙&#xff0c;汇正阀门的“以国代进”举措 随着阀门市场竞争日益激烈、市场需求日益多样化&#xff0c;无论是出口海外、以国代进&#xff0c;还是进军新能源、造船、油气等投资景气的下游市场&#xff0c;阀门企业能否在快速迭代产品、保持技术领先的同时&#xff0c;…...

【macOS】iTerm2介绍

iTerm2 和 iTerm 是 macOS 上两个不同的终端模拟器&#xff0c;虽然名字相似&#xff0c;但它们是两个独立的项目&#xff0c;且 iTerm2 是 iTerm 的现代化继承者。以下是它们的核心区别和演进关系&#xff1a; 1. 历史背景 项目诞生时间状态开发者iTerm2002 年已停止维护Greg…...

2025年五一假期旅游市场新趋势:理性消费、多元场景与科技赋能

2025年五一假期&#xff0c;国内旅游市场再次迎来爆发式增长&#xff0c;官方数据显示&#xff0c;假期期间国内出游人次达3.14亿&#xff0c;游客总消费1802.69亿元。尽管数据规模亮眼&#xff0c;但深入分析可发现&#xff0c;旅游市场正经历结构性变革——消费行为趋于理性、…...

第3章 模拟法

3.1 模拟法概述 模拟法设计思想 模拟法通过将现实问题抽象成计算机可识别的符号与操作&#xff0c;按逻辑顺序“模拟”其过程&#xff0c;从而得到结果&#xff1b;它不依赖复杂公式或高深技巧&#xff0c;只需理清问题背景与实现步骤即可。 示例&#xff1a;鸡兔同笼问题 题…...

16.状态模式:思考与解读

原文地址:状态模式&#xff1a;思考与解读 更多内容请关注&#xff1a;深入思考与解读设计模式 引言 在开发软件系统时&#xff0c;特别是当对象的行为会随着状态的变化而变化时&#xff0c;系统往往会变得复杂。你是否遇到过这样的情况&#xff1a;一个对象的行为在不同的状…...

ActiveMQ 源码剖析:消息存储与通信协议实现(二)

四、KahaDB 消息存储实现细节 &#xff08;一&#xff09;存储原理分析 KahaDB 作为 ActiveMQ 从 5.4 版本开始的默认消息存储引擎&#xff0c;其基于日志文件的存储原理具有独特的设计和优势 。在 KahaDB 的存储目录&#xff08;如${activemq.data}/kahadb&#xff09;下&am…...

明远智睿SD2351核心板:工业AIoT时代的创新引擎

在当今工业互联网飞速发展的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;与物联网&#xff08;IoT&#xff09;的深度融合正以前所未有的态势重塑着传统制造业的格局。从自动化生产线的精准控制到智能仓储的高效管理&#xff0c;从设备运行的实时监测到产品质量的严格…...

iPhone 和 Android 在日期格式方面的区别

整篇文章由iPhone 和 Android 在日期格式方面有所不同引起,大致介绍了,两种时间标准,以及在 JavaScript 下的格式转换方法。 Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 iPhone 和 Android 在日期格式方面有所不同。其中,iPhone(iOS)使…...

使用VSCode在Windows 11上编译运行项目

使用VSCode在Windows 11上编译运行项目 VSCode是一个功能强大的跨平台代码编辑器&#xff0c;可以很好地支持C/C项目开发。以下是使用VSCode在Windows 11上编译运行此项目的详细步骤。 1. 安装VSCode 访问VSCode官网下载并安装VSCode安装完成后&#xff0c;启动VSCode 2. 安…...

边缘计算,运维架构从传统的集中式向分布式转变

在当今数字化时代&#xff0c;边缘计算的崛起正在改变着运维的格局。随着物联网、5G 等技术的快速发展&#xff0c;越来越多的数据和应用正在向边缘设备迁移&#xff0c;这给运维团队带来了新的挑战和机遇。 一、边缘计算崛起带来的运维挑战 边缘计算将计算和数据存储靠近数据…...

【基础篇】prometheus热更新解读

文章目录 本篇内容讲解热更新参数源码解读本篇总结本篇内容讲解 prometheus热更新源码解读 热更新参数 –web.enable-lifecycle : 代表开启热更新配置 修改配置文件发http请求# curl -X POST -vvv localhost:9090/-/reload * About to connect() to localhost port 9090 (…...

为了结合后端而学习前端的学习日志(1)——纯CSS静态卡片案例

前端设计专栏 使用纯CSS创建简洁名片卡片的学习实践 在这篇技术博客中&#xff0c;我将分享我的前端学习过程&#xff0c;如何使用纯HTML和CSS创建一个简洁美观的名片式卡片&#xff0c;就像我博客首页展示的那样。这种卡片设计非常适合作为个人简介、产品展示或团队成员介绍…...

汽车服务小程序功能点开发

汽车养护服务功能 智能保养预约&#xff1a;根据车辆品牌、型号及行驶里程&#xff0c;自动推荐保养项目&#xff0c;支持线上预约 4S 店或合作维修厂&#xff0c;选择服务时间与地点。故障诊断与维修&#xff1a;车主上传车辆故障现象&#xff0c;系统智能初步诊断&#xff0…...

SENSE2020BSI sCMOS科学级相机主要参数及应用场景

SENSE2020BSI sCMOS科学级相机是一款面向宽光谱成像需求的高性能科学成像设备&#xff0c;结合了背照式&#xff08;Back-Side Illuminated, BSI&#xff09;CMOS技术与先进信号处理算法&#xff0c;适用于天文观测、生物医学成像、工业检测等领域。以下是其核心特点及技术细节…...

《汽车噪声控制》复习重点

题型 选择 填空 分析 计算 第一章 噪声定义 不需要的声音&#xff0c;妨碍正常工作、学习、生活&#xff0c;危害身体健康的声音&#xff0c;统称为噪声 噪声污染 与大气污染、水污染并称现代社会三大公害 声波基本概念 定义 媒质质点的机械振动由近及远传播&am…...

物流无人机结构与载货设计分析!

一、物流无人机的结构与载货设计模块运行方式 1.结构设计特点 垂直起降与固定翼结合&#xff1a;针对复杂地形&#xff08;如山区、城市&#xff09;需求&#xff0c;采用垂直起降&#xff08;VTOL&#xff09;与固定翼结合的复合布局&#xff0c;例如“天马”H型无人机&am…...

docker创建一个centOS容器安装软件(以宝塔为例)的详细步骤

备忘&#xff1a;后续偶尔忘记了docker虚拟机与宿主机的端口映射关系&#xff0c;来这里查看即可&#xff1a; docker run -d \ --name baota \ --privilegedtrue \ -p 8888:8888 \ -p 8880:80 \ -p 8443:443 \ -p 8820:20 \ -p 8821:21 \ -v /home/www:/www/wwwroot \ centos…...

D盘出现不知名文件

各位大佬&#xff0c;电脑D盘去年还干干净净的&#xff0c;后来突然就出现了所圈部分的几个不知名文件&#xff0c;请问这是什么东西&#xff1f;是否可以删除&#xff1f;...

Rust 中 Arc 的深度分析:从原理到性能优化实践

在 Rust 的并发编程中&#xff0c;Arc&#xff08;Atomic Reference Counted&#xff09; 是一个非常关键的智能指针类型&#xff0c;用于在多个线程之间共享数据的所有权。它通过原子操作维护引用计数&#xff0c;确保在多线程环境下安全地管理堆内存资源。然而&#xff0c;很…...

qsort函数

在本篇中&#xff0c;将深入了解qsort函数的用法。 1.qsort函数的基础知识 该函数是用来排序的&#xff0c;这是一个可以直接用来排序数据的库函数&#xff08;#include<stdlib.h>&#xff09;&#xff0c;底层使用的是快速排序的方式。 常见的排序方式有&#xff1a; …...

01 一文了解大数据存储框架:数据库、数据仓库、数据集市、数据网格、数据湖、数据湖仓

1. 大数据存储框架 1.1 定义 数据库&#xff08;Database&#xff09;&#xff1a;数据库是按照数据结构来组织、存储和管理数据的仓库&#xff0c;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据仓库&#xff08;Data Warehouse&#xff…...

QT —— QWidget(2)

QT —— QWidget&#xff08;2&#xff09; windowTitlewindowIconQt 资源系统 (qrc 机制) 详解基本概念使用方法1. 创建 .qrc 文件 设置背景windowOpacity 我们今天继续来学习QWidget&#xff0c;如果大家上一次的博客还没有看过&#xff0c;可以点击这里&#xff1a; https:/…...

微信小程序预览文件 兼容性苹果

uni.request({url: url,method: GET,header: {Authorization: token,responseType: blob,},responseType: "arraybuffer",success: (res) > {uni.hideLoading()const fs wx.getFileSystemManager(); //获取全局唯一的文件管理器let index url.lastIndexOf("…...

QT:qt5调用打开exe程序并获取调用按钮控件实例2025.5.7

为实现在 VS2015 的 Qt 开发环境下打开外部 exe&#xff0c;列出其界面按钮控件的序号与文本名&#xff0c;然后点击包含特定文本的按钮控件。以下是更新后的代码&#xff1a; #include <QCoreApplication> #include <QProcess> #include <QDebug> #include…...