一、数据库连接技术简介
本实验在Java程序中采用JDBC连接openGauss。
Java数据库连接是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。我们通常说的JDBC是面向关系型数据库的。
JDBC有五种连接方式,分别是直接实例化Driver,反射实现Driver类,使用DriverManager替换Driver接口,利用mysql的driver实现类自动进行了注册驱动,直接调用DriverManager的静态方法连接,将连接的四个基本信息声明在配置文件中,读取配置文件进行连接jdbc.properties。
本次实验采用了第三种:使用DriverManager替换Driver接口。
二、数据库连接环境配置
本地跑有openEuler虚拟机上面装的openGauss数据库
java用的eclipse
1.配置环境
首先加载jdbc驱动从网上下(叫openGauss-1.1.0-JDBC.tar)下下来解压,在eclipse里新建一个项目,创建一个lib文件夹,把刚刚解压的文件复制到lib文件夹下,然后右击项目名,依次点击 Build Path > Configure Build Path…
选中 Libraries,点击右边的按钮 add JARs…
选中复制到项目中的jar包
最后点击 Apply and Close 即可
2.连接数据库
配置代码如下:其中IP地址、用户名、密码需根据自己要求修改
IP地址ifconfig
命令查看
三、对增删查改操作的实现
查询部门表
package OpenGauss;
import java.sql.*;
public class ConnectOpenGauss {
static final String JDBC_DRIVER = "org.postgresql.Driver";
static final String DB_URL = "jdbc:postgresql://192.168.56.104:26000/postgres?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "dj";
static final String PASS = "A2285634363dj";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 执行查询
System.out.println(" 实例化Staff对象...");
stmt = conn.createStatement();
String sql;
sql = "SELECT * FROM public.staff ;";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
String sno = rs.getString("sno");
String dno = rs.getString("dno");
String sname = rs.getString("sname");
String ssex = rs.getString("ssex");
String sbirth = rs.getString("sbirth");
String skey = rs.getString("skey");
// 输出数据
System.out.print("职工号: " + sno);
System.out.print(", 部门号: " + dno);
System.out.print(", 姓名: " + sname);
System.out.print(", 性别: " + ssex);
System.out.print(", 生日: " + sbirth);
System.out.print(", 口令: " + skey);
System.out.print("\n");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 错误
e.printStackTrace();
}finally{
// 关闭资源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}// 什么都不做
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
查询部门号为‘0001’的员工
try{
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 执行查询
System.out.println(" 实例化Staff对象...");
stmt = conn.createStatement();
String sql;
sql = "SELECT * FROM public.staff WHERE dno='0001';";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
String sno = rs.getString("sno");
String dno = rs.getString("dno");
String sname = rs.getString("sname");
String ssex = rs.getString("ssex");
String sbirth = rs.getString("sbirth");
String skey = rs.getString("skey");
// 输出数据
System.out.print("职工号: " + sno);
System.out.print(", 部门号: " + dno);
System.out.print(", 姓名: " + sname);
System.out.print(", 性别: " + ssex);
System.out.print(", 生日: " + sbirth);
System.out.print(", 口令: " + skey);
System.out.print("\n");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}
查询工资为index的员工(index可自己输入)
// 执行查询
System.out.println(" 实例化Staff对象...");
stmt = conn.createStatement();
String sql;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数:");
String index = scanner.nextLine();
sql = " select * from public.gongzi where gongzi = '"+index+"';";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
String sno = rs.getString("sno");
String zno = rs.getString("zno");
String sname = rs.getString("sname");
String gongzi = rs.getString("gongzi");
String beizhu = rs.getString("beizhu");
// 输出数据
System.out.print("职工号: " + sno);
System.out.print(", 编号: " + zno);
System.out.print(", 姓名: " + sname);
System.out.print(", 工资: " + gongzi);
System.out.print(", 备注: " + beizhu);
System.out.print("\n");
}
增加sno没有匹配值的员工工资信息
System.out.println(" 实例化Staff对象...");
stmt = conn.createStatement();
String sql;
sql = "INSERT INTO public.gongzi VALUES('11','0000','明浩杨','8000',NULL)";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
String sno = rs.getString("sno");
String zno = rs.getString("zno");
String sname = rs.getString("sname");
String gongzi = rs.getString("gongzi");
String beizhu = rs.getString("beizhu");
// 输出数据
System.out.print("职工号: " + sno);
System.out.print(", 编号: " + zno);
System.out.print(", 姓名: " + sname);
System.out.print(", 工资: " + gongzi);
System.out.print(", 备注: " + beizhu);
System.out.print("\n");
}
- 显示外码错误
增加阮贝行的工资信息
System.out.println(" 实例化Staff对象...");
stmt = conn.createStatement();
String sql;
sql = "INSERT INTO public.gongzi VALUES('10','1005','阮贝行','8000',NULL)";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
String sno = rs.getString("sno");
String zno = rs.getString("zno");
String sname = rs.getString("sname");
String gongzi = rs.getString("gongzi");
String beizhu = rs.getString("beizhu");
// 输出数据
System.out.print("职工号: " + sno);
System.out.print(", 编号: " + zno);
System.out.print(", 姓名: " + sname);
System.out.print(", 工资: " + gongzi);
System.out.print(", 备注: " + beizhu);
System.out.print("\n");
}
修改阮贝行的工资信息
System.out.println(" 实例化Staff对象...");
stmt = conn.createStatement();
String sql;
sql = "UPDATE public.gongzi SET beizhu='已发' WHERE sname='阮贝行'";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
String sno = rs.getString("sno");
String zno = rs.getString("zno");
String sname = rs.getString("sname");
String gongzi = rs.getString("gongzi");
String beizhu = rs.getString("beizhu");
// 输出数据
System.out.print("职工号: " + sno);
System.out.print(", 编号: " + zno);
System.out.print(", 姓名: " + sname);
System.out.print(", 工资: " + gongzi);
System.out.print(", 备注: " + beizhu);
System.out.print("\n");
}
删除工资表中所有信息
System.out.println(" 实例化Staff对象...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM public.gongzi";
ResultSet rs = stmt.executeQuery(sql);
存储过程
四、问题分析
-
问题1:
因为实验中对应的用户有多个模式,所以在进行操作时需要写明是哪个模式中的表,如'public.gongzi' -
问题2:
在本次实验中,使用的是eclipse,会有中文编程乱码的问题
可以参考https://blog.csdn.net/sob_sob/article/details/120893031中的方法
但是可能会导致原来没有乱码的项目出现乱码的情况
五、实验感想
本次实验不算困难,跟着实验指导书,可以轻易完成连接数据库,而且课上对java查询数据库内容的语句也是蛮清晰的,可以通过使用java调用SQL语句来完成增删查改等内容。
原来是想做一个可视化界面的,但是我java水平有限,只会做出来一个界面(如下图),但是其中按钮的跳转啥的并不会,最后只完成了一个类似于命令行式的形式。但总的来说,在本次实验中收获到了很多,也发现了自身对java并不是很熟悉,之后也会加强对java的学习与使用。