在Java中,如何将数据持久化到PostgreSQL

・8 分钟阅读

在本教程中,我们创建一个能够连接到PostgreSQL数据库的示例Java程序,并写入数据,为了检查数据插入是否成功,我们还实现读取,并打印表的数据信息。

在本教程中,你将学习:
  • 如何为应用程序设置数据库
  • 如何将PostgreSQL JDBC驱动程序导入到项目中
  • 如何将数据插入数据库
  • 如何运行简单查询来读取数据库表的内容
  • 如何打印获取的数据
  • 运行应用程序的结果。

软件需求和约定

软件需求和Linux命令行约定
20.04
NetBeans IDE 8.2,PostgreSQL 10.12,jdk 1.8
以Linux系统root或通过sudo命令的权限访问,
#linux命令以root特权直接作为root用户执行,或使用sudo命令执行
$-linux命令以普通非特权用户身份执行

安装程序




就本教程而言,我们只需要一个工作站(台式机或笔记本电脑)即可安装所有必需的组件。我们假定名为exampledb的数据库已经启动,并运行,可以使用密码身份验证连接,读取和写入,并有以下凭据:

用户名: 示例用户
密码: ExamplePass

数据库被设置为监听localhost,当我们构造JDBC connection URL时需要它。

设置应用程序的数据库

以下SQL脚本:


create sequence resultid_seq start with 0 increment by 1 no maxvalue minvalue 0 cache 1;
alter sequence resultid_seq owner to exampleuser;
create table calc_results (
 resid numeric primary key default nextval('resultid_seq'::regclass),
 result_of_calculation numeric not null,
 record_date timestamp default now()
);
alter table calc_results owner to exampleuser;

这些指令应该自己说,我们创建了一个序列,我们创建了一个序列,将所有者设置为yf Ustr UHRRW6ZDFFHYGK6DBNVYGYYGYVYONGXCR4F5RW6ZDFHY8888888除除Uyf以外的其他方面,创建一个表,名为yf UUUUU相反,我们创建了一个表,名为yf U除U外,其余的表名为yf,命名为yf U,全部改名为WG3改名,改名为QGM33SeaQCEA8,除yfr外,计算结果除计算结果yf外,还包括计算结果yf U外,还计算结果除除计算结果外,除计算结果外,除除除外,还计算结果除计算结果除除除U括号,将��sid =�m쌧设置为在每次插入时使用我们序列的下一个值自动填充,并定义将存储数据的|�n�΋����l-�հ�Q���^����|和��k{�"�#�列,,表的所有者设置为exampleuser

要创建这些数据库对象,我们切换到postgres user:

$ sudo su - postgres

exampledb数据库运行脚本(存储在名为table_for_java.sql的文本文件中):


$ psql -d exampledb < table_for_java.sql 
CREATE SEQUENCE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE

现在。我们有了这个数据库。

将PostgreSQL JDBC驱动程序导入到项目中



为了构建应用程序,使用NetBeans IDE 8.2,前几个步骤是手工操作,选择文件菜单,创建新项目,我们将在向导的下一页上保留默认值,类别为"Java",项目为"Java Application"。下一步,我们为应用程序命名(并可以选择定义一个非默认位置)。在例子中,它被称为persistToPostgres,IDE为我们创建一个基本的Java项目。

在"项目"窗格中,我们右键单击"Libraries",然后选择"Add Library ..."。将出现一个新窗口,我们在其中搜索并选择PostgreSQL JDBC Driver,并将其添加为库。

将PostgreSQL JDBC驱动程序添加到项目中。

了解源代码

现在,以下源代码添加到应用程序的main类persistToPostgres中:


package persisttopostgres;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.ThreadLocalRandom;

public class PersistToPostgres {
 public static void main(String[] args) {
 int result = ThreadLocalRandom.current().nextInt(1, 1000 + 1);
 System.out.println("Result of the hard-to-solve calculation is: " + result);
 System.out.println("-----PostgreSQL JDBC Connection testing------");
 try {
 Class.forName("org.postgresql.Driver");
 } catch (ClassNotFoundException cnfe) {
 System.out.println("No PostgreSQL JDBC Driver in library path!");
 cnfe.printStackTrace();
 return;
 }
 System.out.println("PostgreSQL JDBC Driver registered!");
 Connection conn = null;
 
 try { 
 conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/exampledb", "exampleuser", "ExamplePass");
 } catch (SQLException sqle) {
 System.out.println("Connection failed! Check output console");
 sqle.printStackTrace();
 return;
 }
 if (conn != null) {
 System.out.println("Database connection established");
 // building query
 try {
 Statement st = conn.createStatement();
 st.executeUpdate("Insert into calc_results (result_of_calculation) values(" + result + ")" );
 ResultSet rs = st.executeQuery("select resid, result_of_calculation, record_date from calc_results");
 System.out.println ("Results recorded in exampledb follows:n-----------------------n");
 while (rs.next()) {
 System.out.println (rs.getString("resid") + "t" + rs.getString("result_of_calculation") + "t" + rs.getString("record_date"));
 }
 // clean on exit
 st.close();
 conn.close();
 } catch (SQLException sqle2) {
 System.out.println ("Error on query");
 sqle2.printStackTrace();
 }
 } else {
 System.out.println("Failed to make connection!");
 }
 }
}



运行应用程序

现在,我们可以从IDE构建和运行persistToPostgres应用程序,要从IDE运行,我们可以使用顶部的"运行项目"按钮。要从命令行运行它,我们需要导航到项目的dist目录,并使用JAR包作为参数调用JVM。


$ java -jar persistToPostgres.jar 
Result of the hard-to-solve calculation is: 173
-----PostgreSQL JDBC Connection testing------
Database connection established
Results recorded in exampledb follows:
-----------------------

0 145 2020-05-31 17:40:30.974246

尽管这个简单的应用程序几乎没有任何实际用途,但它是演示某些重要功能的理想选择,因为本教程的目的是展示如何持久存储数据。

Xn_warm profile image