Java JDBC通信应用实验

135 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

写在前面:

本文完成的业务功能或场景均为自己根据实验要求的第一点与第二点编撰的。本文给出了我编撰的场景和实现的业务功能,给出了实现代码、实验过程、结果分析以及一些思考题和解答,对于本次的实验报告,本文仅供参考,具体还得依据各位自己所创造的背景来完成。此外,本文中对于第二点要求的实现比较表面,只完成了要求中的取得查询集和数据类型支持的功能,并没有去实现老师课上所说的之前集合实验里做过的字典功能等等,不是说写不了,而是本人事太多了实在不想写了,当然还有一点是因为懒。(捂脸)

要求:

1.能够使用JDBC实现简单的数据库管理。 2.能够设计开发程序利用JDBC核心API,建立数据库连接、执行SQL语句、取得查询集、数据类型支持等功能。 3.业务功能或场景由学员自已选择: (要在此处写明完成的功能和业务场景) ①:李华同学建立了自己的数据库lh,在其中创建了学生表stu_students,并在其中添加了自己,小明,和小红的相关信息。老师让李华同学查询学生表中所有年龄为20的同学的有关信息,然而李华同学课业繁忙,所以他拜托你帮忙完成这个查询任务,以及替他完成后续可能需要的各种管理操作。有一天,cc同学来到了李华所在的学校,需要他在学生表中导入cc同学的有关信息:学号:2000000004,年龄21,身高175,体重175,因此这就需要你在学生表中导入相关信息。导入信息后,cc同学焦急的找到李华同学,说他的年龄,身高,体重有问题,年龄应当为22,身高应当为177,体重应当为170,因此又需要你帮助他在学生表中修改有关信息。在这之后,cc同学转去了别的学校,所以又需要请你帮助他删除学生表中cc同学的有关信息。请编写程序实现这一场景,使用JDBC实现简单的数据库管理,实现对他的数据库中学生表的增删改查这一系列操作。 ②:李华同学建立了自己的数据库lh,在其中创建了学生表stu_students,并在其中添加了自己,小明,和小红的相关信息。现需要你帮助他利用JDBC核心API设计开发程序,建立数据库连接,编写JDBC联接的封装 ,执行SQL语句,实现取得查询集、取得表中的各种属性(包括表中所支持的数据类型)的功能。要求:输入名字lh进行查询,输出查询到的相关信息、输出该同学的学生表中的各种属性,包括表中所支持的数据类型等。

实现代码:

