gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:28:39 24 4
gpt4 key购买 nike

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

最佳答案

在理想的世界中,您可以按照您所写的那样进行操作:

ResultSet rs = statement.executeQuery( "SELECT * FROM USERS WHERE department = ?;", targetID );

但是,来自 JDBC 的executeQuery 目前不提供参数绑定(bind)的可能性。所以你必须使用“Prepared statements”。

而不是

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();

当您需要多个参数时,可以使用不同的语法来替换它,例如“?001”。请参阅SQLite Documentation: C/C++ Interface第 5 节。

还可以删除您自己选择的正确部门的 Java 编码。

由于CluelessStudent提出了不同的解决方案,涉及字符串连接,我想说以下内容:

I would definitively discourage string concatenation! You always should use argument binding and not string concatenation! String concatenation is a huge security risk, since it can be used for so called "SQL injection attacks". See Wikipedia: SQL Injection

关于Java-使用 SQLite 从列中选择某些行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29609290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com