专业编程基础技术教程

网站首页 > 基础教程 正文

如何理解Spring Boot中使用的什么是嵌入式SQL?什么是动态SQL?

ccvgpt 2025-04-08 12:08:58 基础教程 9 ℃

嵌入式SQL和动态SQL是两种在应用程序中使用SQL的方式

嵌入式SQL是在编程语言中在编译的时候就被解析的SQL语句,并且在编译的时候就已经被转换成了可以调用的代码,通常用在一些与数据库进行频繁交互的场景中。

如何理解Spring Boot中使用的什么是嵌入式SQL?什么是动态SQL?

而动态SQL是则是指在程序运行过程中才被动态构建并且执行的SQL语句。这种方法允许在程序运行时根据具体情况生成SQL语句,具有更高的灵活性。

在Spring Boot中,通过使用不同的技术和框架来实现嵌入式SQL和动态SQL。下面我们就来详细看看二者的实现。

嵌入式SQL

在SpringBoot应用中,我们可以通过JPA技术或者是通过Spring Boot JPA技术来实现嵌入式的SQL操作,这种方式在编译的时候就定义好的执行的语句,并且通过注解或者是命名的方式进行操作,如下所示。

使用JPA和Spring Data JPA的示例

实体类代码,如下所示。

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee {
    @Id
    private Long id;
    private String name;

    // Getters and setters
}

Repository接口实现,如下所示

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface EmployeeRepository extends JpaRepository {
    
    // 使用JPA命名查询方法
    Employee findById(Long id);
    
    // 使用@Query注解进行嵌入式SQL查询
    @Query("SELECT e FROM Employee e WHERE e.id = :id")
    Employee findEmployeeById(@Param("id") Long id);
}

使用测试代码,如下所示

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public Employee getEmployeeById(Long id) {
        return employeeRepository.findById(id).orElse(null);
    }
}

上面这种方式,SQL的查询操作在编译的时候就已经被确定了,由Spring Data JPA来控制进行操作。

动态SQL

在SpringBoot中,通过Spring JDBC Template或者是通过MyBatis技术来实现动态SQL的操作,动态SQL允许在运行时根据条件生成SQL语句,所以具有更高的灵活性,如下所示。

使用Spring JDBC Template的示例

配置数据库

spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=password

在Service类中使用JDBC Template完成数据操作,如下所示。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public String getEmployeeNameById(Long id) {
        String sql = "SELECT name FROM employees WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, String.class);
    }
}

使用MyBatis的示例

在代码中配置Mapper接口类并且通过注解的方式来实现动态SQL的编写,如下所示。

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface EmployeeMapper {
    
    @Select("SELECT name FROM employees WHERE id = #{id}")
    String findEmployeeNameById(Long id);
}

Service类中使用Mapper来完成条件查询操作如下所示。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeMapper employeeMapper;

    public String getEmployeeNameById(Long id) {
        return employeeMapper.findEmployeeNameById(id);
    }
}

总结

根据上面的介绍我们知道,对于嵌入式SQL操作在SpringBoot中使用JPA技术来实现,通常适合比较固定的查询场景,而动态的SQL则是通过JDBCTemplate技术和MyBatis框架来实现,通常情况下适合一些比较灵活的数据查询场景。

Tags:

最近发表
标签列表