将String String literal插入数据库时​​需要转义哪些特殊字符

时间:2014-11-01 15:27:13

标签: java mysql jdbc

我使用jdbc将数据插入数据库。由于某些原因,我不能使用PreparedStatement,我必须直接执行查询。我有什么特殊的角色可以逃脱?我只知道单引号(')和反斜杠()。

编辑:我不能使用PreparedStatement的原因是,我的应用程序从服务器接收json数据,其值始终表示为String。 例如:

{
 "tableName": "movies",
  "data": [
     "The Big Lewbowski",
     "119",
    "1998-06-03"
]
}

这意味着我现在必须将数据插入到表格电影中。 我只能将数据反序列化为List 现在,如果我使用PrepareStatement。

    String sql = "insert into movies values(?,?,?)";
    PreparedStatement ps = con.prepareStatement(sql);
    System.out.println(ps.toString());
    for (int i = 0; i < newData.size(); i++) {
        ps.setObject(i + 1, newData.get(i));
    }
    System.out.println(ps.toString());

com.mysql.jdbc.JDBC4PreparedStatement@6267c3bb: insert into movies values(** NOT SPECIFIED **,**       NOT SPECIFIED **,** NOT SPECIFIED **)
com.mysql.jdbc.JDBC4PreparedStatement@6267c3bb: insert into movies values('The Big        Lewbowski','117','1998-06-03')

正如您所看到的,它不起作用。我的电影表有不同的列类型:     电影(title varchar,runtime int,releaseDate Date); 它可以插入数据,但必须有隐式转换,对吗?

1 个答案:

答案 0 :(得分:3)

  

我无法使用PreparedStatement的原因是,我的应用程序从服务器接收json数据,其值始终表示为String

这是一个不成功的人。您应该能够从数据库中确定架构,然后确定如何适当地转换每个JSON值。除此之外,JSON中的格式可能与数据库预期的格式不同。

不要通过直接在SQL中包含值来抛弃安全性:在代码中执行转换,并将PreparedStatement与参数化值一起使用。

您接下来的任务应该是:

  • 了解如何从数据库中获取架构信息(这是标准JDBC)
  • 检查您是否知道将为每种不同类型的数据使用什么格式(特别是日期可能很痛苦),以便您可以转换它们
  • 编写批次测试 - 请注意,转换部分可以完全与JDBC隔离,并且非常可测试。