我有下面的代码,它没有在数据库上添加任何插入,但是如果我删除第二个“ myStatement.executeUpdate(insert)”,它将带我第一个插入(sqlstring)…如何运行两个插入并保存数据对于两个表???更具体地说,我需要从用户表单中获取数据并将其保存到数据库中,但这是重点…在复选框中,用户可以检查两个或更少的对象…所以如果表和表的形式可以帮助我是正确的,如果正确,我该怎么做才能采用复选框的两个值并将它们插入一个表中…
<%@page import="java.sql.*" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>create dest code</title> </head> <body> <% String id8=request.getParameter("id8"); String id9=request.getParameter("id9"); String id10=request.getParameter("id10"); String ch1=request.getParameter("dest1"); String empty= ""; boolean flag=false; if (!(id8.equals(empty) | id9.equals(empty) | id10.equals(empty) )) { try { Class.forName("com.mysql.jdbc.Driver"); String myDatabase = "jdbc:mysql://localhost:3306/project_app?user=root&password=1234"; Connection myConnection = DriverManager.getConnection(myDatabase); Statement myStatement = myConnection.createStatement(); String sqlString = "INSERT INTO dest(Country,City,URL) VALUES ('"+id8+"', '"+id9+"','"+id10+"')"; String insert= "INSERT INTO dest_has_categories(Categories_idCategories) VALUES ('"+ch1+"')"; try{ myStatement.executeUpdate(sqlString); myStatement.executeUpdate(insert); }catch(SQLException sqlException) { %> <% flag = true; } if(flag == false ){ } // Close the connection to the database myStatement.close(); myConnection.close(); }catch(Exception e){ e.printStackTrace(); } }else{ %> <% } %>
PS:您可以看到有两个不同的插入表…
html页面:
<form name="createdest" method="get" action="../jsp/create-dest-code.jsp"> Country: <input type="text" required name="id8" /> <br> City: <input type="text" required name="id9" /> <br> URL Video: <input type="url" required name="id10" /> <br> <br> <i><ins>Categorize the destination (max 2): </ins></i> <br> <br> <input type="checkbox" name="dest1" value="2" onClick="return KeepCount()" >Christmas<br> <input type="checkbox" name="dest2" value="1" onClick="return KeepCount()" >Winter <br> <input type="checkbox" name="dest3" value="3" onClick="return KeepCount()" >Summer <br> <br> <input type="submit" class="button" value="CREATE DESTINATION" /> <br> </form> <SCRIPT LANGUAGE="javascript"> function KeepCount() { var NewCount = 0; if (document.createdest.dest1.checked) {NewCount = NewCount + 1;} if (document.createdest.dest2.checked) {NewCount = NewCount + 1;} if (document.createdest.dest3.checked) {NewCount = NewCount + 1;} if (NewCount == 3) { alert('Pick Just Two Please'); document.createdest; return false; } } </SCRIPT>
mysql表:
CREATE TABLE IF NOT EXISTS `project_app`.`Dest` ( `idDest` INT NOT NULL AUTO_INCREMENT, `Country` VARCHAR(45) NULL, `City` VARCHAR(45) NULL, `URL` VARCHAR(45) NULL, PRIMARY KEY (`idDest`)) CREATE TABLE IF NOT EXISTS `project_app`.`Categories` ( `idCategories` INT NOT NULL, `Categories` VARCHAR(45) NULL, PRIMARY KEY (`idCategories`)) CREATE TABLE IF NOT EXISTS `project_app`.`Dest_has_Categories` ( `Dest_idDest` INT NOT NULL , `Categories_idCategories` INT NOT NULL, PRIMARY KEY (`Dest_idDest`, `Categories_idCategories`), INDEX `fk_Dest_has_Categories_Categories1_idx` (`Categories_idCategories` ASC), INDEX `fk_Dest_has_Categories_Dest_idx` (`Dest_idDest` ASC), CONSTRAINT `fk_Dest_has_Categories_Dest` FOREIGN KEY (`Dest_idDest`) REFERENCES `mydb`.`Dest` (`idDest`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_Dest_has_Categories_Categories1` FOREIGN KEY (`Categories_idCategories`) REFERENCES `mydb`.`Categories` (`idCategories`) ON DELETE NO ACTION ON UPDATE NO ACTION) INSERT INTO categories(idCategories,Categories) VALUES (1,'Winter'); INSERT INTO categories(idCategories,Categories) VALUES (2,'Christmas'); INSERT INTO categories(idCategories,Categories) VALUES (3,'Summer');
为您的两个插入操作创建两个不同的Statement实例。
如果要重用一个Statement实例,请在 Final 模块中关闭资源。实际上,将close语句放在 finally 块中或简单地使用jdk7 +必须提供的 try-catch-resource 总是一个好主意。
在您的第一个try块中: 在 Statement myStatement = myConnection.createStatement(); add下 Statement myStatementTwo = myConnection.createStatement();
Statement myStatement = myConnection.createStatement();
Statement myStatementTwo = myConnection.createStatement();
在你的第二个try块: 改变myStatement.executeUpdate(sqlString); 以myStatementTwo.executeUpdate(sqlString);
myStatement.executeUpdate(sqlString);
myStatementTwo.executeUpdate(sqlString);
在您的第一个try块中添加一个final块,并在那里关闭所有资源。编辑代码与从头开始重写所有内容几乎相同,如果您能自己做的话,它将对您最大的好处。
你 Dest_has_Categories 表的 Dest_idDest 是一个 AUTO_INCREMENT 列,但它也是一个外键引用 目的地 的主键 idDest 。参考表(联合表)的外键 不应 为auto_increment。如果参考表中不存在DBMS生成的自动递增值,则会出现问题。
请使外键不是auto_increment,并且当您插入参考表 Dest_has_Categories时 ,请插入现有 Categories 的ID和 Dest 的ID。
另外,更改代码时,请确保也使用我的解决方案2以获得最佳实践。