如何使用spring jdbctemplate而不是Java中的直接插入查询来调用PostgreSQL函数?

时间:2017-06-05 14:21:34

标签: java postgresql jdbctemplate

我是PostgreSQL的新手。我需要从spring jdbctemplate调用postgresql函数来存储Employee表的详细信息。下面是我的代码,我在其中使用插入查询来存储Employee详细信息。我需要用Postgresql函数替换插入查询 - " UpdateEmployee"。

@Autowired
JdbcTemplate postgressqljdbctemplate;


@Override
public void update(Employee employee) {
String SQL = "insert into employee(Id, name, age, salary) values (?,?,?,?)";
postgressqljdbctemplate.update(SQL, new Object[] { employee.getId(), employee.getName(),
employee.getAge(), employee.getSalary()});
}

1 个答案:

答案 0 :(得分:3)

好的,你应该做的第一件事就是设计插入/更新数据的功能。 Postgres支持多种语言,但最受欢迎的是plpgsql。

该功能本身可能如下:

CREATE OR REPLACE FUNCTION update_employee(p_id INT, p_name VARCHAR(255), p_age INT, p_salary DECIMAL)
  RETURNS INT
LANGUAGE plpgsql
AS $$
BEGIN
  IF p_id IS NULL
  THEN
    INSERT INTO employee (name, age, salary) VALUES (p_name, p_age, p_salary) RETURNING id INTO p_id;
  ELSE
    UPDATE employee
    SET name = p_name, age = p_age, salary = p_salary
    WHERE id = p_id;
  END IF;
  RETURN p_id;
END;
$$;

现在,如果您使用null作为ID调用此函数,它将插入数据,否则数据将按指定的ID找到并更新。

在这两种情况下,您都会获得修改过的记录的ID。

SELECT update_employee(NULL, 'John', 42, 100000);  -- insert (returns 1)
SELECT update_employee(1, 'John Smith', 42, 200000); -- update previous record

将插入函数与更新分开会更好,但它只是一个示例。

因此,您可以使用例如SimpleJdbcCall来调用spring函数:

final SimpleJdbcCall updateEmployeeCall = new SimpleJdbcCall(jdbcTemplate).withFunctionName("update_employee");
final Map<String, Object> params = new HashMap<>();
params.put("p_id", null);
params.put("p_name", "John");
params.put("p_age", 28);
params.put("p_salary", 150000);

final Map<String, Object> result = updateEmployeeCall.execute(params);
System.out.println(result.get("returnvalue"));