Java-使用SQLite从列中选择某些行

时间:2015-04-13 15:32:00

标签: java sqlite jdbc

如果标题不准确,请注意。 我正在使用自定义类从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 ); 

3 个答案:

答案 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+";");