如何使用 JDBC/Java 访问和显示 MySQL 关系数据库中的特定记录?

Posted

技术标签:

【中文标题】如何使用 JDBC/Java 访问和显示 MySQL 关系数据库中的特定记录?【英文标题】:How do I access and display specific records in a MySQL relational-database using JDBC/Java? 【发布时间】:2021-07-20 11:26:46 【问题描述】:

我有一个项目管理系统,用于从文本文件中读取数据,但现在正在更改为从数据库中读取数据。

我试图弄清楚如何根据项目表中的项目编号在不同的表中显示特定信息。 我数据库中的所有表都与这个项目表相关。

我的数据库的可视化展示

我的数据库的 ERD:

我的问题

整齐地显示项目的所有信息。

我想弄清楚的是,如何根据项目表中的外键在一个表中获取特定记录?

例如,如果一个项目有一个建筑师名为“Bryan”的建筑师,那么如何仅显示“Bryan”的建筑师详细信息?

我的 displayAll 方法的代码

public static void viewAllProjects() 

    // Calling the 'connectionAttempt' method to connect to the 'ebookstore' database.
    Connection connection = connectionAttempt();

    PreparedStatement ps;

    // Using a try- catch block to print the data for a specific record in the 'books' table.
    try 
        // Creating and using a normal statement to select the specific record in the database.
        Statement statement = connection.createStatement();

        // SQL select statement
        String q = "select * from architect\n" +
                "union all\n" +
                "select * from contractor\n" +
                "union all\n" +
                "select * from customer" +
                "union all\n" +
                "select * from shopping_basket\n" +
                "union all\n" +
                "select * from projects\n" +
                "union all\n" +
                "select * from building_info";

        ResultSet rs = statement.executeQuery(q); // Executing statement

        // Printing ResultSet
        if (rs.next()) 
            String projectDetails = "\nProject Number: " + rs.getString("project_number") + "\n" +
                    "Project Name: " + rs.getString("project_name") + "\n" +
                    "Type of building: " + rs.getString("HERE") + "\n" +
                    "ERF Number: " + rs.getString("HERE") + "\n" +
                    "Physical Address: " + rs.getString("physical_address") + "\n" +
                    "Total fee charged for project: " + rs.getString("HERE") + "\n" +
                    "Total amount already paid: " + rs.getString("HERE") + "\n" +
                    "Deadline of the project: " + rs.getString("deadline") + "\n" +
                    "Project Finalised: " + rs.getString("finalised") + "\n" +

                    "\nArchitect Name: " + rs.getString("architect_name") + "\n" +
                    "Architect Telephone Number: " + rs.getString("id") + "\n" +
                    "Architect Email-Address: " + rs.getString("id") + "\n" +
                    "Architect Physical Address: " + rs.getString("id") + "\n" +

                    "\nContractor Name: " + rs.getString("contractor_name") + "\n" +
                    "Contractor Telephone Number: " + rs.getString("id") + "\n" +
                    "Contractor Email-Address: " + rs.getString("id") + "\n" +
                    "Contractor Physical Address: " + rs.getString("id") + "\n" +

                    "\nCustomer Name: " + rs.getString("HERE") + "\n" +
                    "Customer Telephone Number: " + rs.getString("HERE") + "\n" +
                    "Customer Email-Address: " + rs.getString("HERE") + "\n" +
                    "Customer Physical Address: " + rs.getString("HERE") + "\n" +
                    "----------------------------------\n";

            System.out.println(projectDetails);
         else 
            System.out.println("Record Not Found...");
        
        connection.close();
     catch (Exception e) 
        System.out.println(e);
    

connectionAttempt 方法的代码可以正常工作,就像我之前使用的那样。

如果我可以提供任何其他详细信息,请告诉我。

【问题讨论】:

【参考方案1】:

在您学习 SQL 之前,这个项目不会成功。一旦你这样做了,你就会知道将整个数据库中的每一行联合起来是一种疯狂的工作方式。这试图以极其低效的方式抽取数据库中的所有数据。

如果一个项目有一个建筑师名为“Bryan”的建筑师,那么我如何只显示“Bryan”的建筑师详细信息。

一条类似于SELECT * FROM architect WHERE architect_name = ? 的SQL 语句(将其设为您的PreparedStatement),然后使用ps.setString(1, "The name of the architect goes here"); 设置查询参数,然后运行它,瞧。

您可能希望将返回的数据“编组”到一个专门的 java 对象中,该对象准确地表示返回的数据,因为使用一些 java 类比运行大量 rs.getString... 样式语句要简单得多。稍后会详细介绍。

如果您想要 brian 制作的所有项目,那么除非您向我们解释您的数据库是如何设计的,否则无法判断。但它看起来类似于:

SELECT p.* FROM projects p
  INNER JOIN architect a ON p.architect = a.unid
  WHERE a.architect_name = ?

您需要了解 SQL - 在 Web 上搜索任何 SQL 教程。

您还需要从 java 端与之交互。您当前正在执行原始 JDBC - 不推荐。阅读JDBI 或如果您愿意,请阅读JOOQ。这些也使编组的事情很多更简单。

【讨论】:

我已经看到了我的方式的错误。我犯了这么简单的错误。我阅读了您发给我的那些链接,这对我很有帮助。非常感谢您的帮助。 :D

以上是关于如何使用 JDBC/Java 访问和显示 MySQL 关系数据库中的特定记录?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL如何永久解决由dos编码格式导致MySQ的显示乱码

Java web004——jdbc(Java Database Connectivity)包括MySQL的安装和使用教程

jdbc

JDBC-01

JDBC详解(转)

JDBC详解(转)