我正在使用FilteredRowSet编写示例,我正在尝试运行查询,然后使用Predicate对象过滤结果。
这是我的代码:
import javax.sql.rowset.FilteredRowSet;
import oracle.jdbc.rowset.OracleFilteredRowSet;
public class Example {
public static void main(String[] args) throws SQLException,
IOException {
try (FilteredRowSet rs = new OracleFilteredRowSet();) {
rs.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
rs.setUsername("dbuser");
rs.setPassword("dbpassword");
rs.setCommand("select * from employees");
rs.execute();
String name[] = {"user1", "user2"};
rs.setFilter(new UserFilter("lastname", name));
while(rs.next()){
String lname= rs.getString("lastName");
System.out.println(lname);
}
}
}
}
这是我的Predicate类:
import javax.sql.RowSet; import javax.sql.rowset.Predicate;
public class UserFilter implements Predicate {
private String[] names;
private String colName = null;
public UserFilter(String colName, String[] names) {
this.names = names;
this.colName = colName;
}
@Override
public boolean evaluate(RowSet arg0) {
return false;
}
@Override
public boolean evaluate(Object arg0, int arg1) throws SQLException {
return false;
}
@Override
public boolean evaluate(Object valueArg, String colNameArg) throws SQLException {
if (colNameArg.equalsIgnoreCase(this.colName)) {
for (int i = 0; i < this.names.length; i++) {
if (this.names[i].equalsIgnoreCase((String) valueArg)) {
return true;
}
}
}
return false;
}
}
在我的数据库表employees
中,我的lastName
值为user1
和user2
,但是当我按照我的问题所示应用过滤器时,我没有得到任何输出。我的意思是代码没有进入while循环。
您能告诉我如何应用滤镜吗?我希望输出包含lastName
包含user1
或user2
答案 0 :(得分:0)
你必须实现
的逻辑public boolean evaluate(RowSet arg0);
作为最佳做法,您的过滤器应实施3 evaluate()
方法。
为了避免这三种方法中的代码冗余,您可以创建一个私有帮助器方法,该方法包含将col / row值与过滤器中的值进行比较的实际逻辑,并具有3 evaluate()
个方法叫它。例如,at this filter看起来不会使代码逻辑分解。