从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连接器连接到db。
请帮助我。
亲切的问候, 卡尔斯
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
答案 0 :(得分:0)
不要在bean的getter中执行数据库操作。在bean的构造函数中执行它。这些症状表明你有一个List
属性并且正在getter而不是构造函数中填充它。在bean的生命中可以多次调用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
块中正确关闭。它对资源泄漏很敏感。我建议让自己通过this article来学习如何正确地完成JDBC的工作。