①:

 package com.zhangyufan.jdbc;
 ​
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Scanner;
 ​
 public class TestJdbcStudents {
     public static void main(String[] args) throws ClassNotFoundException, SQLException {
         try {
             Class.forName("com.mysql.jdbc.Driver");
             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lh", "root", "root");
             String sql = "select * from stu_students where stu_age like ?";
             PreparedStatement ps = conn.prepareStatement(sql);
             Scanner sc = new Scanner(System.in);
             System.out.println("请输入想要查找有关信息的学生的年龄:");
             int stu_age = sc.nextInt();
             ps.setInt(1, stu_age);
             ResultSet rs = ps.executeQuery();
             System.out.println("查询到的学生表中的有关信息:");
             while (rs.next()) {
                 System.out.println("学号:" + rs.getString("stu_num"));
                 System.out.println("姓名:" + rs.getString("stu_name"));
                 System.out.println("年龄:" + rs.getInt("stu_age"));
                 System.out.println("身高:" + rs.getDouble("stu_height"));
                 System.out.println("体重:" + rs.getDouble("stu_weight"));
                 System.out.println("--------------------------------------------------");
             }
             System.out.println("查询成功!");
             System.out.println("--------------------------------------------------");
             sql = "insert into stu_students(stu_id, stu_num, stu_name, stu_age, stu_height, stu_weight) ";
             sql += " select ifnull((select max(stu_id) from stu_students),0) + 1,?,?,?,?,?";
             ps = conn.prepareStatement(sql);
             System.out.println("请输入想要增加的学生信息:");
             System.out.println("学号:");
             String stu_num = sc.next();
             System.out.println("姓名:");
             String stu_name = sc.next();
             System.out.println("年龄:");
             stu_age = sc.nextInt();
             System.out.println("身高:");
             double stu_height = sc.nextDouble();
             System.out.println("体重:");
             double stu_weight = sc.nextDouble();
             ps.setString(1, stu_num);
             ps.setString(2, stu_name);
             ps.setInt(3, stu_age);
             ps.setDouble(4, stu_height);
             ps.setDouble(5, stu_weight);
             ps.executeUpdate();
             System.out.println("新增学生信息成功!");
             System.out.println("--------------------------------------------------");
             System.out.println("请输入想要修改信息的学生姓名:");
             stu_name = sc.next();
             sql = "update stu_students set stu_age = ?, stu_height = ?, stu_weight = ? where stu_name = '" + stu_name
                     + "'";
             ps = conn.prepareStatement(sql);
             System.out.println("请输入修改之后的学生信息(此处假定修改的是年龄,身高和体重):");
             System.out.println("年龄:");
             stu_age = sc.nextInt();
             System.out.println("身高:");
             stu_height = sc.nextDouble();
             System.out.println("体重:");
             stu_weight = sc.nextDouble();
             ps.setInt(1, stu_age);
             ps.setDouble(2, stu_height);
             ps.setDouble(3, stu_weight);
             ps.executeUpdate();
             System.out.println("修改学生信息成功!");
             System.out.println("--------------------------------------------------");
             sql = "delete from stu_students where stu_name = ?";
             ps = conn.prepareStatement(sql);
             System.out.println("请输入想要删除有关信息的学生的姓名:");
             stu_name = sc.next();
             ps.setString(1, stu_name);
             ps.executeUpdate();
             System.out.println("删除学生信息成功!");
             System.out.println("--------------------------------------------------");
             rs.close();
             conn.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 }
 ​

②:

 package com.zhangyufan.jdbc;
 ​
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Scanner;
 ​
 public class TestJdbcDbConn {
 ​
     public static void main(String[] args) throws Exception {
         System.out.println("--------------------查询表中的信息--------------------");
         System.out.println("请输入要查询相关信息的学生的姓名:");
         Scanner sc = new Scanner(System.in);
         String stu_name = sc.next();
         String sql = "select * from stu_students where stu_name = '" + stu_name + "'";
         ResultSet rs = JdbcDbConn.exeQuery(sql, null);
         while (rs.next()) {
             System.out.println("序号:" + rs.getInt("stu_id"));
             System.out.println("学号:" + rs.getString("stu_num"));
             System.out.println("姓名:" + rs.getString("stu_name"));
             System.out.println("年龄:" + rs.getInt("stu_age"));
             System.out.println("身高:" + rs.getDouble("stu_height"));
             System.out.println("体重:" + rs.getDouble("stu_weight"));
         }
         System.out.println("--------------------显示表中的各种属性,包括表中所支持的数据类型等--------------------");
         ArrayList<ArrayList<String>> array = JdbcDbConn.getAttributesFromTable("stu_students");
         Iterator it1 = array.iterator();
         while (it1.hasNext()) {
             System.out.println(it1.next());
         }
         rs.close();
         DbConn.close();
     }
 }
 ​
 class JdbcDbConn {
     private static String driver = "com.mysql.jdbc.Driver";
     private static String dbname = "lh";
     private static String userName = "root";
     private static String passWord = "root";
     private static String url = "jdbc:mysql://localhost:3306/" + dbname;
     private static Connection conn = null;
     static {
         try {
             Class.forName(driver);
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }
     }
     private JdbcDbConn() {
 ​
     }
     public static Connection getConn() {
         if (conn == null) {
             try {
                 conn = DriverManager.getConnection(url, userName, passWord);
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         return conn;
     }
     public static void close() throws Exception {
         if (conn != null) {
             try {
                 conn.close();
             } catch (Exception e) {
                 throw e;
             }
         }
     }
     public static ResultSet exeQuery(String sql, Object[] params) {
         try {
             Connection conn = getConn();
             PreparedStatement ps = conn.prepareStatement(sql);
             if (params != null) {
                 for (int i = 0; i < params.length; i++) {
                     ps.setObject(i + 1, params[i]);
                 }
             }
             ResultSet rs = ps.executeQuery();
             return rs;
         } catch (SQLException e) {
             e.printStackTrace();
         }
         return null;
     }
     public static ArrayList<ArrayList<String>> getAttributesFromTable(String TableName) {
         String sql = "select * from " + TableName + " limit 1";
         ArrayList<ArrayList<String>> list = new ArrayList();
         try {
             ResultSet rs = exeQuery(sql, null);
             ResultSetMetaData rs_metaData = rs.getMetaData();
             while (rs.next()) {
                 int count = rs_metaData.getColumnCount();
                 for (int i = 0; i < count; i++) {
                     ArrayList<String> subList = new ArrayList<>(3);
                     String columnName = rs_metaData.getColumnLabel(i + 1);
                     String columnSize = String.valueOf(rs_metaData.getColumnDisplaySize(i + 1));
                     String columnType = rs_metaData.getColumnTypeName(i + 1);
                     subList.add(columnName);
                     subList.add(columnType);
                     subList.add(columnSize);
                     list.add(subList);
                 }
             }
             rs.close();
             return list;
         } catch (Exception e) {
             e.printStackTrace();
             return list;
         }
     }
 ​
 }

实验过程:

①:

1.输入想要查找的学生的年龄为20,程序输出学生表中所有年龄为20的学生的有关信息。然后确认和数据库里学生表中的有关信息一致。 在这里插入图片描述 在这里插入图片描述 2.输入想要增加的学生信息,其学号为2000000004,姓名为cc,年龄为21,身高和体重均为175。然后在数据库的学生表中确认学生信息增加成功。 在这里插入图片描述

在这里插入图片描述 3.修改这一条学生信息。输入其名字cc,然后输入其年龄修改后的值22,身高修改后的值177,体重修改后的值170。然后在数据库的学生表中确认该学生信息修改成功。 在这里插入图片描述 在这里插入图片描述 4.删除该条学生信息。输入其名字cc。然后在数据库的学生表中确认该学生信息删除成功。 在这里插入图片描述 在这里插入图片描述

②:

1.输入姓名lh,显示其在学生表中的有关信息。然后确认和数据库里学生表的有关信息一致。 在这里插入图片描述 在这里插入图片描述 2.程序显示学生表中的各种属性,包括表中所支持的数据类型等。然后确认和数据库里学生表的有关信息一致。 在这里插入图片描述 在这里插入图片描述

结果分析:

①: 实验结果:在实验过程中已贴出,此处不再展示。 分析:该程序通过输入年龄查询学生表中有关信息,通过输入学号姓名年龄身高体重这些基本信息以在学生表中进行增加,通过输入姓名,然后输入修改后的年龄身高体重以对学生表中的有关信息进行修改,通过输入姓名对学生表中有关信息进行删除。在这些操作之后,分别和数据库里的学生表进行相关对比,确认各项操作均正确执行。通过该程序,实现了题目中所模拟的一系列场景。学会了如何使用JDBC实现简单的数据库管理。程序整体无语法错误或逻辑错误。

②: 实验结果:在实验过程中已贴出,此处不再展示。 分析:该程序通过输入姓名以查询相关信息并输出,然后输出了所创建的数据库里学生表的各种属性,包括表中所支持的数据类型等。该程序实现了利用JDBC核心API设计开发程序,建立数据库连接,执行SQL语句,实现了取得查询集,数据类型支持等功能。该程序中编写了JDBC联接的封装。程序整体无语法错误或逻辑错误。

思考题:

PreparedStatement与Statement的区别?

答: 1.代码的可读性和可维护性。PreparedStatement在执行sql语句时可以包含动态参数占位符“?”,在执行时可以为占位符“?”动态设置参数值,而Statement不支持占位符“?”替换变量,只能在sql中拼接参数。所以在代码的可读性以及可维护性上,PreparedStatement接口大大提高了代码的可读性和可维护性。 2.PreparedStatement能最大可能提高性能。sql语句在数据库中执行都是需要DBMS编译的,而PreparedStatement会预编译sql语句,因此当多次执行时,只需DBMS运行sql语句,而不必再编译。而Statement没有预处理,每次都要重新编译,所以当多次执行这条sql语句时,PreparedStatement效率会大大的提高。 3.最重要的一点,相较于Statement,PreparedStatement极大地提高了安全性。它有助于防止SQL注入,因为它会自动对特殊字符转义。

数据库4大语言是什么,分别有什么作用?

答: 1.数据定义语言(DDL)。作用:用于定义数据库的对象,如数据表、视图、索引等。 2.数据查询语言(DQL)。作用:用于数据表记录的查询。 3.数据操作语言(DML)。作用:用于在数据库中更新,增加和删除记录。 4.数据控制语言(DCL)。作用:用于设置用户权限和控制事务语句。

3大数据库的端口号是多少?

答: 1.Oracle。默认端口号是1521。 2.SQL Server。默认端口号是1433。 3.MySQL。默认端口号是3306。