【发布时间】: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'Brien到O'Brien转换,而不是数据库。我假设你有一个 web 层,因为我看不出 HTML 实体还会来自哪里。 -
我们没有 web 层,这都是一个控制台应用程序,我们所有的显示几乎只是我们导出的 xml 或文本文件。这是一个学校项目,但我们被困在这一点上。传递给方法的名称是 O'Brien,当我们单步执行应用程序时,准备好的语句确实说 O'Brien,但数据库显示 O'Brien
标签: java