我现在开始使用java.sql包,我正在用它做一些实验。
我有这两个表
第一个是:
`user` (
`userID` INT NOT NULL AUTO_INCREMENT ,
`nickname` VARCHAR(20) NULL ,
PRIMARY KEY (`userID`) )
,第二个是:
`club` (
`clubID` INT NOT NULL AUTO_INCREMENT ,
'clubName` VARCHAR(20) NOT NULL ,
`userID` INT NULL ,
PRIMARY KEY (`clubID`) ,...
其中userID是与第一个表的userID关联的外键。
这是应该解释我想要做什么的代码。 (这仅适用于一个用户俱乐部)
Class.forName("com.mysql.jdbc.Driver");
this.connect = DriverManager.getConnection("jdbc:mysql://localhost/" + this.database + "?user=" + this.user + "&password=" + this.password);
String s;
s = ("insert into " + this.database + ".user (nickname) values (?)");
this.preparedStatement = this.connect.prepareStatement(s);
this.preparedStatement.setString(1, "username");
this.preparedStatement.executeUpdate();
s = ("SELECT userID from " + this.database + ".user where nickname = 'username'");
this.preparedStatement = this.connect.prepareStatement(s);
this.resultSet = this.preparedStatement.executeQuery();
int n=0;
while (resultSet.next())
{
n = this.resultSet.getInt("userID");
}
s = ("insert into " + this.database + ".club (clubName, userID) values (?, ?)");
this.preparedStatement = this.connect.prepareStatement(s);
this.preparedStatement.setString(1, "club");
this.preparedStatement.setInt(2, n);
this.preparedStatement.executeUpdate();
如果我要为更多情侣(用户名,俱乐部名称)执行此过程,例如保存在HashMap中,我怎么能使用preparedStatement Inteface的addBatch()方法?
我应该使用三个批次进行eache操作: 1插入用户名 2选择(和记录)userID 3插入与正确的用户ID关联的clubname
或者我可以只在一个批次中包含所有过程??
另一个问题,为什么如果我尝试删除围绕resultSet.getInt()方法的while循环,它会给我一个错误?
提前感谢所有愿意帮助我的人!
答案 0 :(得分:2)
您不能仅在一个批次中包含所有流程。该批处理用于单个查询。这是一个很好的例子reference link。
您可以按不同批次执行多个查询。
try {
DataSource dataSource = null;// specify data source
Connection con = dataSource.getConnection();
Statement s = con.createStatement();
// or
// PreparedStatement s =
// con.prepareStatement("INSERT INTO profile (fullname) VALUES ('Visruth CV')");
s.addBatch("INSERT INTO tran1 (username, password, profileid) VALUES ('visruth', 'password', 1)");
s.addBatch("INSERT INTO testtab (name) VALUES ('testtab')");
s.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}
如果删除while (resultSet.next())
循环,它将产生 NullPointerException ,因为resultSet
中光标的当前位置在默认行中,当您进行{ {1}}如果有可用行(从默认行到第一行,第一行到第二行等等),光标将跳转到下一行,同时resultSet.next()
将返回true(仅当它跳转时)否则为false。如果resultSet.next()
包含多行,则可以将其置于 while循环中,如果不是只需要使用 if condition 那么。