【问题标题】:Database insertion数据库插入
【发布时间】:2012-07-11 20:50:30
【问题描述】:
if(lines.size() >= 5){
    String Actor  = it.next();
    String Bio = it.next();
    String More_Bio = it.next();
    String Reason = it.next();
    String Fact = it.next(); 

    if ( it.hasNext()== true &&it.next().startsWith("Actor : ") )
    {


         // for quotes

      Actor = Actor.replace("'", "''");
         // remove comment
      Actor = Actor.replace("Actor:  ", " ");

         System.out.println(Actor);


    }

    if ( it.hasNext()== true &&it.next().startsWith("Bio: ") )
    {

      Bio = Bio.replace("'", "''");
      Bio = Bio.replace("Bio:  ", "");
      System.out.println(Bio);

    }

     if (it.hasNext()== true &&it.next().startsWith("More_Bio: "))
    { 
    More_Bio = More_Bio.replace("'", "''");
    More_Bio = More_Bio.replace("More_Bio:  ", "");
    System.out.println(More_Bio);

    }
     if (it.hasNext()== true &&it.next().startsWith("Reason: ") )
    { 
    Reason = Reason.replace("'", "''");
    Reason = Reason.replace("Reason:  ", "");
    System.out.println(Reason);

    }
    if (it.hasNext()== true &&it.next().startsWith("Fact: ") )
    { 
   Fact =Fact.replace("'", "''");
   Fact =Fact.replace("Fact:  ", "");
    System.out.println(Fact);

    }

    Statement statement = con.createStatement();
    statement.executeUpdate("INSERT INTO Tiffany (Actor, Bio, More_Bio, Reason,Fact) values('"+Actor+"','"+Bio+"','"+More_Bio+"','"+Reason+"','"+Fact+"')");

从中读取的文件 演员:扎克·埃夫隆

简历:他出生于加利福尼亚州的圣路易斯奥比斯波,并在附近的阿罗约格兰德长大,在客串了几集“夏日之地”(2004 年)之后,他加入了常规演员阵容,饰演疯狂的女孩卡梅隆贝尔。 Efron 还出演了几部试播集,例如 Carl Laemke 的广阔世界 (2003) (TV) 和 Triple Play (2004) (TV)。

More_Bio : Efron 于 2006 年 6 月毕业于 Arroyo Grande 高中。Efron 最喜欢的运动包括高尔夫、滑雪、攀岩和单板滑雪。在为“Summerland”在海滩上度过了几天之后,他最近增加了冲浪。

原因:自从我第一次在“高中音乐剧”和“发胶”中看到他以来,我就迷上了这位漂亮、漂亮、有才华的演员,现在他更火了。他是好莱坞的当红王子。

事实:Zac 最珍贵的财产是他的亲笔签名棒球收藏,他是旧金山巨人队的忠实粉丝。

演员:泰勒·洛特纳

简历:Taylor Daniel Lautner 出生在密歇根州的大急流城,父母是 Deborah 和 Daniel Lautner。他和妹妹 Makena 在密歇根州哈德逊维尔的一个彬彬有礼的罗马天主教家庭中长大。

More_Bio : 然而,除了对武术的热爱之外,泰勒在 7 岁时很快就对表演产生了热爱,当时从事演艺界的武术教练鼓励他去试镜。出现在汉堡王的广告中。

原因:这是一个大块头的青少年偶像!我爱他作为“暮光之城”系列中的雅各布·布莱克!他是我见过的最好看的人之一。当我给他发推文时,我非常兴奋,他回复了一次!

事实:他在高中一年级和二年级时踢足球。他有德国、法国、荷兰和美洲原住民(特别是渥太华和波塔瓦托米)血统。我的天啊!我们都喜欢莱昂国王乐队。

我正在尝试将上面的文件放入数据库。但这是我运行时遇到的错误。

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's favorite sports include golf, skiing, rock climbing, and snowboarding. 

He rece' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.Util.getInstance(Util.java:381)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485)
    at TiffanyWriter.main(TiffanyWriter.java:109)

【问题讨论】:

  • 尝试打印出您发送到 mysql 的内容并手动校对。

标签: java database jdbc


【解决方案1】:

您应该使用PreparedStatement,主要是因为它可以防止SQL injection attacks。 @John Moses 已从 Java 官方文档中发布了使用 PreparedStatement 的教程,这是另一个很好的链接:MySQL and Java JDBC - Tutorial

将您的代码移动到 PreparedStatement,应该是这样的:

PreparedStatement ps = con.prepareStatement("INSERT INTO Tiffany(Actor, Bio, More_Bio, Reason, Fact) VALUES (?, ?, ?, ?, ?) ");
ps.setString(1, Actor);
ps.setString(2, Bio);
ps.setString(3, More_Bio);
ps.setString(4, Reason);
ps.setString(5, Fact);
ps.executeUpdate();

使用资源后别忘了关闭资源:

ps.close();
con.close();

【讨论】:

    【解决方案2】:

    您需要转义单引号。幸运的是,Java 使用 PreparedStatements http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

    解决了这个问题

    【讨论】:

    • 嗨,我试过了,但我仍然遇到同样的错误。 String sql = "INSERT INTO Tiffany (Actor, Bio, More_Bio, Reason,Fact) values('"+Actor+"','"+Bio+"','"+More_Bio+"','"+Reason+"','" +事实+"')"; PreparedStatement 语句 = con.prepareStatement(sql); statement.executeUpdate();
    • String sql = "INSERT INTO Tiffany (Actor, Bio, More_Bio, Reason,Fact) values('?','?','?','?','?')"; PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, 演员); ps.setString(2, 生物); ...
    • @JohnMoses 请不要在 cmets 中添加一堆代码,因为很难阅读,最好添加一条评论说“我已经更新了我的答案”或类似的内容。
    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2014-05-29
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多