Spring数据访问全攻略:从JdbcTemplate到声明式事务

news2025/1/26 15:31:08

上文讲到 —— 航向数据之海:Spring的JPA与Hibernate秘籍

本文目录

    • 四. JdbcTemplate的使用
      • 定义JdbcTemplate及其在Spring中的作用
      • 展示如何使用JdbcTemplate简化数据库操作
        • 1. 配置JdbcTemplate
        • 2. 使用JdbcTemplate查询数据
        • 3. 打印查询结果
    • 五. Spring的事务管理
      • 介绍事务管理的基本概念
      • 解释Spring支持的事务管理类型
        • 1. 编程式事务管理
        • 2. 声明式事务管理
      • 展示如何使用声明式事务管理
    • 六. 声明式事务管理
      • 定义声明式事务管理
      • 讨论如何在Spring中实现声明式事务管理
        • 1. 配置事务管理器
        • 2. 使用`@Transactional`注解
        • 3. 事务属性的自定义
    • 七. JPA和Hibernate
      • 介绍JPA(Java Persistence API)
      • 介绍Hibernate及其核心特性
      • 讨论JPA和Hibernate与Spring的集成方式
        • 7.1 JPA与Spring的关系
        • 7.2 Hibernate与Spring的关系
    • 八. 结论
      • 总结Spring在数据访问与集成方面提供的功能
      • 强调Spring对于简化数据访问和事务管理的贡献
        • 1. 开发效率的提升
        • 2. 代码的可维护性
        • 3. 数据一致性的保障
    • 参考文献

在这里插入图片描述

四. JdbcTemplate的使用

定义JdbcTemplate及其在Spring中的作用

在Spring的航海之旅中,JdbcTemplate是航海家Spring的得力助手,它是一个简化数据库操作的利器。想象一下,如果每次航行都需要手动划桨,那么航海家Spring的双手很快就会疲惫不堪。而JdbcTemplate就像是一艘装有自动划桨机的船,让Spring可以更轻松地驾驭数据的海洋。

JdbcTemplate是一个以模板方法设计模式实现的类,它封装了JDBC(Java Database Connectivity)的繁琐操作,提供了一种更加简洁和统一的方式来执行数据库操作。它就像是航海家Spring的自动导航系统,可以自动规划航线,避开障碍,确保航行的顺利。

展示如何使用JdbcTemplate简化数据库操作

让我们通过一个实际的例子来展示JdbcTemplate的魔力。假设Spring需要从数据库中检索所有用户的信息,并且将这些信息打印出来。

1. 配置JdbcTemplate

首先,Spring需要告诉JdbcTemplate如何连接到数据库。这就像是设定航向和目的地,让自动导航系统知道要去哪里。

@Configuration
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        // 配置数据库连接池
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("schema.sql")
                .build();
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}
2. 使用JdbcTemplate查询数据

接下来,Spring就可以使用JdbcTemplate来执行查询了。这就像是启动自动导航系统,让船只自动航行。

@Service
public class UserService {

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public UserService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<User> findAllUsers() {
        List<User> users = jdbcTemplate.query(
            "SELECT id, username, age FROM users",
            new RowMapper<User>() {
                public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                    return new User(
                        rs.getInt("id"),
                        rs.getString("username"),
                        rs.getInt("age")
                    );
                }
            }
        );
        return users;
    }
}

在这个例子中,findAllUsers方法通过JdbcTemplate的query方法执行了一个SQL查询,并将结果集映射为User对象的列表。这个过程就像是航海家Spring用望远镜观察海面,自动识别出每一条船,并记录下它们的信息。

3. 打印查询结果

最后,Spring可以简单地遍历用户列表,并将用户信息打印出来,就像是在航海日志中记录下每一次的发现。

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(DatabaseConfig.class);
    UserService userService = context.getBean(UserService.class);
    List<User> users = userService.findAllUsers();

    for (User user : users) {
        System.out.println(user);
    }
}

