Java JDBC - 浏览数据库中的记录

Posted

技术标签:

【中文标题】Java JDBC - 浏览数据库中的记录【英文标题】:Java JDBC - Navigate Through Records Within Database 【发布时间】:2016-12-18 14:55:52 【问题描述】:

我在返回数据库中的 NEXT 记录时遇到了一些问题,我的代码目前只返回最后输入的记录。我尝试创建一个 List/ArrayList 的实例,尝试向我的 createStatement(); 添加语句,然后尝试了所有方法。我在网上搜索过,但是,我似乎总是得到最后一个返回的值。我希望是否有人可以帮助我。我正在使用 .Swing,这一切都在 ActionListener 中执行。

基本上我希望这个函数能够获取数据库中的下一条记录。而不是返回最后一条记录。

nextEmployee.addActionListener(new ActionListener() 

    @Override
    public void actionPerformed(ActionEvent e) 

        Connection connection = null;
        Statement statement = null;
        try 
            Class.forName("org.sqlite.JDBC");
            connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite");
            connection.setAutoCommit(false);
            System.out.println("Read operation - database successfully opened");
            statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY,
                    ResultSet.CONCUR_READ_ONLY);
            ResultSet resultset = statement.executeQuery( "SELECT * from employees" );
            while (resultset.next())   
                ArrayList<Employee> selectAllEmployees = new ArrayList<Employee>();
                String id = resultset.getString("id");
                String  name = resultset.getString("name");
                String  email = resultset.getString("email");
                String  gender = resultset.getString("gender");
                String  dob = resultset.getString("dob");
                String  Address = resultset.getString("address"); 
                String  Postcode = resultset.getString("Postcode");
                String  NIN = resultset.getString("NIN");
                String  JobTitle = resultset.getString("JobTitle");
                String  StartDate = resultset.getString("StartDate");
                String  Salary = resultset.getString("Salary");
                idTextField.setText(id);
                nameTextField.setText(name);
                genderTextField.setText(gender);
                dobTextField.setText(dob);
                addressTextField.setText(Address);
                postcodeTextField.setText(Postcode);
                ninTextField.setText(NIN);
                jobtitleTextField.setText(JobTitle);
                startdateTextField.setText(StartDate);
                salaryTextField.setText(Salary);
                emailTextField.setText(email);


            



            resultset.close();
            statement.close();
            connection.close();
         catch ( Exception e1 ) 
            System.err.println( e1.getClass().getName() + ": " + e1.getMessage() );
            System.exit(0);
        

        );

感谢您的时间和精力。

【问题讨论】:

您正在迭代整个结果集,并且实际上只显示最后一个结果集(因为您在每次迭代时更新您的 GUI 字段)。您需要填充 selectAllEmployees 列表并将其用作 GUI 中的数据源,或者您需要将结果集的迭代移动到您的 GUI(顺便说一句,这可能并不总是正确的解决方案!)。跨度> @MarkRotteveel 对,这是有道理的。但是,由于 selectAllEmployees 在公共 void 内,我不能使用语句 return selectAllEmployees.add();我只是得到一个错误。 @MarkRotteveel 我尝试使用 selectAllEmployees.add(resultset.getString("id"));但是,.add 关键字似乎有问题。 ArrayList 类型中的方法 add(Employee) 不适用于参数 (String)。它建议更改为 addAll() 但是,当我这样做时,我会遇到相同的错误,建议更改为 add()。 当然这不起作用:您创建了一个应该包含Employee 对象的列表,当然您不能向其中添加String。因此:使用结果集中的值创建一个员工对象,将其添加到列表中,等等。然后:返回:这是您的代码,您需要更改它以执行您需要的功能。 如何将结果集中的值附加到我的员工列表中? selectAllEmployees.add(resultset.getString(1));?这是我真正苦苦挣扎的部分。 【参考方案1】:

正在发生两件事之一。要么:

您在填充数据库的代码中存在错误,因此您认为数据库中有 A、B 和 C 行,但实际上您只有 C 行

或者:

列出的代码会使用 A 行的内容填充控件,然后重复使用 B 行的内容填充完全相同的控件,然后再次使用 C 行的内容填充完全相同的控件。所以,很自然,剩下的值就是最后一行的值。

这有助于准确地思考您正在尝试做什么,准确地思考正在发生的事情,准确地思考您期望发生的事情,最重要的是,是什么让您相信代码应该按照您的期望去做做而不是实际做的。

【讨论】:

我可以使用特定字段(即 ID、名称等)显示不同的用户。我目前还没有实现填充数据库的功能,而是使用 SQLite 手动添加它们并检索他们从数据库中。 好的,那么我的第二个建议(第 3 段)很可能回答了您的问题。 另外,请注意您声明了selectAllEmployees,但您并没有以任何方式使用它,即使您这样做了,在while 循环中声明它也是没有意义的。跨度> 我知道这是一个小调整,我可以访问至关重要的数据库。它确实返回了一条不同的记录,这让我很高兴,但是,它只是跳过了数据库中的所有内容并返回了最后一个条目。我尝试添加一个计数器来在返回记录时单独“计数”记录。我觉得我必须修改/做一些事情 while (resultset.next()) 。 当我在 *** 上搜索时,我在 while 循环中使用了 selectAllEmployees,我看到一个线程,有人说您必须在 while 循环中实例化一个新列表,并为您希望的每个值执行此操作返回。

以上是关于Java JDBC - 浏览数据库中的记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 时如何为 SQL 语句启用日志记录

java - 如何使用rmi在java中的mysql(jdbc)中插入一条记录? [关闭]

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

MyBatis 学习记录6 TypeHandler

Sharding jdbc 强制路由策略(HintShardingStrategy)使用记录

java(jdbc)向oracle中插入记录