【问题标题】:Java - Make a simple SQL callJava - 进行简单的 SQL 调用
【发布时间】:2018-12-14 06:57:38
【问题描述】:

我有一个应用程序,用户在输入框中输入一些 SQL 字符串,我想返回该字符串的 JSON 数据。

我有字符串,现在如何获取数据并返回它?

有没有办法让这更安全,只允许用户选择内容而不是更新/删除/删除?

@RequestMapping("/api")
@RestController
public class Controller {

    @GetMapping
    public List<Object> returnData(@RequestParam String query) {
       //return the data from que query
    }
}

我正在使用 JPA + Hibernate + Spring Boot

【问题讨论】:

  • 问题是,这样做的目的是什么?
  • 我想用数据生成 .json 文件来测试另一个应用程序。这是一个仅供我使用的应用程序。
  • 然后为确保安全,为您的帐户创建一个角色(授权)
  • 说像这样的话没人知道吗?这应该是基本的东西在这里被认为是粗鲁的。如果它对您来说如此基本,您为什么不通过谷歌搜索找到它?请不要在未来制造这样的 cmets。这是一个您寻求帮助的网站,并且试图嘲笑那些试图帮助您的人很糟糕。
  • 有没有办法让这个更安全,只允许用户选择内容而不是更新/删除/删除? - 是的,在数据​​库上授予/权限水平。

标签: java hibernate spring-boot jpa


【解决方案1】:

您可以使用org.springframework.jdbc.core.JdbcTemplate 来执行普通的sql。 只需创建一个简单的 bean:

  @Bean
  public JdbcTemplate healthJdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
  }

您可以自动装配 jdbcTemplate 并执行普通的 sql 查询

@Autowired
private JdbcTemplate jdbcTemplate;

之后,您可以使用queryForList 方法获取所需的数据。 例如,如果您有一个包含以下数据的 people 表:

id  first_name last_name, add_info, company_id
1      fn1       ln1       info1        1
2      fn2       ln2       info2        1
3      fn3       ln3       info3        1
4      fn4       ln4       info4        1

还有一张公司表:

id company_name
1  test_company1

您使用以下代码检索数据:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
public class Controller {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @GetMapping("/api/test")
    List<Map<String, Object>> getData() {
        return jdbcTemplate.queryForList("Select * FROM public.persons p JOIN public.companies c" +
                " ON p.company_id = c.id");
    }
}

结果将是

[{"id":1,"f_name":"fn1","l_name":"ln1","add_info":"info1","company_id":1,"company_name":"test_company1"},{"id":1,"f_name":"fn2","l_name":"ln2","add_info":"info2","company_id":1,"company_name":"test_company1"},{"id":1,"f_name":"fn3","l_name":"ln3","add_info":"info3","company_id":1,"company_name":"test_company1"},{"id":1,"f_name":"fn4","l_name":"ln4","add_info":"info4","company_id":1,"company_name":"test_company1"}]

根据 cmets 中的问题进行更新:

javax.sql.DataSource 是一个由 spring 自动配置的 bean(除非您覆盖配置或禁用它)。 JdbcTemplate 需要此 bean,因为它包含有关 JdbcTemplate 将在其上执行查询的数据库的信息。 默认情况下,它使用 application.properties(或在下面的情况下为 application.yml)文件中的以下属性。例如:

spring:
  datasource:
    username: someusername
    password: somepassword
    url: jdbc:postgresql://localhost:5432/dbname
    driver-class-name: org.postgresql.Driver

【讨论】:

  • OP 询问如何“只允许用户选择内容而不是更新/删除/删除”,您没有解决这个问题。
  • 现在还好。我总是可以验证查询是否包含这些单词而不执行查询,我猜
  • 这是他要问的第二个问题。我认为这是一个额外的问题。他还说他不需要 cmets 的安全性,因为他将是唯一使用该应用程序的人。
  • 那个数据源的导入是什么?
  • 好的。我放豆子吗?在一个普通的java类里面?我是否需要调用 bean 或向类添加任何内容?
猜你喜欢
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多