通过这个简单的过程,Spring就可以轻松地从数据库中检索和处理数据,而无需担心JDBC的复杂细节。JdbcTemplate就像是航海家Spring的得力助手,让数据访问变得简单而有趣。


接下来,我们将探索Spring的事务管理功能,这是确保数据一致性的关键。就像在航行中,即使遇到风浪,也要确保货物安全一样,事务管理确保了数据操作的完整性和可靠性。让我们继续跟随Spring,深入了解这一重要的概念。

五. Spring的事务管理

介绍事务管理的基本概念

在数据访问的航海之旅中,事务管理就像是航海家Spring的“救生圈”。在数据库的世界里,一次事务可能包含多个步骤,比如用户下单、扣款、库存更新等。如果这些步骤中的任何一个失败,整个操作都应该撤销,以保持数据的一致性。就像在航行中,如果货物在搬运过程中不慎落水,那么整个搬运过程都应该视为失败,以避免货物的丢失。

解释Spring支持的事务管理类型

Spring提供了多种事务管理方式,以适应不同的业务场景和需求。这些方式就像是航海家Spring的多种“救生圈”,每种都有其独特的用途和优势。

1. 编程式事务管理

编程式事务管理就像是使用一个普通的救生圈,你需要自己判断何时使用它。这种方式通过编码的方式直接管理事务的开启、提交或回滚,适用于对事务控制要求精细的场合。

2. 声明式事务管理

而声明式事务管理则像是自动充气的救生衣,你只需要穿上它,它就会在检测到危险时自动充气保护你。这种方式通过配置来声明事务的边界和特性,无需在代码中硬编码事务管理逻辑,简化了开发。

展示如何使用声明式事务管理

让我们通过一个简单的例子来展示如何使用声明式事务管理,以确保用户下单过程中的数据库操作要么全部成功,要么在遇到任何问题时全部撤销。

假设我们有一个OrderService,它负责处理用户的下单操作,这个过程需要执行多个数据库操作,如创建订单、扣款、更新库存等。

@Service
public class OrderService {

    private final OrderRepository orderRepository;
    private final AccountRepository accountRepository;
    private final InventoryRepository inventoryRepository;

    @Autowired
    public OrderService(OrderRepository orderRepository, AccountRepository accountRepository, InventoryRepository inventoryRepository) {
        this.orderRepository = orderRepository;
        this.accountRepository = accountRepository;
        this.inventoryRepository = inventoryRepository;
    }

    @Transactional
    public void placeOrder(Order order) {
        // 创建订单
        orderRepository.save(order);

        // 从账户扣款
        accountRepository.deductBalance(order.getAccountId(), order.getTotalAmount());

        // 更新库存
        inventoryRepository.reduceStock(order.getProductId(), order.getQuantity());
    }
}

在这个例子中,placeOrder方法通过@Transactional注解声明了事务管理。这意味着,如果方法中的任何一个数据库操作失败,Spring都会自动回滚事务,撤销之前的所有操作,确保数据的一致性。

这就像是航海家Spring在搬运货物时穿上了自动充气的救生衣,即使遇到风浪,也能够保证货物的安全。


通过Spring的事务管理,航海家Spring可以更加自信地航行在数据的海洋中,即使遇到风浪,也能够确保货物(数据)的安全。在下一章中,我们将深入了解声明式事务管理,这是Spring提供的一种更加简洁和声明式的方式来管理事务。让我们继续跟随Spring,探索更多的可能性。
在这里插入图片描述

六. 声明式事务管理

定义声明式事务管理

在Spring的航海之旅中,声明式事务管理就像是一张神奇的航海图,它能够自动引导航海家Spring避开暗礁和风暴,确保航程的安全。与编程式事务管理相比,声明式事务管理通过配置而非硬编码的方式,声明了事务的开始、提交或回滚的规则,让Spring可以更加专注于业务逻辑的实现。

讨论如何在Spring中实现声明式事务管理

