数据库的select几种方式的优缺点

本文探讨了三种不同的SQL查询方式:联表查询、循环查询及批量IN查询,对比了它们各自的优缺点,旨在帮助读者理解如何根据实际情况选择合适的查询策略。
1、SELECT A.*,B.* FROM table_A A LEFT JOIN table_B b ON B.id = A.id
优点:一次查询,打开一次数据库连接,打开数据库连接比较耗时,耗性能,所以相当于用空间换时间
缺点:是如果两个表数据多,则中间结果集太大,需要较多的内存资源。

2、 $result = SELECT id FROM table_A;
$data=array();
foreach($result as $res){
$data[]=SELECT * FROM table_B WHERE id = $res[‘id’];
}
优点:
缺点:需要打开多次数据库连接,关闭数据库连接,比较耗性能,耗时,比如:数据库连接池有100个连接的话,这个循环就会占据很多连接,导致其他人需要重新new
优点:需要对每一次查询的结果做处理的话,可以增加灵活性
3、$result = SELECT id FROM table_A
$ids = array();
foreach($result as $res){
$ids[]=$res[‘id’];
}
$ids = implode(“,”,$ids):
$data=SELECT * FROM table_B WHERE id IN ($ids);
缺点:in的话,每次都会遍历一遍ids,效率会很慢,并且in在用子查询到的时候不支持索引,会进行全表扫描
优点:当数据量非常少,少到不需要使用索引的时候,执行全表扫描的更快





delimiter $$                     #创建一个储存过程
createprocedure test()
begin
set@a=1;     #学号
while @a<20000 do     #如果@a<2000010001则返回true,继续执行
insertinto user_core values(@a);
set@a=@a+1;
endwhile;
end$$
delimiter ;

在 Spring Boot 项目中,连接数据库方式主要有以下几种: --- ### 1. 使用 `JdbcTemplate` `JdbcTemplate` 是 Spring 提供的一个简化数据库操作的工具类,封装了底层的 JDBC 操作,简化了数据库访问逻辑。 **优点**:轻量级、简单易用、适合小型项目或快速开发。 **缺点**:不支持 ORM,需要手动编写 SQL。 **示例代码:** ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Map; @Repository public class MyRepository { @Autowired private JdbcTemplate jdbcTemplate; public List<Map<String, Object>> getAllUsers() { return jdbcTemplate.queryForList("SELECT * FROM users"); } } ``` --- ### 2. 使用 `MyBatis` MyBatis 是一个半自动的 ORM 框架,允许开发者灵活控制 SQL,同时提供映射机制将结果映射为 Java 对象。 **优点**:灵活控制 SQL,适合对性能有较高要求的场景。 **缺点**:需要手动编写 SQL 和映射文件。 **集成方式:** - 添加依赖: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> ``` - 配置数据源和 MyBatis 映射文件路径。 **示例 Mapper:** ```java @Mapper public interface UserMapper { @Select("SELECT * FROM users") List<User> findAll(); } ``` --- ### 3. 使用 `Hibernate / JPA` JPA(Java Persistence API)是 Java EE 的 ORM 规范,Hibernate 是其实现之一。Spring Boot 提供了对 JPA 的良好支持。 **优点**:全自动 ORM,支持实体类与数据库表自动映射,适合中大型项目。 **缺点**:学习成本较高,对复杂 SQL 控制不够灵活。 **集成方式:** - 添加依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` - 定义实体类和 Repository 接口。 **示例实体类:** ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // getters and setters } ``` **示例 Repository:** ```java public interface UserRepository extends JpaRepository<User, Long> { } ``` --- ### 4. 使用 `JPA + QueryDSL` QueryDSL 是一个类型安全的查询构建器,可以与 JPA 结合使用,提供更灵活的查询方式。 **优点**:类型安全、支持链式查询、适合复杂查询场景。 **缺点**:配置略复杂,需要生成查询类。 **集成方式:** - 添加依赖: ```xml <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>5.0.0</version> </dependency> ``` - 使用 QueryDSL 构建查询: ```java QUser user = QUser.user; List<User> result = queryFactory.selectFrom(user) .where(user.name.eq("Alice")) .fetch(); ``` --- ### 5. 使用 `Spring Data REST` Spring Data REST 是 Spring Data 的一个子项目,可以基于 JPA 自动暴露 RESTful 接口。 **优点**:快速生成 REST API,适合前后端分离项目。 **缺点**:灵活性差,不适合复杂业务逻辑。 **集成方式:** - 添加依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> ``` - 定义 Repository 即可自动生成 REST 接口。 --- ### 总结对比: | 方式 | 是否 ORM | 灵活性 | 适用场景 | |------------------|----------|--------|---------------------------| | JdbcTemplate | 否 | 高 | 简单项目、快速开发 | | MyBatis | 半自动 | 高 | 需要控制 SQL 的项目 | | JPA / Hibernate | 全自动 | 中 | 中大型项目、快速开发 | | JPA + QueryDSL | 全自动 | 高 | 复杂查询、类型安全场景 | | Spring Data REST | 全自动 | 低 | 快速生成 REST API | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值