当前位置: 首页 > 知识库问答 >
问题:

JDBC异常处理:警告抑制

钮兴安
2023-03-14

我目前正在学习一些基本的java SQL编码,为我的SQL项目制作一个基本的终端UI。我一直在使用PostgreSQL

我使用PreparedStatement来确保自己不受SQL注入的影响,与其说抱歉,不如说安全PreparedStatement似乎总是出于某种原因发出警告,我认为这是异常的一个子类(应该会被异常捕获)。

在我的SQL触发器和函数中,我创建并测试了应该触发异常的情况,它们都得到了正确的catch block并正常工作。

我想使用@superswarnings让编译器知道我想抑制我的警告,但我可能想在catch块中捕捉一些警告,所以我可能在寻找不同的解决方案。

问题是:

  1. 我想把我的指纹放在试块里,没有例外
  2. 在执行preparedStmt之后,可以做些什么来获得我的打印。try块中的executeQuery
  3. 在处理这样的异常处理时,使用@SuppressWarnings通常被认为是良好的编码实践吗
  4. 如果我对preparedStatement的理解不正确。executeQuery()总是发出警告,在SQL语言中,什么是警告

我的代码

void registerStudent(Connection conn, String toBeInserted, String insertedTo)
throws SQLException{
    ResultSet res;
    String query = "INSERT INTO Registrations VALUES (?, ?)";

    PreparedStatement ps = conn.prepareStatement(query);
    ps.setString(1, toBeInserted);
    ps.setString(2, insertedTo);

    try {
        ps.executeQuery();                        

    }catch (SQLException e) {

        SQLWarning warning = ps.getWarnings();
        if (warning != null){

        System.out.println("Yay,  insert succeeded!
    values: "+ toBeInserted +" were inserted into 
    "+insertedTo);

        }else {
            System.out.println("Nothing inserted, here goes the big exception SQL fired for ya'll: " 
         + e.getMessage());
        }
    }
  }

共有2个答案

缪晋
2023-03-14

非常感谢,我知道我真的不应该回复你的帖子,但这对我帮助很大。我想我对ps.executeQuery()和ps.executeUpdate()方法感到困惑。

executeQuery()生成了一个警告,因为没有返回任何内容,尽管它确实可以使用该方法执行对数据库的更新。

其他的技巧和窍门我也会忍受。

金阳曜
2023-03-14

仍然存在一些缺陷。我还添加了一个自动递增主键的例子——插入主键后可以检索它。

缺陷:

  • 列出要插入的字段,以便以后在数据库中添加列不会导致问题,并且列的顺序在代码中是明确的

所以:

/**
 * @return the generated primary key, the Student ID.
 */
int registerStudent(Connection conn, String toBeInserted, String insertedTo)
        throws SQLException {
    String query = "INSERT INTO Registrations(ToBeInserted, InsertedInto) VALUES(?, ?)";

    try (PreparedStatement ps = conn.prepareStatement(query),
            Statement.RETURN_GENERATED_KEYS) {
        ps.setString(1, toBeInserted);
        ps.setString(2, insertedTo);
        int updateCount = ps.executeUpdate();                        
        if (updateCount == 1) {
            try (ResultSet rs = ps.getGeneratedKeys()) {
                if (rs.next()) {
                    int id = rs.getInt(1);
                    return id;
                }
            }
            throw new SQLException("No primary key generated");
        } else {
            SQLWarning warning = ps.getWarnings();
            Logger.getLogger(Xyz.class.getName()).info("Not added, values: "
                + toBeInserted + " were not inserted into "+ insertedTo + ": " + warning);
            throw new SQLException("Not added");
        }
    }
}
 类似资料:
  • 本文档介绍 DM 中各主要告警信息的处理方法。 高可用告警 DM_worker_offline 存在离线的 DM-worker 超过一小时会触发该告警。在高可用架构下,该告警可能不会直接中断任务,但是会提升任务中断的风险。处理告警可以查看对应 DM-worker 节点的工作状态,检查是否连通,并通过日志排查错误。 DM_DDL_error 处理 shard DDL 时出现错误,此时需要参考 DM

  • 问题内容: 每次我都会收到警告: 抑制它的最佳方法是什么?所有软件包都是最新的。 Conf: OSX带有Brew Python 2.7.10(默认,2015年7月13日,12:05:58),pandas == 0.17.0和matplotlib == 1.5.0 问题答案: 您可以禁止所有警告:

  • 我最近开始尝试llvm的< code>clang-tidy工具。现在我正试图抑制来自第三方库代码的错误警告。为此,我想使用命令行选项

  • 问题内容: 我的pip版本已关闭-每个pip命令都说: 而且我不喜欢这里给出的答案:如何摆脱从pip升级的警告?因为他们都希望与RH版本不同步。 因此,我尝试使用此VagrantFile安装干净的系统: 但是后来我得到了: 因此,似乎我使用了错误的命令进行安装。使用正确的命令是什么? 问题答案: 创建一个pip配置文件并设置为true 在许多linux上,pip配置文件的默认位置是。Windows

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请

  • 问题内容: 当我运行程序时,Pandas每次都会发出如下“未来警告”。 我得到了味精,但我只是想一次又一次地停止Pandas显示此类味精,是否可以设置任何buildin参数以使Pandas不会弹出“未来警告”? 问题答案: 在github上发现了这个…