要启用声明式事务管理,Spring需要一个事务管理器(TransactionManager)和事务定义信息(通过@Transactional注解或配置文件)。这就像是航海图上的标记和路线,告诉Spring在哪些航段需要特别小心。

1. 配置事务管理器

首先,我们需要配置一个事务管理器。在Spring中,这通常是通过在配置类上使用@EnableTransactionManagement注解来完成的。

@Configuration
@EnableTransactionManagement
public class AppConfig {
    // 其他配置...
}
2. 使用@Transactional注解

接下来,我们可以使用@Transactional注解来声明事务。这个注解可以放在方法上,也可以放在类上,表示所有该类的public方法都具有相同的事务属性。

@Service
public class OrderService {

    private final OrderRepository orderRepository;

    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    @Transactional
    public Order placeOrder(String username, Product product, int quantity) {
        // 检查库存
        inventoryService.checkAvailability(product, quantity);

        // 创建订单
        Order order = new Order(username, product, quantity);
        orderRepository.save(order);

        // 扣款
        accountService.deductFunds(username, product.getPrice() * quantity);

        // 发送确认邮件
        emailService.sendOrderConfirmation(username, order);

        return order;
    }
}

在这个例子中,placeOrder方法通过@Transactional注解声明了事务。如果方法中任何一个步骤失败(比如库存不足或扣款失败),Spring都会自动回滚事务,确保数据库状态的一致性。

3. 事务属性的自定义

@Transactional注解还允许我们自定义事务的属性,如事务的隔离级别、传播行为、超时时间等。这就像是航海图上的高级功能,可以根据不同的海域调整航船的性能。

@Transactional(isolation = Isolation.READ_COMMITTED, 
               propagation = Propagation.REQUIRED, 
               timeout = 30)
public void someServiceMethod() {
    // ...
}

在这个例子中,我们为事务设置了隔离级别为READ_COMMITTED,传播行为为REQUIRED,并且设置了30秒的超时时间。


通过声明式事务管理,Spring能够更加灵活和安全地处理事务,就像航海家Spring在航海图中规划了最佳航线,避开了所有的风险。在下一章中,我们将深入了解JPA和Hibernate,这是Spring在数据持久化方面的两大利器,它们将帮助Spring更高效地与数据库进行交互。让我们继续跟随Spring,探索数据访问与集成的更多奥秘。

七. JPA和Hibernate

介绍JPA(Java Persistence API)

在Spring的航海之旅中,JPA(Java Persistence API)就像是一张海图,它不仅指引着航海家Spring如何在数据库的海洋中航行,还提供了一套通用的语言来描述和操作数据。JPA是一个Java规范,它定义了一组API,用于对象-关系映射(ORM),即将Java对象映射到数据库表中。

介绍Hibernate及其核心特性

Hibernate是JPA的一个流行实现,它就像是一艘装备精良的潜水艇,让Spring能够深入数据库的海洋,执行各种复杂的操作。Hibernate提供了许多强大的特性,如自动SQL生成、事务管理、缓存机制等,极大地简化了数据持久化的工作。

讨论JPA和Hibernate与Spring的集成方式

Spring与JPA和Hibernate的集成就像是航海家Spring与他的潜水艇之间的无缝配合。Spring提供了一个JPA的抽象层,允许开发者以一种统一的方式使用JPA,而不必关心底层的具体实现。

7.1 JPA与Spring的关系

在Spring的ORM框架中,JPA扮演着重要的角色。Spring提供了LocalContainerEntityManagerFactoryBeanEntityManagerFactory来配置和使用JPA。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "entityManagerFactoryBean",
    transactionManagerRef = "transactionManager",
    basePackages = {"com.example.repositories"} // 指定repository所在位置
)
public class JpaConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder, 
                                                                            DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.domain") // 指定实体类所在位置
                .persistenceUnit("default")
                .build();
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }
}

在这个配置中,我们定义了如何创建EntityManagerFactory,它是JPA的核心组件,用于创建EntityManager,以及定义了事务管理器PlatformTransactionManager。

