mysql - 对 MySQL 数据库的 JavaBean SQL 查询,仅在 JSF 中显示两倍的结果

标签 mysql jsf jdbc

从 Javabean 查询 MySQL 数据库并在 JSF 中显示它时,我遇到了一个奇怪的问题。 (Java代码在底部)

该表包含以下寄存器:

mysql> select * from trescols;
+----+---------+---------+
| id | camp1 | camp2 |
+----+---------+---------+
| 1 | fila1A | fila1B |
| 2 | fila2A | fila2B |
| 3 | fila3A | fila3B |
| 4 | fila4A | fila4B |
...
| 20 | fila20A | fila20B |
+----+---------+---------+

好的!让我们继续完成这个过程,直到它失败:

首先我用一个大查询查询了数据库,但它没有用,所以我从一个简单的查询开始,逐步添加内容。

首先,我使用以下查询查询数据库:

SELECT * FROM trescols;

一切正常,在使用 JSF 的结果页面中显示良好。

接下来我查询了以下内容:

SELECT * FROM tabla WHERE id%2=1;

一切正常,它只是显示了带有奇数 id 的记录。

查询的时候问题来了:

SELECT * FROM tabla WHERE id%2=1 AND campo1 LIKE '%7%';

我希望它显示具有奇数 ID 并在“camp1”列某处包含字符串“7”的寄存器。

JSF 的结果是:

ID Camp1   Camp2
7  fila7A  fila7B
17 fila17A fila17B
7  fila7A  fila7B
17 fila17A fila17B 

虽然来自 mysql cli 的相同查询返回:

mysql> select * from trescols where id%2=1 and camp1 LIKE '%7%';
+----+---------+---------+
| id | camp1   | camp2   |
+----+---------+---------+
| 7  | fila7A  | fila7B  |
| 17 | fila17A | fila17B |
+----+---------+---------+
2 rows in set (0.10 sec)

我添加了 LIMIT 1, 1到查询字符串并删除了 id%2=1 AND ,并返回:

ID Camp1   Camp2
17 fila17A fila17B
17 fila17A fila17B 

预期的结果是只显示一次第二个寄存器,而不是两次。删除第一个条件只是为了验证双重条件不是重复结果的原因,并排除错误的 SQL 查询。

然后我做了一个存储过程如下:

mysql> CREATE PROCEDURE getTrescols3()
-> BEGIN
-> SELECT * FROM trescols WHERE camp1 LIKE '%7%';
-> END
-> //

从 MySQL CLI 调用它工作正常:

mysql> call gettrescols3();
+----+---------+---------+
| id | camp1   | camp2   |
+----+---------+---------+
| 7  | fila7A  | fila7B  |
| 17 | fila17A | fila17B |
+----+---------+---------+
2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

但是从 JSF 调用它又显示了两次!!!

ID Camp1   Camp2
7  fila7A  fila7B
17 fila17A fila17B
7  fila7A  fila7B
17 fila17A fila17B 

这就是我迷路的地方......我可以理解查询可能 - 由于某种原因它不应该 - 显示重复的结果,然后我开始通过一个简单的查询向字符串添加句子直到它显示重复的结果。只有一种情况下它工作正常,两种情况下它显示重复的结果。然后我删除了它没有任何问题的两个条件中的第一个,只留下第二个条件,它显示了重复的结果。然后我认为 java 可能对 <field> LIKE '%7%' 条件有任何问题。 ,所以我在 MySQL 中创建了一个存储过程,因此 Java 不应该处理查询字符串而只是调用 SP 并获取结果,从 CLI 调用它并且工作正常,从 java bean 调用它并显示重复的结果。

我不知道还有什么测试要做...我放弃了一个错误的 SQL 查询,因为在 CLI 中一切都按预期工作,只是在添加条件 <field> LIKE '%7%' 时失败了并且只是在 JSF 中失败了,而不是在 mysql cli 中,我也再次排除了错误的查询,因为从 java bean 和 cli 调用 SP,它在 cli 中工作但不是从 java bean 中工作...

我试图从表“trescols”中获取所有结果,其中 id%2=1并且字段“camp1”包含 7。

我正在使用 mysql jdbc 连接器连接到数据库。

你能帮帮我吗?

亲切的问候, 卡尔斯

Java代码:

package beans;

import java.sql.*;
import java.util.*;

public class beanNomesRetorna {
Connection con;
Statement ps;
ResultSet rs;
private List llista = new ArrayList();

public List getLlista() {
    int i=0;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/provesjsf","root","pa$$word");
        ps = con.createStatement();
        rs = ps.executeQuery("SELECT * FROM trescols WHERE id%2 = 1 AND camp1 LIKE '%7%' ORDER BY id LIMIT 0,2");

        while(rs.next()) {
            System.out.println(rs.getString(1));
            llista.add(i, new agafaInfo(Integer.parseInt(rs.getString("id")), rs.getString("camp1"), rs.getString("camp2")));
            i++;
        } // while
    } catch(Exception e) {
        System.out.println(e);
    } // try ... catch

    return llista;
} // getLlista

package beans;

public class agafaInfo {
    int id;
    String camp1;
    String camp2;

    agafaInfo(int parid, String parcamp1, String parcamp2) {
        this.id = parid;
        this.camp1 = parcamp1;
        this.camp2 = parcamp2;
    }

    public int getParid() {
        return id;
    }

    public String getCamp1() {
        return camp1;
    }

    public String getCamp2() {
        return camp2;
    }
} // agafaInfo

最佳答案

不要在 bean 的 getter 中进行数据库操作。在 bean 的构造函数中执行。症状表明您有一个 List 属性并将其填充到 getter 而不是构造函数中。在 bean 的生命周期中,可以多次调用 getter。它的唯一任务应该是返回数据,而不是做一些业务。


更新 如我所料,您正在 getter 中处理业务。它不是这样工作的。将该代码移动到构造函数中。

public class Bean {
    public List list;

    public Bean() {
        // Fill the list here.
    }

    public List getList() {
        return list; // Do nothing else in the getter!
    }
}

另见:


与具体问题无关,您的 JDBC 代码方法也存在严重问题。资源被声明为类字段而不是方法局部字段,并且它们在 finally block 中未正确关闭。它对资源泄漏很敏感。我建议让自己通过 this article通过示例学习如何正确执行 JDBC 操作。

关于mysql - 对 MySQL 数据库的 JavaBean SQL 查询,仅在 JSF 中显示两倍的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765942/

相关文章:

java - 如何在java中向数据库添加 boolean 值

java - 加载 Postgresql JDBC 4.1 驱动程序

mysql - 如何获取具有不同/唯一 id 且左连接中没有记录的行

php - 带有两个 WHERE 子句的 MySQL SELECT 语句

wordpress - 从数据库中从多个表匹配条件中获取数据

jsf - 为什么 NavigationHandler.handleNavigation() 不转发到 View ID?

java - 在 JSF 自定义 validator 中区分 ajax 请求和完整请求

mysql - NoSQL 数据库还是 SQL?

ajax - JSF 2.0 : ajax request when press ENTER

java - 排查 AWS Redshift 上的 COPY 错误