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

标签 java postgresql jdbctemplate

我是 PostgreSQL 的新手。我需要从 spring jdbctemplate 调用 postgresql 函数来存储 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()});
}

最佳答案

好的,您应该做的第一件事是设计用于插入/更新数据的函数。 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"));

关于java - 如何使用 spring jdbctemplate 而不是在 Java 中直接插入查询来调用 PostgreSQL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371117/

相关文章:

java - Mockito:mock-maker-inline Android GcmNetworkManager mock java.lang.VerifyError Google Play Services v11.0.2

java - 正则表达式仅匹配域,而忽略url中的子域

java - 添加到我的方法快速文档描述(android studio)

python - Django 在 OS X Mavericks 上找不到 libssl

django - Django 1.7、uwsgi 和 PostgreSQL 的随机数据库错误

sql - 分片数据库中的参照完整性?

java - 如何查询NamedJdbcTemplate中的单个列?

mysql - 使用 JDBCTemplate 对 varchar 值求和

java - 如何在postgreSql中使用JDBCTemplate batchUpdate捕获错误记录?

java - 带有 MariaDB 驱动程序的 MySQL 服务器产生日期排序错误