7.2 Hibernate与Spring的关系

Hibernate作为ORM框架,与Spring的集成非常紧密。Spring提供了对Hibernate的无缝支持,让开发者可以轻松地利用Hibernate的强大功能。

@Configuration
@EnableTransactionManagement
@EnableHibernateEntityManager
public class HibernateConfig {

    @Bean
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setPackages("com.example.domain"); // 指定实体类所在位置
        sessionFactoryBean.setHibernateProperties(hibernateProperties());
        return sessionFactoryBean;
    }

    @Bean
    public Properties hibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        hibernateProperties.setProperty("hibernate.show_sql", "true");
        return hibernateProperties;
    }

    // 其他配置...
}

在这个配置中,我们通过LocalSessionFactoryBean来配置Hibernate的SessionFactory,并通过hibernateProperties定义了Hibernate的配置属性。


通过Spring与JPA和Hibernate的集成,航海家Spring就像是拥有了一张详尽的海图和一艘强大的潜水艇,无论是在数据库的浅滩还是深海,都能够自如地航行和探索。在下一章中,我们将总结Spring在数据访问与集成方面提供的功能,并强调Spring对于简化数据访问和事务管理的贡献。让我们继续跟随Spring,完成这次精彩的航海之旅。

在这里插入图片描述

八. 结论

随着我们和航海家Spring一起经历了这场数据访问与集成的冒险,现在是时候回顾一下我们的收获了。在这个旅程中,我们见识了Spring如何以其强大的功能和优雅的设计,帮助我们征服了数据的海洋。

总结Spring在数据访问与集成方面提供的功能

Spring框架在数据访问与集成方面提供了一整套解决方案,从基础的JdbcTemplate到高级的ORM框架JPA和Hibernate,每一个组件都像是航海家的工具箱中的一件神器,帮助我们在数据的海洋中乘风破浪。

  • JdbcTemplate:提供了一种简便的方法来执行常见的数据库操作,就像是一艘小船,虽简单却非常实用。
  • 异常层次结构:清晰的异常分类和处理机制,就像是航海图上的风向标,指引我们快速识别和解决问题。
  • 事务管理:无论是编程式还是声明式事务管理,Spring都提供了强大的支持,确保了数据操作的原子性、一致性、隔离性和持久性(ACID)。
  • JPA和Hibernate:作为ORM框架,它们极大地简化了对象与数据库之间的映射,就像是深海中的潜水艇,能够深入探索数据的奥秘。

强调Spring对于简化数据访问和事务管理的贡献

Spring的贡献不仅仅在于提供了这些工具和框架,更重要的是它改变了我们处理数据访问和事务管理的方式。通过Spring,开发者可以更加专注于业务逻辑的实现,而不是被底层的数据库操作所困扰。

1. 开发效率的提升

Spring通过提供简化的API和声明式配置,显著提高了开发效率。开发者可以用更少的代码做更多的事情,就像是航海家Spring用更少的力气驾驭更大的船。

2. 代码的可维护性

Spring倡导的编程范式和设计模式,如依赖注入(DI)和面向切面编程(AOP),提高了代码的可读性和可维护性。这就像是航海图上的清晰标记,让后来的航海家能够更容易地理解和使用。

3. 数据一致性的保障

通过Spring的事务管理,我们能够确保数据库操作的一致性,避免了数据的不一致和潜在的错误。这就像是航海家Spring在航行中始终坚守的信条,无论遇到多大的风浪,都要确保货物的安全。

随着我们的航海之旅即将结束,航海家Spring已经准备好迎接新的挑战。在未来的航程中,Spring将继续作为我们最可靠的伙伴,带领我们在数据的海洋中探索更多的未知和可能。


参考文献

  • Spring官方文档:Spring Framework Documentation
  • JPA官方文档:Java Persistence API
  • Hibernate官方文档:Hibernate ORM Documentation

