从 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/