如何从属性文件中读取 SQL 查询

Posted

技术标签:

【中文标题】如何从属性文件中读取 SQL 查询【英文标题】:How to read SQL queries from a properties file 【发布时间】:2020-10-16 02:29:15 【问题描述】:

我有一个传统的 spring mvc 应用程序,它使用 spring jdbc 作为 ORM。现在我想使用spring boot,而不是mvc,我将把它转换成RestAPI。我对数据库查询部分有疑问。使用 propertyplaceholder xml conf,在旧应用程序中配置外部 sql 查询属性文件。使用 Spring boot 和最新的注释方法,我该如何配置它。我的理解是

    将查询属性文件放在src/main/resources目录中 在 DAO 中创建与 sql 的键 (name) 相同的属性名称。 为 key 属性创建 getter 和 setter

这是正确的方法吗?如果是,如果我使用它,我将如何在我的 DAO 类中获取查询?如果不是最好的方法是什么。

【问题讨论】:

为什么要将 SQL 放在属性文件中? 很少有大型查询。由于它是一个已经存在的应用程序,我想按原样使用它。 【参考方案1】:

这不是一个好方法,但您可以通过多种方式做到这一点,当您使用数据库和 Spring Boot 时,我总是接近使用 JPA

application.yml

 emp:
    eid: "select eid from employee"
    name: "select ename from employee"

在模型包下为Employee创建一个类

 @ConfigurationProperties("emp")
  @Getter
  @Setter
  public class Employee
 
      private List<Integer> eid;
      private List<String> ename;
 

在config包下为Employee创建一个bean实例

@Configuration
public class Config

     @Bean
     public Employee getEmployee()
    
         return new Employee();
    

然后您可以在项目中需要时调用 Employee 实例

@RestController
public class EmpController

    @Autowired
    Employee emp;

【讨论】:

就我而言,我有 1200 个 SQL 查询,其中大部分都是非常复杂的查询。没有特定的实体类,它是一个遗留的单体应用程序。 如果您没有针对每个实体的特定表,那么请使用本机查询,否则您在创建关系时必须面对困难,复合类之类的东西 现有代码也使用springJDBC。用 Spring data jdbc 或 spring data jpa 替换它将是一项乏味的工作。【参考方案2】:

发布此问题后,我没有得到太多回应。所以我从我身边做了一些工作,并以我在问题中提到的相同方式修复它。我没有找到任何其他方法。

首先是一个用于 PropertySourcesPlaceholderConfigurer 的 java 类 ApplicationPropertyConfig。属性源文件是我的sql属性文件。

@Configuration
@PropertySource("classpath:appSql.properties")
public class ApplicationPropertyConfig 

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() 
        return new PropertySourcesPlaceholderConfigurer();
    

appSql.properties

selectallemployees=select * from employee;

创建了另一个名为 ApplicationSQLWrapper.java 的类,该类用@Component 进行了注释。这包含与带有@value 注释的sql 属性键相同的属性名称。

@Component
public class ApplicationSQLWrapper 
    
    @Value("$selectallemployees")
    private String selectallemployees;

//getter and setter

可以通过创建 Component 类的 Object 从 DAO 类访问此 SQL。

【讨论】:

能否请您展示您的 DAO 类以及您如何实现此 sql 查询?我试图实现同样的目标 为 ApplicationSQLWrapper.java 中的每个属性创建 getter 和 setter,并在 DAO 中创建 SQLWrapper 的对象(自动装配)并使用 getter 访问查询。

以上是关于如何从属性文件中读取 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性

关于查询数据表属性的SQL代码

Spring - 通过@Value 读取具有多行属性值的 YAML

pyspark读取textfile形成DataFrame以及查询表的属性信息

如何在 SQL 查询中的两行上写属性名称

什么是更好的 sql 或使用 spring 注入属性