💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 65、PreparedStatement相比Statement的好处   大多数时候我们都使用PreparedStatement代替Statement   1、PreparedStatement是预编译的,比Statement速度快;   2、代码的可读性和可维护性更好   虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说,都比直接用Statement的代码高很多档次:   stmt.executeUpdate(“insert into tb_name (col1,col2,col2,col4) values (’”+var1+"’,’"+var2+"’,"+var3+",’"+var4+"’)");   perstmt = con.prepareStatement(“insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)”);   perstmt.setString(1,var1);   perstmt.setString(2,var2);   perstmt.setString(3,var3);   perstmt.setString(4,var4);   perstmt.executeUpdate();   不用多说,对于第一种方法,别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心。 - 3、安全性   PreparedStatement可以防止SQL注入攻击,而Statement却不能。比如说:   String sql = “select * from tb_name where name= '”+varname+"’ and passwd=’"+varpasswd+"’";   如果我们把[’ or ‘1’ = ‘1]作为varpasswd传入进来,用户名随意,看看会成为什么?   select * from tb_name where name = ‘随意’ and passwd = ‘’ or ‘1’ = ‘1’;   因为’1’=‘1’肯定成立,所以可以任何通过验证,更有甚者:   把[’;drop table tb_name;]作为varpasswd传入进来,则:   select * from tb_name where name = ‘随意’ and passwd = ‘’;drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行。   而如果你使用预编译语句你传入的任何内容就不会和原来的语句发生任何匹配的关系,只要全使用预编译语句你就用不着对传入的数据做任何过虑。而如果使用普通的statement,有可能要对drop等做费尽心机的判断和过虑。