希望看官们喜欢这次和Spring一起的冒险之旅,如果你有任何问题或者想要继续探索,记得随时回来找俺,Spring的航海图永远为你展开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux进程(三) --- 状态和优先级

运行&#xff0c;阻塞&#xff0c;挂起 运行 (Running) 当一个进程处于运行状态时&#xff0c;它正在使用CPU执行指令。进程在以下两种情况下可能被认为是运行状态&#xff1a; 实际运行&#xff08;Running on CPU&#xff09;&#xff1a; 进程当前正在CPU上执行。可运行&…

ES6之数值的扩展

1. 数值的扩展 1.1. 二进制和八进制字面量表示:1.2. 数值判断方法: 1.2.1. Number.isFinite() 检查一个值是否为有限的数值。1.2.2. Number.isNaN() 更准确地检测NaN值。1.2.3. 传统的全局方法 isFinite() 和 isNaN() 的区别 1.3. 数值转换方法:1.4. 整数检查与精度: 1.4.1. Nu…

UDP多对多组播通信

广播和多播仅应用于UDP。TCP是一个面向连接的协议&#xff0c;TCP一定是点对点的&#xff0c;一点是两个主机来建立连接的&#xff0c;TCP肯定是单播。只有UDP才会使用广播和组播。 如下示例实现一个UDP多对多的组播通信&#xff0c;进程中有收、发两个线程&#xff0c;分别表…

数字水印 | 奇异值分解 SVD 的定义、原理及性质

目录 1 为什么使用 SVD&#xff1f;2 SVD 的定义是什么&#xff1f;2.1 特征值分解2.2 奇异值分解 3 如何求解奇异值 SV&#xff1f;3.1 求解过程3.2 证明过程 4 什么是 SVD 的性质&#xff1f; 参考博客&#xff1a; Python 机器学习笔记&#xff1a;奇异值分解&…

Java入门基础学习笔记23——For循环结构

1、for循环&#xff1a; 控制一段代码反复执行很多次。 2、For循环语句的基本结构&#xff1a; for(初始化表达式&#xff1b;判断表达式&#xff1b;递增&#xff08;递减&#xff09;表达式&#xff09; {循环体语句&#xff08;重复执行的代码&#xff09; } 例&#xff1…

积温空间分布数据、气温分布数据、日照数据、降雨量分布、太阳辐射数据、地表径流数据、土地利用数据、npp数据、ndvi数据

引言 积温是某一时段内逐日平均气温之和,它是研究植物生长、发育对热量的要求和评价热量资源的一种指标,是影响植物生长的重要因素之一&#xff0c;对指导农业生产和生态建设具有非常重要的意义。作为重要的气候资源&#xff0c;积温与其它资源的区别在于存在很大的地域差异和时…

【再探】设计模式—桥接模式、组合模式及享元模式

结构型设计模式描述了对象与类之间的关系。适配器模式及装饰器模式主要用于接口适配及功能增强&#xff0c;而桥接模式模式则是为了减少类的数量&#xff0c;组合模式让部分与容器能被客户端统一对待处理&#xff0c;享元模式则是用于节约系统内存&#xff0c;提高系统性能。 …

kk聊天室系统源码搭建-自适应手机电脑-秒级响应-群体消息

kk聊天室系统源码搭建-自适应手机电脑-秒级响应-群体消息-单体消息 可以无限创建聊天室&#xff0c;可以把单个聊天室链接拿出来单独使用&#xff0c;消息秒级响应&#xff0c;支持设置屏蔽词。 具体仔细看视频演示&#xff0c;不提供演示&#xff0c;因为青狐资源网会员用户太…

第25次修改留言板,修改了布局,样式和脚本分离

伤心城市 首页 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"beiwanglu" content"widthdevice-width, initial-scale1.0"><link rel"stylesheet" type&qu…

每周题解:牛的旅行

题目描述 牛的旅行 农民John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言&#xff0c;你能看到至少有两个牧区不连通。 现在&#xff0c;John想在农场里添加一条路径 ( 注意&#xff0c;恰好一条 )。对这条路径有这样的…

