所以我想在数据库中添加一些东西,但它不起作用,它不会this.statement.executeUpdate(sqlQuery);
。如果我打印出sqlQuery
并在phpMyAdmin中调用它就可以了。
我有几个DB迭代,类似于此,工作得很好,但这个随机不会。
SQL QUERY:
INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date)
VALUES('The Office', 'A mockumentary on a group of typical office workers, where the workday consists of ego clashes, inappropriate behavior, and tedium. Based on the hit BBC series.', 'http://ia.media-imdb.com/images/M/MV5BMTgzNjAzMDE0NF5BMl5BanBnXkFtZTcwNTEyMzM3OA@@._V1._SY317_CR9,0,214,317_.jpg', '8.9', 'http://www.imdb.com/title/tt0386676/', 'tt0386676', '2005-06-11')
代码:
public boolean insert_tvShow(TvShow tvShow) {
boolean success = false;
String plot = tvShow.getPlot();
plot = plot.replaceAll("'", "''");
try {
this.statement = this.connection.createStatement();
String sqlQuery = String.format("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) " +
"VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s')",
tvShow.getTitle(),
plot,
tvShow.getPoster(),
tvShow.getImdb_Rating(),
tvShow.getImdb_url(),
tvShow.getImdb_id(),
tvShow.getReleaseDate());
System.out.println(sqlQuery);
this.statement.executeUpdate(sqlQuery);
success = true;
} catch(Exception e) {
} finally {
try {
connection.close();
} catch (SQLException e) {}
}
return success;
}
修改
好的,我从现在开始使用PreparedStatement。 但我仍然不会得到执行代码。由于我没有错误,我无从得知。可能一个原因是我的release_date,所以我试着让它在没有它的情况下工作。 “ps.executeUpdate();”是代码到达的地方。
public boolean insert_tvShow(TvShow tvShow) {
boolean success = false;
java.util.Date myDate = new java.util.Date("10/10/2009");
try {
String sqlString = "INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) " +
"VALUES(?, ?, ?, ?, ?, ?, ?)";
PreparedStatement ps = connection.prepareStatement(sqlString);
ps.setString(1, tvShow.getTitle());
ps.setString(2, tvShow.getPlot());
ps.setString(3, tvShow.getPoster());
ps.setDouble(4, tvShow.getImdb_Rating());
ps.setString(5, tvShow.getImdb_url());
ps.setString(6, tvShow.getImdb_id());
ps.setDate(7, new java.sql.Date(myDate.getTime()));
ps.executeUpdate();
connection.commit();
success = true;
} catch(Exception e) {
//TODO logging
} finally {
try {
connection.close();
} catch (SQLException e) {}
}
return success;
}
答案 0 :(得分:3)
您的代码非常容易受到SQL注入攻击。 如果有人进入电视节目''; drop table tvshows;'例如,您认为会发生什么?
使用参数:
PreparedStatement ps = this.connection.prepareStatement("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) VALUES(?,?,?,?,?,?,?)");
ps.setString(1, tvShow.getTitle());
ps.setString(2, tvSHow.getPlot();
//etc...
ps.executeUpdate();
答案 1 :(得分:2)
永远不要这样做:
String sqlQuery = String.format("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) " +
"VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s')",
tvShow.getTitle(),
plot,
tvShow.getPoster(),
tvShow.getImdb_Rating(),
tvShow.getImdb_url(),
tvShow.getImdb_id(),
tvShow.getReleaseDate());
替换为:
PreparedStatement statement = conn.prepareStatement("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) " +
"VALUES(?,?,?,?,?,?,?)";
statement.setString(1,"title");
//rest of setters here
statement.execute();
conn.commit();
答案 2 :(得分:1)
最有可能的问题是发布日期。数据库对于他们如何接受日期和时间非常挑剔。您不能只是将看起来像日期的字符串推送到SQL查询中。
我建议使用相应的JDBC方法,即PreparedStatement.setTimestamp,它使JDBC驱动程序能够将表示日期的Java对象转换为数据库将接受的结构。
http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setTimestamp(int,java.sql.Timestamp)
在您阅读了PrepatedStatement界面之后,我建议您研究一下SQL注入吗?
http://en.wikipedia.org/wiki/SQL_injection
由于一些评论提到了Bobby Tables,这里有一些关于Little Bobby的信息。
答案 3 :(得分:1)
使用PreparedStatement
:
String sqlQuery = "INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) VALUES(?, ?, ?, ?, ?, ?, ?)";
final PreparedStatement preparedStatement = conn.prepareStatement(sqlQuery);
preparedStatement.setString(1, tvShow.getTitle());
preparedStatement.setString(2, plot);
preparedStatement.setString(3, tvShow.getPoster());
preparedStatement.setString(4, tvShow.getImdb_Rating());
preparedStatement.setString(5, tvShow.getImdb_url());
preparedStatement.setString(6, tvShow.getImdb_id());
preparedStatement.setString(7, tvShow.getReleaseDate());
永远不要使用String
构建查询。
使用String
易受SQL Injection攻击构建的查询。它们也很容易出现String
转义问题,例如您示例中的'
。