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

Posted 戴骏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验三 嵌入式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的学习与使用。

以上是关于实验三 嵌入式SQL与数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式SQL语言

数据库实验三——连接查询

数据库-第八章 数据库编程-8.1 嵌入式SQL

数据库-第八章 数据库编程-8.1 嵌入式SQL

嵌入式资料

数据库实验三 多表查询