宁静致远(“静”)

宁静致远是一个成语&#xff0c;读音为nng jng zh yuǎn&#xff0c;意思是只有心境平稳沉着、专心致志&#xff0c;才能厚积薄发、 有所作为。出自《淮南子:主术训》。 出处 宁静致远张铭篆刻 此句最早出自西汉初年道家刘安的《淮南子:主术训》&#xff0c;蜀汉丞相诸葛亮的…

​学者观察 | 从区块链应用创新看长安链发展——CCF区块链专委会荣誉主任斯雪明

导语 2024年1月27日&#xff0c;斯雪明教授在长安链发布三周年庆暨生态年会上发表演讲&#xff0c;认为在区块链发展过程中&#xff0c;不仅需要技术创新&#xff0c;同时需要有价值、有特色、有示范意义的应用创新。斯雪明教授介绍了国内区块链技术与应用发展的现状、趋势与挑…

C++ I/O流(一)——输出流

一、IO流概念 IO流可分为输入流和输出流,用于从设备(如键盘、文件、网络等)读取数据或向设备写入数据。C++标准库提供了丰富的IO流类,包括iostream、fstream、stringstream等,分别用于处理控制台输入输出、文件输入输出和字符串流操作。 读操作:输入流中读取数据到程序中…

CTFshow 爆破

第一题0 抓包发现输入账号密码后数据包会多一个base64编码 所有推出用户密码在传输的时候进行了加密 所以爆破时也用base64加密 设置paylod 用题目给的字典 在添加两条规则 第一个是增加前缀 admin: 第二个是使得payload进行base64编码 取消URL编码字符 因为会把号编码了 开…

C# .Net8 switch 的用法

在 .net 8中&#xff0c;switch 不需要再和传统的写法一样了&#xff0c;会更加的方便 创建一个 .net 8 控制台项目 switch 的写法没必要和以前一样 namespace SwitchTest {internal class Program{static void Main(string[] args){int day 3;var week day switch{1 > &…

SAP_ABAP-思考篇

作为一个SAP十年左右的从业者&#xff0c;其实我很清楚&#xff0c;我自身的能力&#xff0c;确实是很多东西都会一点&#xff0c;但是没有一样是精通的。坦白来说&#xff0c;我的个人简介里&#xff0c;虽然也不算夸大&#xff0c;但我估计有些新手小白看着可能会觉得还挺厉害…

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边&#xff0c;可以通过油漆桶工具&#xff08;取消 “连续”&#xff09;&#xff0c;就把红色的轮廓线&#xff0c;变成黑色的 同时用吸管工具&#xff0c;吸取绿色和白色&#xff0c;用油漆桶填充颜色 4 加上阴影…

论文阅读-《MHFormer: Multi-Hypothesis Transformer for 3D Human Pose Estimation》

目录 1 摘要 2 介绍 3 相关工作 3.1 3D HPE 3.2 ViT 3.3 多假设方法 4 MHFormer 4.1 概述 4.2 准备阶段 4.2.1 多头自注意力机制&#xff08;MSA&#xff09; 4.2.2 多层感知器&#xff08;MLP&#xff09; 4.3 MHG-多假设生成 4.3.1 概述 4.3.2 详细解释&#x…

基于Vue和uni-app的增强型多选框Checkbox组件开发

基于Vue和uni-app的增强型多选框&#xff08;Checkbox&#xff09;组件开发 摘要 随着前端技术的不断发展和用户体验要求的提升&#xff0c;传统的Checkbox组件已不能满足所有需求。本文介绍了一种基于Vue和uni-app的增强型多选框&#xff08;Checkbox&#xff09;组件的开发…

一文了解人工智能AI、大模型、AI大模型、ChatGPT、GPT-4、OpenAI、Claude 3...

AI是什么&#xff1f; 首先&#xff0c;AI是什么&#xff1f; 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 简单来说就是模拟人类行为…