实验三 嵌入式SQL与数据库连接

一、数据库连接技术简介

本实验在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的学习与使用。

posted @ 2023-06-17 17:42  戴骏  阅读(48)  评论(0编辑  收藏  举报