用Java运行PostgreSQL
试试在Java中运行PostgreSQL。
环境
-
- macOS Mojave
-
- Eclipse 4.7.3
-
- PostgreSQL 11.4
- JDBC Driver 42.2.5(postgresql-42.2.5.jar)
引入JDBC驱动程序
访问PostgreSQL关系数据库需要使用Java的标准API,需要JDBC驱动程序。
首先,從下載開始。
https://jdbc.postgresql.org/download.html#current的内容可以用以下方式进行表述:
在这里使用postgresql-42.2.5.jar。
将其放置在此次项目的任意位置(lib中可能更明确吧?)
![スクリーンショット 2019-07-23 16.28.17.png](https://cdn.silicloud.com/blog-img/blog/img/657d0d9537434c4406beb387/9-0.png)
然而,由于无法确定引用的位置,所以需要设置路径。
如果是Mac的话
点击postgresql-42.2.5.jar,进入项目选项卡 –> 属性 –> Java构建路径 –> 库 –> 添加外部JAR –> 查找并打开postgresql-42.2.5.jar –> 确定并关闭窗口
如果参照库中引用了postgresql-42.2.5.jar,则表示正常。
![スクリーンショット 2019-07-23 16.41.34.png](https://cdn.silicloud.com/blog-img/blog/img/657d0d9537434c4406beb387/14-0.png)
用于数据库
这次我们将全部重复利用之前使用过的东西。
用户请看以下内容:
customer=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------------+----------+---------+-------+-----------------------
customer | sf213471118 | UTF8 | C | C |
使用客户表的表格
customer=# \d
List of relations
Schema | Name | Type | Owner
--------+----------+-------+-------------
public | customer | table | sf213471118
顾客数据表的内容如下所示。
customer=# SELECT * FROM customer;
id | name | gender | age
-----------------+----------+--------+-----
10001 | 田中太郎 | m | 31
10002 | 中村花子 | w | 44
10003 | 佐藤一郎 | m | 20
10004 | 内田彩 | w | 18
10005 | 高橋次郎 | m | 56
10006 | 中里悟 | m | 34
(6 rows)
Java编程中重要的部分
在记录的过程中要记得留下一些不想忘记的要点。 de liú xià bù de .)
异常处理
public static void main(String[] args) throws Exception {
try {
System.out.println("DB access start");
PostgreSQL_test.dbConnect();
} catch (Exception e) {
System.out.println("error main()");
e.printStackTrace();
} finally {
System.out.println("DB access finished");
}
}
在编写代码时,我们可以使用try-catch(-finally)来处理异常情况。
在这个例子中,由于将异常指定为Exception e,只能确定错误发生的位置,但通过改变catch的条件并进行并行描述,也可以立即了解错误的内容。
例如
try {
file_reader = new FileReader(customer);
~
} catch (FileNotFoundException f) { // ファイル探索エラー
System.out.println("cannot find file");
f.printStackTrace();
} catch (IOException i) { //ファイル入出力エラー
System.out.println("in/out error");
i.printStackTrace();
} finally {
try {
if(file_reader != null) {
file_reader.close();
}
} catch (IOException i) { //ファイルclose中エラー
System.out.println(i);
i.printStackTrace();
}
}
假设有这样的流程可以实现
尝试-捕捉-捕捉方面
new FileReader(customer)をしたがそのファイル名が見つからないとき
customerファイルはあるが出力できなかったとき
考虑到这两点,进行了分支。
②最终 – 尝试 – 捕获的方案
- close中のエラー
仅仅检测到。
除了FileNotFoundException和IOException之外,还存在许多其他的异常处理情况,但如果使用Exception,就可以捕捉到所有的错误(参考上述程序,除了能够定位问题的位置之外,想不出其他更好的方法)。
为了与数据库建立连接
JDBC的初始化
在连接到数据库之前,需要先初始化JDBC驱动程序。
如果是PostgreSQL的话,可以按照以下的方式来描述。
Class.forName("org.postgresql.Driver").newInstance();
建立数据库连接/断开数据库连接
为了建立与数据库的连接,需要使用DriverManager类的getConnection方法,该方法在标准库中存在。
connection = DriverManager.getConnection( <URL> , <USER>, <PASSWORD>);
在URL方面,可以使用jdbc:postgresql://<位置>:<端口号>/<数据库名>来表示。
这次是根据以下设置的。
就断电而言,为了防患于未然,最好在最后才实施。
rs.close(); //rsはResultSetインターフェースの変数
SQL语句的描述
当将SQL发送到数据库时,首先需要使用Connection接口中定义的createStatement方法创建语句(必须与发送的SQL一起填写的内容)。
statement = con.createStatement();
结束上述内容后,进行SQL查询语句的描述。
resultset = stm.executeQuery(" <SQL文> ");
数据的输出
可以使用 ResultSet接口的 next()方法逐行进行处理。
while (rs.next()) {
System.out.println(rs.getInt("<column>"));
System.out.println(rs.getString("<column>"));
}
这次的Java编写代码。
package customer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class PostgreSQL_test {
public static void main(String[] args) throws Exception {
try {
System.out.println("DB access start");
PostgreSQL_test.dbConnect();
} catch (Exception e) {
System.out.println("error main()");
e.printStackTrace();
} finally {
System.out.println("DB access finished");
}
}
private static void dbConnect() throws Exception {
Connection con = null;
Statement stm = null;
ResultSet rs = null;
int num = 1;
String url = "jdbc:postgresql://localhost:5432/customer";
String user = "sf213471118";
String password = ""; //今回パスワードは設定していない
try {
Class.forName("org.postgresql.Driver").newInstance();
con = DriverManager.getConnection(url, user, password);
stm = con.createStatement();
rs = stm.executeQuery("SELECT * FROM customer");
while (rs.next()) {
System.out.println("[" + num + " 件目]");
num++;
System.out.println("id : " + rs.getString("id"));
System.out.println("name : " + rs.getString("name"));
System.out.println("gender : " + rs.getString("gender"));
System.out.println("age : " + rs.getInt("age"));
}
} catch(SQLException e) {
System.out.println("error dbConnect()");
e.printStackTrace();
}finally {
try {
if ((rs != null)||(stm != null)||(con != null)) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
当你运行它时,会返回以下内容。
DB access start
[1 件目]
id : 10001
name : 田中太郎
gender : m
age : 31
[2 件目]
id : 10002
name : 中村花子
gender : w
age : 44
[3 件目]
id : 10003
name : 佐藤一郎
gender : m
age : 20
[4 件目]
id : 10004
name : 内田彩
gender : w
age : 18
[5 件目]
id : 10005
name : 高橋次郎
gender : m
age : 56
[6 件目]
id : 10006
name : 中里悟
gender : m
age : 34
DB access finished
如果是真的,我本想用rs.next()来输出当前记录数的名称,但是因为不太清楚,所以用了一种巧妙的方法来输出…
如果有人能够告诉我如何做,我会非常高兴。
【补充】 2019年7月29日
非常感谢您的评论。我已经按照以下方式进行了修正。
使用rs.getRow()来接收循环部分的尝试次数。
while (rs.next()) {
System.out.println("[" + rs.getRow() + " 件目]"); /* 修正部分 */
System.out.println("id : " + rs.getString("id"));
System.out.println("name : " + rs.getString("name"));
System.out.println("gender : " + rs.getString("gender"));
System.out.println("age : " + rs.getInt("age"));
}
我已经修复了漏洞。
try {
if ((rs != null)||(stm != null)||(con != null)) {
rs.close();
stm.close(); /* 修正部分 */
con.close(); /* 修正部分 */
}
} catch (Exception e) {
e.printStackTrace();
}
再次感谢您。