Java 检查数据库中的用户是否被禁止使用JDBC

Java 检查数据库中的用户是否被禁止使用JDBC,java,oracle,jdbc,Java,Oracle,Jdbc,使用oracle数据库,我需要执行一项检查,以查看“用户”表中的用户是否被禁止。如果该用户的列“禁止”的值为“1”,则该用户被禁止;如果该用户的列“禁止”的值为“0”,则该用户被禁止 我在这里有以下工作代码: public boolean banUser(String username) {//TODO check if user is banned already try { pstmnt = conn.prepareState

使用oracle数据库,我需要执行一项检查,以查看“用户”表中的用户是否被禁止。如果该用户的列“禁止”的值为“1”,则该用户被禁止;如果该用户的列“禁止”的值为“0”,则该用户被禁止

我在这里有以下工作代码:

public boolean banUser(String username)
    {//TODO check if user is banned already
        try 
        {
            pstmnt = conn.prepareStatement("UPDATE users SET banned = 1 WHERE username = ?");
            pstmnt.setString(1, username);
            pstmnt.execute();
            logger.info("Banned User : " + username);
            return true;
        } catch ( SQLException e ) { e.getMessage(); }
        return false;
    }

我不知道如何在准备好的语句之上执行if语句。有什么想法吗?

使用此查询,并将结果存储在
ResultSet

SELECT * FROM users WHERE username = ? AND banned = 1
这将返回具有特定用户名的所有被禁止用户

pstmnt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND banned = 1");
pstmnt.setString(1, username);
ResultSet rs = pstmnt.executeQuery();
if(rs.next()) {
    //The user is banned
} else {
    //The user is not banned
}
如果需要方法版本:

public boolean isUserBanned(String user) throws SQLException {
    pstmnt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND banned = 1");
    pstmnt.setString(1, username);
    ResultSet rs = pstmnt.executeQuery();
    return rs.next();
}

使用此查询,并将结果存储在
ResultSet

SELECT * FROM users WHERE username = ? AND banned = 1
这将返回具有特定用户名的所有被禁止用户

pstmnt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND banned = 1");
pstmnt.setString(1, username);
ResultSet rs = pstmnt.executeQuery();
if(rs.next()) {
    //The user is banned
} else {
    //The user is not banned
}
如果需要方法版本:

public boolean isUserBanned(String user) throws SQLException {
    pstmnt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND banned = 1");
    pstmnt.setString(1, username);
    ResultSet rs = pstmnt.executeQuery();
    return rs.next();
}

更新后运行select:

    pstmnt = conn.prepareStatement("SELECT banned FROM users WHERE username = ?");
    Resultset rs = pstmnt.execute();
    pstmnt.setString(1, username);
    int isBanned = 0;
    while(rs.next()) {
        isBanned = rs.getInt(1);
    }
    if(isBanned == 1) {
        System.out.println("User is banned")
    }

更新后运行select:

    pstmnt = conn.prepareStatement("SELECT banned FROM users WHERE username = ?");
    Resultset rs = pstmnt.execute();
    pstmnt.setString(1, username);
    int isBanned = 0;
    while(rs.next()) {
        isBanned = rs.getInt(1);
    }
    if(isBanned == 1) {
        System.out.println("User is banned")
    }
重用代码:(假设用户已经存在)

重用代码:(假设用户已经存在)


将更新语句更改为:

conn.prepareStatement("UPDATE users SET banned = 1 WHERE username = ?");
致:

并使用
executeUpdate()
而不是
execute()
执行它。不同之处在于
executeUpdate
返回受更新影响的行数,因此如果用户已被禁止,则无需执行SQL语句来检索

//...
pstmnt = conn.prepareStatement("UPDATE users SET banned = 1 WHERE username = ? and banned = 0");
pstmnt.setString(1, username);
int affectedRows = pstmnt.executeUpdate();
boolean wasUserBanned = affectedRows > 0;
//...

将更新语句更改为:

conn.prepareStatement("UPDATE users SET banned = 1 WHERE username = ?");
致:

并使用
executeUpdate()
而不是
execute()
执行它。不同之处在于
executeUpdate
返回受更新影响的行数,因此如果用户已被禁止,则无需执行SQL语句来检索

//...
pstmnt = conn.prepareStatement("UPDATE users SET banned = 1 WHERE username = ? and banned = 0");
pstmnt.setString(1, username);
int affectedRows = pstmnt.executeUpdate();
boolean wasUserBanned = affectedRows > 0;
//...

这是我对@backslax版本的修改,假设
username
有一个唯一的约束:

pstmnt = conn.prepareStatement(
    "SELECT COUNT(*) FROM users WHERE username = ? AND banned = 1");
pstmnt.setString(1, username);
ResultSet rs = pstmnt.executeQuery();  // Always returns exactly one row.
rs.next();
return rs.getBoolean(1);               // Converts 0, 1 to false, true.
您可以让数据库用它来做更多的工作

CREATE VIEW BANNED_USERS AS
    SELECT username FROM USERS
    WHERE banned = 1;

这是我对@backslax版本的修改,假设
username
有一个唯一的约束:

pstmnt = conn.prepareStatement(
    "SELECT COUNT(*) FROM users WHERE username = ? AND banned = 1");
pstmnt.setString(1, username);
ResultSet rs = pstmnt.executeQuery();  // Always returns exactly one row.
rs.next();
return rs.getBoolean(1);               // Converts 0, 1 to false, true.
您可以让数据库用它来做更多的工作

CREATE VIEW BANNED_USERS AS
    SELECT username FROM USERS
    WHERE banned = 1;


此代码不检查用户是否被禁止,此代码正在创建禁止。要进行检查,根据您的设计,您有几个选项。您可以在
SELECT
语句中添加类似
WHERE banked=0
的内容,以筛选出被禁止的用户,您可以返回被禁止的用户并检查代码中的值,等等。为什么不能启动一个select查询
select banked WHERE username=?
并查看是否得到结果?您的工作代码会更新一个用户行以禁止他或她。你需要做一个选择和测试被禁止列做检查或测试。投票关闭“不是一个真正的问题”。问题标题/文本和代码相互矛盾,OP未更正或回答任何查询。此代码未检查用户是否被禁止,此代码正在创建禁止。要进行检查,根据您的设计,您有几个选项。您可以在
SELECT
语句中添加类似
WHERE banked=0
的内容,以筛选出被禁止的用户,您可以返回被禁止的用户并检查代码中的值,等等。为什么不能启动一个select查询
select banked WHERE username=?
并查看是否得到结果?您的工作代码会更新一个用户行以禁止他或她。你需要做一个选择和测试被禁止列做检查或测试。投票关闭“不是一个真正的问题”。问题标题/文本和代码相互矛盾,OP没有更正或回答任何查询。我需要执行检查,以查看我的“用户”表中的用户是否被禁止,OP是否希望使用其他方法检查给定用户是否被禁止,他不想在执行更新时检查有多少用户被禁止有时你需要了解他的真实意图并提供更好的解决方案,对吗?这不会最终禁止任何当前未被禁止的用户吗?@MarlonBernardes是的,但我很确定这不是真正的意图,他有一个用户,他想检查它是否被禁止,不需要更新我用反斜杠-我不认为这是他的意图。我认为这个问题令人困惑,因为更新代码已经发布,但我认为他只是想在允许他们访问该网站之前检查用户名是否被禁止。我需要执行一项检查,以查看我的“用户”表中的用户是否被禁止,OP是否需要另一种方法来检查给定用户是否被禁止,他不想在执行更新时检查有多少用户被禁止有时你需要了解他的真实意图并提供更好的解决方案,对吗?这不会最终禁止任何当前未被禁止的用户吗?@MarlonBernardes是的,但我很确定这不是真正的意图,他有一个用户,他想检查它是否被禁止,不需要更新我用反斜杠-我不认为这是他的意图。我认为这个问题令人困惑,因为更新代码已经发布,但我认为他只是想在允许他们访问网站之前检查用户名是否被禁止。如果
user
列有
UNIQUE
PRIMARY KEY
约束,那么
选择COUNT(*)
选择*
更好。并且,
ResultSet.getBoolean(int)
将0和1转换为
false
true
。看见也许海报应该创建一个
禁止的用户视图
?您可以删除
if
s,只需使用
rs.next();返回rs.getBoolean(1)在结尾。@EricJablow否。如果用户未被禁止,我的查询将不返回任何内容,因此
rs.getBoolean(1)
将在这种情况下生成一个异常。使用
COUNT(*)
,它将在任何情况下只返回一行。如果
user
列具有
UNIQUE
主键
约束,然后
SELECT COUNT(*)
将比
SELECT*
更好。并且,
ResultSet.getBoolean(int)
将0和1转换为
false
true
。看见也许海报应该创建一个
禁止的\u用户视图
?您可以删除
i