【问题标题】:Is there anyway to insert data to table with 2 different foreign keys from 2 different tables?无论如何,是否可以使用来自 2 个不同表的 2 个不同外键向表中插入数据?
【发布时间】:2019-08-14 19:28:22
【问题描述】:

将数据从 jsp 插入数据库时​​遇到问题。我有 3 张桌子:

Books(bookid)、Users(id)、Review(b_id,u_id)、外键 b_id、u_id 引用上面的 2 个表。到目前为止,这是我的代码:

java

public void insert(ReviewModel model) {
    try {
        String b_id = null;
        String u_id = null;
        String sql = "insert into review (content,datePost,rating,b_id,u_id)\n"
                + "values (?,?,?,(select BookID from Books where BookID = '" + b_id + "'),(select id from Users where id  = '" + u_id + "') )";
        PreparedStatement statement = connection.prepareCall(sql);
        statement.setString(1, model.getContent());
        statement.setDate(2, (Date) (model.getDatePost()));
        statement.setFloat(3, model.getRating());
        statement.setInt(4, model.getBookid());
        statement.setInt(5, model.getUserid());
        statement.executeUpdate();
    } catch (SQLException ex) {
        Logger.getLogger(ReviewDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
}

【问题讨论】:

  • 您是否尝试过使用事务?获取连接,将自动提交设置为 false,进行多次插入,调用 commit()。在打开数据库连接、准备语句或获取结果集(查找)时也要使用 try-with-resources,以避免数据库资源泄漏。
  • 您的查询中只有 3 个问号。但是你传递了 5 个参数。下次,不要说“我有麻烦”,而是发布异常的准确和完整的堆栈跟踪。错误消息应该被读取,而不是被忽略。它们会告诉您问题所在以及问题所在,因此您无需猜测。

标签: java database jsp servlets prepared-statement


【解决方案1】:

问题出在这里:

"...where BookID = '" + b_id + "')..."

statement.setInt(4, model.getBookid());
statement.setInt(5, model.getUserid());

设置参数的数量和问号必须匹配。 您尝试将其绑定为命名参数,但是在您的 sql 中,您只需将一个空字符串连接到它。 所以要么删除上面的参数设置器行并填写字符串变量,如

String b_id=mode.getBookId()

或使用“?”的占位符:... where BookID = ? ...

(使用后一种,第一种容易被sql注入)

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多