JSP解决保存字符串含英文一撇(')到数据库的问题。

问题描述:

“描述”表单字段如果输入含英文一撇(')的字符串(如“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;
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章