如果标题不准确,请注意。 我正在使用自定义类从SQLite数据库中获取数据。
例如: 下面的方法应该返回用户列表,这些用户是某个部门的成员。 USER表中的每个用户都有一个id为其所属部门的列。
目前我正在获取所有用户,然后将他们的部门ID与我正在寻找的部门的targetID进行比较。 有没有办法获得具有特定部门ID的用户集,这样我就不必检查每个部门的ID?
private List<User> getDepartmentMembers(int targetID) {
List<User> members = new ArrayList<User>();
Connection c = null;
Statement statement = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:TheatroData.sqlite");
c.setAutoCommit(false);
statement = c.createStatement();
ResultSet rs = statement.executeQuery( "SELECT * FROM USERS;" );
while ( rs.next() ) {
int id = rs.getInt(Constants.ID_KEY);
if (id == targetID ){
User tmp = null;
int position = rs.getInt(Constants.POSITION_KEY);
if (position == Constants.DEPARTMENT_HEAD)
tmp = new DepartmentHead();
else if (position == Constants.DEPARTMENT_MANAGER)
tmp = new DepartmentManager();
else if (position == Constants.DEPARTMENT_MEMBER);
tmp = new GruntUser();
tmp.setID(id);
tmp.setName(rs.getString(Constants.NAME_KEY));
tmp.setPosition(position);
tmp.setUsername(rs.getString(Constants.USERNAME_KEY));
tmp.setLastname(rs.getString(Constants.SURNAME_KEY));
tmp.setDepartment(targetID);
tmp.setPassword(rs.getString(Constants.PASS_KEY));
members.add(tmp);
}
}
rs.close();
statement.close();
c.close();
} catch ( Exception e ) {
System.err.println( e + " -in getDepartmentMembers" + e.getClass().getName() + ": " + e.getMessage());
}
return members;
}
我以为我需要这样的东西:
ResultSet rs = statement.executeQuery( "SELECT * FROM USERS where department = ?;", targetID );
答案 0 :(得分:1)
是的,你特意回答了自己的问题。你也可以这样做。
String query = "SELECT * FROM USERS where department = (?)";
PreparedStatement statement = c.prepareStatement(sql);
statement.setInt(1, targetId);
ResultSet rs = statement.executeQuery();
while(rs.next()){
//you get only records that have id = targetId
}
//close rs, statement and connection!!!
答案 1 :(得分:1)
在一个理想的世界里,你可以像你写的那样去做:
ResultSet rs = statement.executeQuery( "SELECT * FROM USERS WHERE department = ?;", targetID );
但是,JDBC中的executeQuery目前不提供参数绑定的可能性。所以你必须使用&#34;准备好的陈述&#34;。
而不是
statement = c.createStatement();
ResultSet rs = statement.executeQuery( "SELECT * FROM USERS;" );
做的:
prepared = c.prepareStatement("SELECT * FROM USERS WHERE department = ?;");
prepared.setString(1, targetID);
ResultSet rs = prepared.executeQuery();
当您需要多个参数时,可以使用不同的语法来替换它,例如&#34;?001&#34;。见SQLite Documentation: C/C++ Interface第5节。
同时删除您自己选择正确部门的Java编码。
由于CluelessStudent提出了一个不同的解决方案,涉及字符串连接,我想说以下内容:
我肯定会阻止字符串连接!你一直 应该使用参数绑定而不是字符串连接!串 连接是一个巨大的安全风险,因为它可以用于此 调用&#34; SQL注入攻击&#34;。见Wikipedia: SQL Injection
答案 2 :(得分:0)
我只是传递了一个错误的陈述。正确的方法:
ResultSet rs = statement.executeQuery( "SELECT * FROM USERS where department = "+targetID+";");