使用Java将值插入MySQL中的单个列

时间:2014-06-30 17:21:20

标签: java mysql sql

我是新手程序员,以下是我的代码的一部分,用于将数据插入名称为 book_details 的数据库中。

 try{
  //STEP 2: Register JDBC driver
  Class.forName("com.mysql.jdbc.Driver");

  //STEP 3: Open a connection
  System.out.println("Connecting to database...");
  conn = DriverManager.getConnection(DB_URL,USER,PASS);

  //STEP 4: Execute a query
  System.out.println("Creating statement...");
  stmt = conn.createStatement();
  String sql;
  sql = "INSERT INTO issue_details VALUES("+BookIDvar+",'"+StudentIDvar+"','"+StudentNamevar+"')";
  stmt.executeUpdate(sql);
  sql = "INSERT INTO book_details (book_status) VALUES ('notavailable') WHERE book_id = "+BookIDvar+"";
// there are 4 fields in the database. I wish to insert the string 'notavailable' into the 4th field which is named book_status for a particular BookID
  stmt.executeUpdate(sql);
  //STEP 6: Clean-up environment

  stmt.close();
  conn.close();
 }catch(SQLException se){
  //Handle errors for JDBC
  se.printStackTrace();
 }catch(Exception e){
  //Handle errors for Class.forName
  e.printStackTrace();
 }finally{
  //finally block used to close resources
  try{
     if(stmt!=null)
        stmt.close();
  }catch(SQLException se2){
  }// nothing we can do
  try{
     if(conn!=null)
        conn.close();
  }catch(SQLException se){
     se.printStackTrace();
  }//end finally try
 }

在这里,我打算更新可用但不可用的图书馆书籍的状态。由于其他一些原因,我更喜欢非布尔值。

执行后, book_details 数据库未更新。它也会出错

MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server

Sql语句有问题还是别的什么?其他位置的同一数据库上的其他操作工作正常。

2 个答案:

答案 0 :(得分:4)

这种SQL语法错误:

INSERT INTO <table> VALUES <values> [WHERE <whatever>]

您无法在WHERE中添加INSERT

WHERE中添加INSERT语句的唯一情况是从SELECT语句的结果中插入数据,而WHERESELECT的一部分{1}}。例如:

INSERT INTO <table> [SELECT <columns> FROM <tables> WHERE <conditions>]

在此表单中,SELECT中获取的列必须与要在表中插入的值匹配。

您希望更新图书的状态。您应该使用UPDATE语句而不是INSERT

UPDATE <table> SET (<column> = <value>) (supports multiple columns) WHERE <conditions>

将此应用于您的上下文,语句应为:

UPDATE book_details SET book_status = 'notavailable' WHERE book_id = ?

此外,由于这是 all或nothing 事务,因此如果所有语句都成功执行,则应打开事务并提交,否则执行回滚。您可以这样做:

try {
    conn.setAutoCommit(false);
    //perform the DML statements
    //...
    //commit the transaction
    conn.commit();
} catch (Exception e) {
    //in case of error, rollback the transaction
    conn.rollback();
    //notify the error
    e.printStacktrace();
} finally {
    //ALWAYS close the connection here
    //handle the exceptions and such
    conn.close();
}

请注意,当您需要将参数传递给SQL语句时,应使用PreparedStatement而不是Statement,因为连接查询可能会导致SQL Injection attacks。代码应如下所示:

sql = "INSERT INTO issue_details VALUES(?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, BookIDvar);
pstmt.setString(2, StudentIDvar);
pstmt.setString(3, StudentNamevar);
pstmt.executeUpdate();
//similar for other SQL statements

更多信息:

答案 1 :(得分:3)

正如Luggi所说,这是不正确的。

update book_details set book_status = 'notavailable' where book_id = bookIDvar;

假设它已经存在于表中。

如果没有,

insert into book_details (book_id, book_status) values (bookIDvar, 'notavailable');