【问题标题】:Java JDBC Prepared Statement not inserting single quotes (SQL Escaping)Java JDBC Prepared Statement 未插入单引号(SQL 转义)
【发布时间】:2015-11-10 20:27:05
【问题描述】:

我有以下方法将一个人存入数据库,后来用来创建一个人对象:

public static void addPerson(String personCode, String firstName, String lastName, 
        String phoneNo, String street, String city, String state, 
        String zip, String country) {
    Connection conn = database.com.airamerica.interfaces.DatabaseConnect.getConnection();
    PreparedStatement ps;
    ResultSet rs;
    String addAddressQuery = "INSERT INTO `Addresses` (`street`,`city`,`state`,`zip`,`country`) VALUES (?,?,?,?,?)";
    String checkAddress = "SELECT `address_ID` FROM `Addresses` WHERE street = ? AND city = ? AND state = ? AND zip = ? AND country = ?";
    String addPersonQuery = "INSERT INTO `Persons` (`personCode`,`firstName`,`lastName`,`address_ID`,`phoneNumber`) VALUES (?,?,?,(SELECT `address_ID` FROM `Addresses` WHERE street = ? AND city = ? AND state = ? AND zip = ? AND country = ?),?)";
    try
    {
        ps = conn.prepareStatement(checkAddress);
        ps.setString(1, street);
        ps.setString(2, city);
        ps.setString(3, state);
        ps.setString(4, zip);
        ps.setString(5, country);
        rs = ps.executeQuery();
        if(!(rs.next())){
            ps = conn.prepareStatement(addAddressQuery);
            ps.setString(1, street);
            ps.setString(2, city);
            ps.setString(3, state);
            ps.setString(4, zip);
            ps.setString(5, country);
            ps.executeUpdate();
            ps.close();
        }
        ps.close();
        rs.close();
        ps = conn.prepareStatement(addPersonQuery);
        ps.setString(1, personCode);
        ps.setString(2, firstName);
        ps.setString(3, lastName);
        ps.setString(4, street);
        ps.setString(5, city);
        ps.setString(6, state);
        ps.setString(7, zip);
        ps.setString(8, country);
        ps.setString(9, phoneNo);
        ps.executeUpdate();
        ps.close();
        conn.close();
    }
    catch (SQLException e)
    {
        System.out.println("SQLException: ");
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

问题是当我们插入像Miles O'Brien 这样的名称时,它会以Miles O'Brien 的形式插入,我尝试使用一种方法将单引号(撇号)替换为其中两个('')以进行转义。该方法只是导致数据以Miles O''Brien 的形式插入。我们如何解决这个问题?问题在于ps.setString(3, lastName); 我们如何在不以' 形式输入的情况下将姓氏输入数据库?

以防万一您需要它,引擎是 InnoDB,我们使用默认的 UTF8 作为排序规则。

如您所见,姓氏也被传递给方法。

【问题讨论】:

  • 在我看来,这更像是您的应用程序的 Web 层而不是数据库层的问题。你确定你的addPerson 方法是在lastName 设置为O'Brien 而不是O'Brien 的情况下被调用的吗?我怀疑情况并非如此,并且您的 Web 层(您没有提供详细信息)正在执行不需要的 O'BrienO'Brien 转换,而不是数据库。我假设你有一个 web 层,因为我看不出 HTML 实体还会来自哪里。
  • 我们没有 web 层,这都是一个控制台应用程序,我们所有的显示几乎只是我们导出的 xml 或文本文件。这是一个学校项目,但我们被困在这一点上。传递给方法的名称是 O'Brien,当我们单步执行应用程序时,准备好的语句确实说 O'Brien,但数据库显示 O'Brien

标签: java


【解决方案1】:

GIGO

一个单步调试器和一个放置良好的断点或以下内容会告诉你这与 JDBC 完全无关。

步进调试器是检查运行代码的首选方式!

public static void addPerson(final String personCode, final String firstName, final String lastName, 
                             final String phoneNo, final String street, final String city, final String state, 
                             final String zip, final String country) {

        System.out.println(String.format("Last Name = %s",lastName));

        // the rest of your code
}

【讨论】:

  • 当我这样做时,lastName 在控制台中显示为 O'Brien,但在数据库中显示为 O'Brien
  • 什么控制台?如果这是来自某些单元测试或其他无效的内容,您需要将其放在服务器的日志中以了解实际发生的情况。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多