问题描述:
“描述”表单字段如果输入含英文一撇(')的字符串(如“param's num.”),则保存时MyEclipse报错(提示:'?' 附近有语法错误。)。并且保存不了。
因为之前用C# MVC开发,使用的是LINQ TO SQL,没有留意这样的问题。(如一网友所说“微软的数据访问技术LINQ向.net开发人员提供了彻底地清除SQL注入漏洞的机会”,哈。。)
现状描述:查看执行保存的servlet方法,使用的是Statement。
网上查,找到了PreparedStatement(https://www.cnblogs.com/huangwentian/p/7051109.html)。
参照以下网址(https://blog.csdn.net/weixin_42166907/article/details/81277282)做了测试,可以保存了。
说明:我只将保存为字符串的字段通过传参方式传给需要调用的、保存数据的方法。
保存数据的方法代码如下:
public int execUpdate_private(String sql,String p1,String p2,String p3,String p4) {
Connection con = null;
PreparedStatement psmt = null;
try {
con = getCon();
//获得预处理对象
psmt = con.prepareStatement(sql);
psmt.setQueryTimeout(20); // set timeout to 20 sec.
//设置实际参数
psmt.setString(1, p1);
psmt.setString(2, p2);
psmt.setString(3, p3);
psmt.setString(4, p4);
return psmt.executeUpdate();} catch (Exception e) {
e.printStackTrace();} finally {
try {
if( psmt != null ) {
psmt.close();
psmt = null;
}
if( con != null ) {
con.close();
con = null;
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return -1;
}
以上已经可以实现我这个页面的(含'的)数据的保存。但如何封装成一个通用的方法?因为不同的页面可能需要保存的字符型字段的个数不一样。那以上这个方法的参数个数是不定的。如何定义?
找到以下文章(https://blog.csdn.net/never_tears/article/details/78027823)得到启示。于是完善为如下方法:
public int execUpdate_private(String sql,String... param) {
Connection con = null;
PreparedStatement psmt = null;
try {
con = getCon();
//获得预处理对象
psmt = con.prepareStatement(sql);
psmt.setQueryTimeout(20); // set timeout to 20 sec.
//设置实际参数
int length = param.length;
for(int i=0;i<length;i++)
{
psmt.setString(i+1, param[i]);
}
return psmt.executeUpdate();} catch (Exception e) {
e.printStackTrace();} finally {
try {
if( psmt != null ) {
psmt.close();
psmt = null;
}
if( con != null ) {
con.close();
con = null;
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return -1;
}